Llevarte a jugar el juego de backgammon - [lenguaje C]

Tabla de contenido

Prefacio:

1. Impresión del menú

2. Implementación de la función de juego

2.1 Inicializar el tablero de ajedrez

2.2 Mostrar el tablero de ajedrez

2.3 Los jugadores juegan al ajedrez

2.4 Ajedrez informático

2.5 Juzgar Ganar o Perder

2.6 Determinar si el tablero está lleno

3. Todo el código

3.1 juego.h

3.2 juego.c

3.3 prueba.c


Prefacio:

Para poder realizar los tres ajedrez, primero debemos escribir el código en módulos, estamos divididos en 3 partes

1. test.c — probar el juego (función principal) 2. game.c realizar parte del código del juego 3. declaración de la función game.h, definición de macro, etc.


1. Impresión del menú

Impresión del menú:

Para la comodidad de jugar, podemos configurar un menú e imprimirlo cada vez que jugamos, para facilitar al jugador la experiencia del juego. La implementación es la siguiente:

El jugador elige "1" - jugar       

El jugador selecciona "0" - sale del juego       

El jugador elige otro número: indica que la elección es incorrecta y vuelve a elegir



Implemente el número de selección para jugar:

1. ¿Cómo jugar un juego tras otro y salir del juego si no quieres jugar?

Podemos usar el bucle do-while para configurar el bucle para determinar el valor de la entrada, de modo que podamos salir del juego solo cuando la entrada sea 0


2. ¿Cómo elegir 1 para jugar el juego, elegir 0 para salir del juego y elegir otros números para indicar la elección incorrecta ?

Podemos usar la instrucción switch-case dentro del ciclo do-while


el código se muestra a continuación:


2. Implementación de la función de juego

2.1 Inicializar el tablero de ajedrez

Lo que escribimos aquí es el código de ajedrez tridimensional, tres filas y tres columnas, podemos usar una matriz bidimensional para imprimir

Podemos atravesar esta matriz bidimensional e inicializar los 9 elementos en ella a espacios

código:

void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

2.2 Mostrar el tablero de ajedrez

Dado que inicializamos cada elemento de la matriz bidimensional anterior en un espacio, si solo lo imprimimos para que el jugador juegue, la experiencia será muy mala, por lo que utilizaremos los siguientes métodos para optimizar la visualización de nuestro tablero para la comodidad del jugador Jugar

En el rectángulo azul de arriba: 

Podemos agrupar tres espacios (datos en el medio, espacios a ambos lados) y las barras verticales detrás de él en un grupo, y hay tres grupos en esta línea

Nota: nuestro último grupo no tiene una barra vertical (|), por lo que debemos controlarlo por separado

En el cuadro rectángulo amarillo de arriba:

Agrupamos tres líneas horizontales y una línea vertical en 1 grupo, y una línea también son tres grupos, y la última línea es la misma 

 Código:

Resumen: a través del análisis anterior, podemos ver que por cada línea de tablero de ajedrez impresa, en realidad tenemos dos líneas de control de formato de tablero de ajedrez, por lo que podemos considerar los cuadros azul y amarillo como un grupo, hay tres grupos en total, y el último grupo No imprimir líneas horizontales

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//1. 打印数据
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
				printf("|");
		}
		printf("\n");
		//2. 打印分割线
		if (i < row - 1)
		{
			//printf("---|---|---\n");
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j<col-1)
					printf("|");
			}
			printf("\n");
		}
	}
}

2.3 Los jugadores juegan al ajedrez

Una matriz bidimensional con tres filas y tres columnas. El rango del subíndice de la fila y la columna es de 0 a 2. Es posible que el jugador no sepa la naturaleza de la matriz, y el subíndice de la matriz puede exceder el límite. En este momento , necesitamos ingresar las coordenadas horizontales y verticales del jugador. disminuir en 1

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:\n");
	while (1)
	{
		printf("请输入下棋的坐标,中间使用空格>:");
		scanf("%d %d", &x, &y);
		//坐标合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x-1][y-1] == ' ')//可以落子
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else//不能落子
			{
				printf("坐标被占有,不能落子,重新输入坐标\n");
			}
		}
		else//非法
		{
			printf("坐标非法,重新输入\n");
		}
	}
}

2.4 Ajedrez informático

Al jugar al ajedrez con una computadora, podemos usar la función de generar números aleatorios, de modo que los números aleatorios generados % fila y % columna sean un subíndice de matriz aleatoria bidimensional

El uso de la función de generar números aleatorios se presentó en mi blog anterior. Si está interesado, ¡puede aprenderlo!

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;//0~row-1
	int y = 0;//0~col-1
	
	printf("电脑下棋:>\n");

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

2.5 Juzgar Ganar o Perder

Esta función necesita realizar las siguientes 4 situaciones

1. El jugador gana

2. La computadora gana

3. Dibujar

4. Si no se cumple ninguna de las condiciones anteriores, continúe

Tres casos de victoria

1. Aparecen tres símbolos idénticos en cada fila 2. Aparecen tres símbolos idénticos en cada columna 3. Aparecen tres símbolos idénticos en diagonal


dibujar:

Implemente una función para juzgar si el juego es un empate, y llámela en la función de juzgar si el juego se gana o se pierde.

char IsWin(char board[ROW][COL], int row, int col)
{
	//赢

	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	//列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

2.6 Determinar si el tablero está lleno

Recorra la matriz para ver si hay un elemento o un espacio, si lo hay, devuelva 0, si no, significa que el tablero está lleno, devuelva 1

Nota: El número devuelto aquí se devuelve a la declaración de juicio condicional de la función de ganar o perder del juicio

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}


3. Todo el código

3.1 juego.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);


//判断输赢
//玩家赢 - '*'
//电脑赢 - '#'
//平局  - 'Q'
//继续  - 'C'

char IsWin(char board[ROW][COL], int row, int col);

3.2 juego.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//1. 打印数据
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
				printf("|");
		}
		printf("\n");
		//2. 打印分割线
		if (i < row - 1)
		{
			//printf("---|---|---\n");
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j<col-1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:\n");
	while (1)
	{
		printf("请输入下棋的坐标,中间使用空格>:");
		scanf("%d %d", &x, &y);
		//坐标合法
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x-1][y-1] == ' ')//可以落子
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else//不能落子
			{
				printf("坐标被占有,不能落子,重新输入坐标\n");
			}
		}
		else//非法
		{
			printf("坐标非法,重新输入\n");
		}
	}
}

//
//电脑随机下棋
//
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;//0~row-1
	int y = 0;//0~col-1
	
	printf("电脑下棋:>\n");

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}


//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	//赢
	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	//列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

3.3 prueba.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("*****************************\n");
	printf("********  1. play   *********\n");
	printf("********  0. exit   *********\n");
	printf("*****************************\n");
}

void game()
{
	char board[ROW][COL] = {0};
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	char ret = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);//1 0 4
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}


Si cree que el artículo es bueno, espero su enlace triple de un clic. Su aliento es la fuente de motivación para mi creación. ¡Trabajemos juntos y nos vemos en la cima! ! ! 

Supongo que te gusta

Origin blog.csdn.net/qq_58286439/article/details/130612158
Recomendado
Clasificación