[Lenguaje C] Mini juego - Ajedrez de tres personajes

Hola a todos, soy pez profundo~


Tabla de contenido

1. Introducción al juego

 2. Embalaje de archivos

 3. Pasos de implementación del código

1. Haz un menú de juego simple

 2. Inicializa la placa

3. Imprime el tablero de ajedrez

4. Los jugadores juegan al ajedrez

5. La computadora juega al ajedrez al azar

6. Juez gane o pierda

7. Determina si el tablero está lleno

 4. Código completo

game.h (declaración de funciones relacionadas, archivos de encabezado y definiciones de macro a las que se hará referencia en todo el código)

game.c (realizar funciones relacionadas del juego)

test.c(: pruebas relacionadas con todo el juego)


1. Introducción al juego

"Sanziqi" es un antiguo juego popular tradicional, también conocido como Reversi, Circle Chacha, Tic Tac Toe, One Dragon, Jiugong Chess, etc. El juego se divide en dos lados para jugar uno contra el otro. Ambos lados colocan piezas en el tablero de ajedrez de 9 cuadrículas. El primer lado que conecta sus tres piezas en una línea se considera ganador.


 2. Embalaje de archivos

Archivo fuente: Contiene implementación de funciones, definición de variables, etc.

Archivo de encabezado: contiene declaraciones de funciones, definiciones de macros, definiciones de estructuras, etc. 

Para implementar este backgammon, creé tres archivos

Archivo fuente:

test.c: pruebas relacionadas con todo el juego

game.c: Implementar funciones relacionadas del juego

Archivo principal:

game.h: Declaración de funciones relacionadas, archivos de encabezado y definiciones de macro a las que se hará referencia en todo el código


 3. Pasos de implementación del código

1. Haz un menú de juego simple

(1) Defina una función de menú para imprimir el menú del juego. Debe haber opciones de menú del juego en el menú: 1. Iniciar el juego 0. Salir del juego. Cuando ingresemos 1, ingresaremos al juego y 0 saldrá del juego

(2) Teniendo en cuenta que el jugador puede querer seguir jugando después de jugar un juego, use el bucle do while para imprimir el menú, while (entrada), cuando el valor de entrada sea 0, salte del bucle (salir del juego), si el valor de entrada no es 0, vuelva a introducir el bucle (seleccione de nuevo)

(3) Debe juzgarse si el jugador elige entrar o salir del juego, así que use la declaración de cambio de caso para juzgar

prueba.c

