Fundamentos del lenguaje C: tres ajedrez (explicación detallada)

Prefacio: El código completo se proporcionará al final del artículo. El código anterior no será completo porque es fácil de explicar y es solo para referencia.

Tabla de contenido

1. Reglas del juego de backgammon

2. Cómo analizar el diseño.

3. Visualización y explicación del código.

1. Menú del juego

2. Muestra el tablero de ajedrez.

3. Los jugadores juegan al ajedrez.

4. Ajedrez por computadora

5. Juez gana/pierde/empata

4. Visualización de código completo

1.juego.h

2.juego.c

3.prueba.c

5. Resumen


1. Reglas del juego de backgammon

Mis amigos debieron haber        jugado backgammon cuando eran pequeños, no es más que un tablero de ajedrez de tres por tres , no hay ningún niño al que tirar, es decir, nueve cuadrículas están ocupadas , lo que resulta en un empate .

2. Cómo analizar el diseño.

       Sabemos que escribir códigos requiere un diseño limpio y ordenado. Incluso diseñar un juego extremadamente simple como el ajedrez de las tres lunas no se puede hacer en sólo unas pocas docenas de líneas de código.

       Como se muestra en la figura siguiente, creamos nuestro propio archivo de encabezado " game.h" para almacenar centralmente los archivos de encabezado que necesitamos usar y declarar las funciones que necesitamos usar. Solo necesitamos declarar nuestros propios archivos de encabezado en el archivo fuente. Simplemente #incluye "juego.h" .

 

Además, creamos un nuevo archivo fuente game.c para centrarnos en crear las funciones que necesitamos.

 Finalmente, el código principal de nuestro juego está escrito en el archivo fuente test.c.

3. Visualización y explicación del código.

1. Menú del juego

Cualquier juego necesita un menú para elegir cómo se juega.

void menu()//打印菜单函数
{
	printf("******************************\n");
	printf("*******     1.play     *******\n");
	printf("*******     0.exit     *******\n");
	printf("******************************\n");

}
char board[ROW][COL] = {'0'};//游戏数组
int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);//选择
		switch (input)
		{
		case 1:
			printf("三子棋\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

         Creamos una función de menú (menú) para generar específicamente nuestro menú y usamos el bucle do- while y la instrucción switch-case para realizar el juego en bucle.

       Aquí hay un pequeño truco : sabemos que la condición de juicio de while es 0 es falsa y distinta de cero es verdadera , por lo que usamos el caso 0 como salida del juego y también podemos terminar el ciclo e ingresar 1 u otros números . Continuará en bucle, reinicie y elija.

2. Muestra el tablero de ajedrez.

Nuestro tablero de ajedrez ideal se ve así, lo que obviamente requiere una matriz bidimensional, y los elementos de esta matriz bidimensional son todos "", (espacio) .

void SetBoard(char board[ROW][COL], int row, int col)//创建棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void ShowBoard(char board[ROW][COL],int row,int col)//展示棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i < row - 1)
		printf("---|---|---\n");
	}
}

       Arriba hemos definido la matriz char board[ROW][COL] = {'0'} , que se define como una matriz con un solo elemento "0", y luego creamos el tablero de ajedrez a través de la primera función SetBoard anterior , y luego Utilice la función ShowBoard para decorar y mostrar el tablero de ajedrez.

3. Los jugadores juegan al ajedrez.

void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋函数
{
	while (1)
	{
		printf("玩家下棋(选择坐标):");
		int x, y;
		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");
	}


}

       Aquí jugamos al ajedrez para modificar los elementos de la matriz . Los jugadores ingresan una coordenada para juzgar si la posición está vacía. Si está vacía, soltarán '*' . Si las coordenadas de entrada están fuera de los límites, se emitirá una advertencia y se volverá a ingresar la entrada . Aquí, los jugadores deben prestar atención a una cosa cuando juegan ajedrez, es decir, los jugadores no son necesariamente programadores , no ingresarán el subíndice correspondiente a la matriz cuando elijan las coordenadas, serán 2 3 si son dos filas y Tres columnas , solo necesitamos dejar estos dos números Ambos -1 , el efecto se puede lograr.

4. Ajedrez por computadora

void ComputerMove(char board[ROW][COL], int row, int col)//电脑下棋函数
{
	printf("电脑下棋:\n");
	int x, y;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
srand((unsigned int)time(NULL));//生成随机数,rand函数需要用,此处无用,供参考

Uno de los puntos clave del ajedrez por computadora es la aleatoriedad . Las coordenadas aquí deben usar la función rand para generar números aleatorios. Tenga en cuenta que la computadora en sí no presta tanta atención al ajedrez como los jugadores. Los números aleatorios generados pueden estar entre 0- 2. Cuando jugamos ajedrez con una computadora, estipulamos que la jugada sea '#' .

5. Juez gana/pierde/empata

int IsFull(char board[ROW][COL], int row, int col)//判断平局函数
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		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;
	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))//判断平局
	{
		return 'Q';
	}
	return 'C';
}

Aquí definimos la función IsWin para juzgar si se gana o se pierde y se realiza devolviendo un valor .

Estipulamos las siguientes cuatro formas de juzgar el progreso del juego:

El jugador gana --> devuelve '*'
la computadora gana --> devuelve '#'
empata --> devuelve 'Q'
el juego continúa --> devuelve 'C'

       ¿Por qué está estipulado esto? Sabemos que la pieza del jugador es '*' , y si el jugador gana, entonces una de nuestras filas, columnas o diagonales será '*' , por lo que podemos devolver un elemento a nuestro antojo, y lo siguiente El código se puede realizar. El jugador gana. La computadora gana de la misma manera. Al mismo tiempo, también tendremos un resultado empatado, entonces, ¿cómo es un empate? En pocas palabras, si nadie gana y el tablero está lleno , ¿no es un empate?

Entonces definimos la función IsFull para juzgar si la matriz está llena, y devolvemos 1 si está llena, de modo que la sentencia final if sea verdadera , y finalmente devolvemos 'Q' , y devolvemos 0 si no está llena, y finalmente devolver 'C' .

	char ret = 0;//判断结果
		case 1:
			SetBoard(board, ROW, COL);//创建棋盘
			ShowBoard(board, ROW, COL);//展示棋盘
			while (1)
			{
				//玩家先开始下棋
				PlayerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
				//电脑开始下棋
				ComputerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
			}
			if (ret == '*')
				printf("玩家赢\n");
			else if (ret == '#')
				printf("电脑赢\n");
			else
				printf("平局\n");
			break;

 Aquí está el juicio de la función principal , definimos ret para recibir el valor de retorno de la función IsWin y usamos la declaración de juicio if -else para realizar el juicio del resultado del juego.

4. Visualización de código completo

1.juego.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3//行数为三
#define COL 3//列数为三
void SetBoard(char board[ROW][COL], int row, int col);//创建棋盘
void ShowBoard(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);//电脑下棋
char IsWin(char board[ROW][COL], int row, int col);//判断输赢

2.juego.c

#include"game.h"
void SetBoard(char board[ROW][COL], int row, int col)//创建棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void ShowBoard(char board[ROW][COL],int row,int col)//展示棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i < row - 1)
		printf("---|---|---\n");
	}
}
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋函数
{
	while (1)
	{
		printf("玩家下棋(选择坐标):");
		int x, y;
		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)//电脑下棋函数
{
	printf("电脑下棋:\n");
	int x, y;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
//玩家赢-->'*'
//电脑赢-->'#'
//平局-->'Q'
//游戏继续-->'C'
int IsFull(char board[ROW][COL], int row, int col)//判断平局函数
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		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;
	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))//判断平局
	{
		return 'Q';
	}
	return 'C';
}

3.prueba.c

#include"game.h"
void menu()//打印菜单函数
{
	printf("******************************\n");
	printf("*******     1.play     *******\n");
	printf("*******     0.exit     *******\n");
	printf("******************************\n");

}
char board[ROW][COL] = {'0'};//游戏数组
int main()
{
	srand((unsigned int)time(NULL));//生成随机数,供电脑下棋使用
	int input = 0;
	char ret = 0;//判断结果
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);//选择
		switch (input)
		{
		case 1:
			SetBoard(board, ROW, COL);//创建棋盘
			ShowBoard(board, ROW, COL);//展示棋盘
			while (1)
			{
				//玩家先开始下棋
				PlayerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
				//电脑开始下棋
				ComputerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
			}
			if (ret == '*')
				printf("玩家赢\n");
			else if (ret == '#')
				printf("电脑赢\n");
			else
				printf("平局\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

5. Resumen

       Este es probablemente el caso de la creación de tres ajedrez. El blogger también es un principiante. Puede haber más planes de mejora en muchos lugares. En el futuro, me mejoraré a través del aprendizaje continuo para mejorar el código. Al mismo tiempo, Me gustaría agradecer a mis amigos por su paciencia, mi explicación, si tienes alguna duda o sugerencia de mejora no dudes en comentar por mensaje privado.

       Por último, espero que nuestros amiguitos a los que les gusta la programación puedan llegar cada vez más lejos y conseguir sus ofertas favoritas. Si te gusta el artículo del blogger no olvides hacer clic tres veces. ¡ Hasta la próxima!

Supongo que te gusta

Origin blog.csdn.net/2303_78442132/article/details/131936381
Recomendado
Clasificación