#include"game.h"
void menu()
{
	printf("*****************************************\n");
	printf("**********      1.开始游戏      *********\n");
	printf("**********      0.退出游戏      *********\n");
	printf("*****************************************\n");

}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do//实现玩多盘游戏
	{ 
		menu();//打印菜单
		printf("请选择1/0:>\n");
		scanf("%d", &input);//选择进入游戏/退出游戏
		switch (input)//判断输入input的值决定是进入游戏还是退出游戏
		{
		case 1:
			game();//三子棋游戏的实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);//当input为0,跳出循环;为1再玩一盘游戏(重新进入循环);为其他值进入循环重新选择
	return 0;
}

Teniendo en cuenta que tanto game.c como test.c pueden usar el archivo de encabezado #include<stdio.h> de la función printf, escribimos directamente este archivo de encabezado en game.h, luego el archivo test.c solo necesita hacer referencia a #inlclude "juego.h"

Los archivos de encabezado del sistema generalmente usan <>

Definido por el usuario puede usar " " para acelerar la búsqueda

Mostrar resultados:

selecciona 1, ingresa al juego()

Elija 0 para salir del juego:

Seleccione non-1 non-0 (error de selección), vuelva a seleccionar 

 


 2. Inicializa la placa

(1) Primero, necesitamos definir una matriz bidimensional para almacenar datos, que se puede definir mediante macro

Definición de macros: Es conveniente modificar el programa, si queremos cambiar el tamaño del tablero podemos modificar directamente el número definido por la macro.

(2) Inicializar el tablero Definimos una función InitBoard(tablero) para inicializar todos los tableros a ' '

juego.h

//宏定义:
//为了方便直接改变棋盘的大小,在头文件里面定义(ROW和COL就是常量)
#define ROW 3 //没有逗号     //行
#define COL 3                //列

//初始化数组为空格
void InitBoard(char board[ROW][COL]);

juego.c

//初始化数组为空格
void InitBoard(char board[ROW][COL])
{
	for (int i = 0; i <ROW; i++)
	{
		for (int j = 0; j <COL; j++)
		{
			board[i][j] = ' ';//全部初始化为空格
		}
	}
}

3. Imprime el tablero de ajedrez

Queremos imprimir un tablero de ajedrez como este: separe con divisores para una fácil observación

(1) Imprima los datos primero (el último no necesita imprimir '|')

(2) Imprima la línea dividida nuevamente (no es necesario imprimir la última línea)

juego.h

//打印棋盘
void DisplayBoard(char board[ROW][COL]);

 juego.c

//打印棋盘
void DisplayBoard(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
			//先打印数据
		for (int j = 0; j < COL; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<COL-1)//一行的最后一个不打印
			printf("|");
		 }
		printf("\n");

			//再打印分割行(最后一行不打印)
		if (i < ROW - 1)//最后一行不打印
		{
			for (int j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)//也是一行的最后一个不打印
					printf("|");
			}
			printf("\n");
		}
		
	}
}

4. Los jugadores juegan al ajedrez

Aviso:

(1) Las coordenadas de entrada del jugador para jugar al ajedrez deben estar entre 1-3 (si no está en este rango, vuelva a ingresar), en lugar del rango de subíndices de matriz 0-2, por lo que las coordenadas de entrada son la entrada coordenadas de -1 respectivamente.

(2) Cuando los jugadores juegan al ajedrez, debemos considerar si las coordenadas ya están ocupadas

(3) == se puede usar para la comparación de caracteres, que se puede usar tanto para la comparación de constantes como de variables

       La comparación de cadenas usa la función strcmp y solo se puede usar para comparaciones de variables

juego.h

//打印棋盘
void DisplayBoard(char board[ROW][COL]);

 juego.c

//玩家下棋
void PlayerMove(char board[ROW][COL])
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");

	while (1)
	{
		printf("请输入要下棋的坐标:>\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//下棋的坐标必须在二维数组内部
		{
			if (board[x - 1][y - 1] == ' ')//1.输入的横纵坐标-1才是数组的下标  2.字符串的比较不能用==,但是这只是一个字符空格而已
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用,请输入其他坐标\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

5. La computadora juega al ajedrez al azar

La computadora necesita generar aleatoriamente dos números aleatorios para jugar al ajedrez al azar, pero estos dos números deben estar dentro del rango del tablero de ajedrez, luego tomar el módulo de los números aleatorios generados x = rand() % FILA; el número generado es 0- (ROW -1) , esta vez no es necesario usar -1, porque la computadora no necesita ingresarlo nosotros mismos, solo juega al ajedrez en forma de matriz

Aquí hay tres funciones.

rand():

Archivo de encabezado: #include<stdlib.h>

Esta función devuelve un valor entre 0-rand max (0-32767)

Antes de usar la función rand, debemos llamar a la función srand para que se pueda realizar la función de rand.

srand():

Archivo de encabezado: #include<stdlib.h>

Si quiere generar un número aleatorio, tiene que darle a srand un número aleatorio (si quiere que el número aleatorio generado por la función rand sea diferente, necesita ingresar un valor que cambia constantemente a la función srand (si solo es una constante se da, entonces el número aleatorio dado por rand es el mismo valor, no cambia))

El parámetro de srand debe ser unsigned int (entero sin signo), por ejemplo: srand((unsigned int)time(NULL));

tiempo():

Archivo de encabezado: #include<time.h>

Principio: Marca de tiempo: convierte el tiempo en constante cambio en un retorno digital, dando así a srand un valor aleatorio

juego.h

//电脑下棋
void ComputerMove(char board[ROW][COL]);

 juego.c

//电脑随机下棋
void ComputerMove(char board[ROW][COL]) 
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");

	while (1)
	{
		x = rand() % ROW;//产生的数为0-(ROW-1)
		y = rand() % COL;

		if (board[x][y] == ' ')//如果这个位置已经有棋子了,再进入循环,重新生成x和y直到下了一个棋子为止
		{
			board[x][y] = '#';
			break;
		}
	}
}

6. Juez gane o pierda

Juicio de ganar o perder: establecer cuatro resultados:
el jugador gana-devuelve*
la computadora gana-#
empate
-Qel juego continúa-C

juego.h

//判断输赢
char IsWin(char board[ROW][COL]);

 juego.c

//判断输赢:四种结果:
//玩家赢-返回*
//电脑赢-#
//平局-Q
//游戏继续—C
char IsWin(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')//注意要排除三个空格的情况
			return board[i][0];//谁的棋子连着三个就返回谁的棋子
	}
	for (int i = 0; i < COL; i++)
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')//注意要排除三个空格的情况
			return board[0][i];//谁的棋子连着三个就返回谁的棋子
	}

	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	if (IsFull(board))
		return 'Q';//如果棋盘满了,就表示平局,返回Q
	return 'C';//否则就继续下棋

}

7. Determina si el tablero está lleno

Atraviesa la matriz bidimensional, siempre que haya un espacio, continúa jugando al ajedrez (no lleno), si no hay espacios, significa lleno

juego.h

//判断棋盘是否满了
int IsFull(char board[ROW][COL]);

 juego.c

//判断棋盘是否是满的
static int IsFull(char board[ROW][COL])//staic表示只在这个game.c的文件中使用这个函数
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')//只要有一个空格就继续进行
				return 0;
		}
	}
	return 1;//如果都不是空格,那就是表示全满
}

 4. Código completo

game.h ( declaración de funciones relacionadas, archivos de encabezado y definiciones de macro a las que se hará referencia en todo el código)

//头文件:内含函数声明、宏定义、结构体定义等内容

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

//宏定义:
//为了方便直接改变棋盘的大小,在头文件里面定义(ROW和COL就是常量)
#define ROW 3 //没有逗号     //行
#define COL 3                //列

//函数声明:
//初始化数组为空格
void InitBoard(char board[ROW][COL]);//row和col为真实的行和列
//打印棋盘
void DisplayBoard(char board[ROW][COL]);
//玩家下棋
void PlayerMove(char board[ROW][COL]);
//电脑下棋
void ComputerMove(char board[ROW][COL]);
//判断输赢
char IsWin(char board[ROW][COL]);
//判断棋盘是否满了
int IsFull(char board[ROW][COL]);

game.c (realizar funciones relacionadas del juego)

//实现游戏相关的代码
#include"game.h"//这里也要包含自己定义的头文件,不然ROW和COL宏定义就不起作用了

//初始化数组为空格
void InitBoard(char board[ROW][COL])
{
	for (int i = 0; i <ROW; i++)
	{
		for (int j = 0; j <COL; j++)
		{
			board[i][j] = ' ';//全部初始化为空格
		}
	}
}

//打印棋盘
void DisplayBoard(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
			//先打印数据
		for (int j = 0; j < COL; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<COL-1)//一行的最后一个不打印
			printf("|");
		 }
		printf("\n");

			//再打印分割行(最后一行不打印)
		if (i < ROW - 1)//最后一行不打印
		{
			for (int j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)//也是一行的最后一个不打印
					printf("|");
			}
			printf("\n");
		}
		
	}
}

//玩家下棋
void PlayerMove(char board[ROW][COL])
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");

	while (1)
	{
		printf("请输入要下棋的坐标:>\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//下棋的坐标必须在二维数组内部
		{
			if (board[x - 1][y - 1] == ' ')//1.输入的横纵坐标-1才是数组的下标  2.字符串的比较不能用==,但是这只是一个字符空格而已
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标已被占用,请输入其他坐标\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

//电脑随机下棋
void ComputerMove(char board[ROW][COL]) 
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");

	while (1)
	{
		x = rand() % ROW;//产生的数为0-(ROW-1)
		y = rand() % COL;

		if (board[x][y] == ' ')//如果这个位置已经有棋子了,再进入循环,重新生成x和y直到下了一个棋子为止
		{
			board[x][y] = '#';
			break;
		}
	}
}

//判断棋盘是否是满的
static int IsFull(char board[ROW][COL])//staic表示只在这个game.c的文件中使用这个函数
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')//只要有一个空格就继续进行
				return 0;
		}
	}
	return 1;//如果都不是空格,那就是表示全满
}

//判断输赢:四种结果:
//玩家赢-返回*
//电脑赢-#
//平局-Q
//游戏继续—C
char IsWin(char board[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')//注意要排除三个空格的情况
			return board[i][0];//谁的棋子连着三个就返回谁的棋子
	}
	for (int i = 0; i < COL; i++)
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')//注意要排除三个空格的情况
			return board[0][i];//谁的棋子连着三个就返回谁的棋子
	}

	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	if (IsFull(board))
		return 'Q';//如果棋盘满了,就表示平局,返回Q
	return 'C';//否则就继续下棋

}

test.c(: pruebas relacionadas con todo el juego)

La lógica de la función del juego:

(1) Inicialice la matriz e imprímala para ver cómo se ve

(2) Comience a jugar al ajedrez, el jugador juega primero, imprime después de que finaliza el juego y juzga ganar o perder después de imprimir. Si el juego no continúa, salta fuera del bucle y muestra el resultado del juego (el jugador gana/la computadora victorias/empate)

(3) La lógica de jugar al ajedrez con una computadora es la misma 

//源文件,内含函数实现,变量定义等内容

#include"game.h"//系统头文件一般用<>;用户自己定义的则可以使用""
//整个游戏相关的测试
void menu()
{
	printf("*****************************************\n");
	printf("**********      1.开始游戏      *********\n");
	printf("**********      0.退出游戏      *********\n");
	printf("*****************************************\n");

}

void game()
{
	char ret = 0;
	char board[ROW][COL];
	//开始的时候,数组的内容应该全是空格
	InitBoard(board);//用于初始化数组为空格
	DisplayBoard(board);//用于打印棋盘
	//下棋
	while (1)
	{
		PlayerMove(board);//玩家下棋放*
		DisplayBoard(board);
		//判断输赢
		ret=IsWin(board);
		if (ret != 'C')
		{
			break;//不是游戏继续就跳出循环,输出结果
		}

		ComputerMove(board);//电脑随机下棋放#
		DisplayBoard(board);
		//判断输赢
		ret = IsWin(board);
		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("请选择1/0:>\n");
		scanf("%d", &input);//选择进入游戏/退出游戏
		switch (input)//判断输入input的值决定是进入游戏还是退出游戏
		{
		case 1:
			game();//三子棋游戏的实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);//当input为0,跳出循环;为1再玩一盘游戏(重新进入循环);为其他值进入循环重新选择
	return 0;
}

 Este es el final del contenido de este minijuego Sanziqi en lenguaje C. Si tienes alguna duda, por favor da la bienvenida al área de comentarios o mensaje privado para comunicarte. Creo que la escritura del autor no es mala, o he ganado un poco. Ven a un clic de tres enlaces, ¡muchas gracias! 

Supongo que te gusta

Origin blog.csdn.net/qq_73017178/article/details/132239166
Recomendado
Clasificación