El lenguaje C implementa tres piezas de ajedrez (no retardo mental artificial jajaja)

Hasta ahora, he aprendido ramas, bucles, matrices y funciones, y ahora uso este conocimiento para escribir un juego de ajedrez para consolidar y profundizar lo que he aprendido jajaja

contenido

1. Resultados de la prueba

2. Idea general

3. Interpretación de los módulos de código

(1), menú de impresión

 (2), inicializa el tablero de ajedrez

(3), imprime el tablero de ajedrez

(4) Los jugadores juegan al ajedrez.

(5), ajedrez informático

 (6) Juzgar a los ganadores y perdedores

4. La implementación general del código

juego.h

 juego.c

prueba.c


1. Resultados de la prueba

Este es todo el proceso del juego. A continuación, explicaré lentamente cómo se realiza todo el proyecto ~

2. Idea general

Creé tres archivos, primero puse la implementación de las funciones en el archivo game.c y luego puse las declaraciones de estas funciones en el archivo de encabezado game.h, para que se pueda hacer referencia directa al archivo de encabezado game.h en la prueba. Archivo .c, use las funciones en game.c para asegurarse de que la lógica de la función principal sea clara y fácil de entender. La realización del juego se divide principalmente en los siguientes pasos: imprimir el menú, inicializar el tablero, imprimir el tablero, jugar al ajedrez por el jugador, jugar al ajedrez por la computadora y juzgar si ganar o perder .

3. Interpretación de los módulos de código

(1), menú de impresión

Esto es muy simple, así que no entraré en detalles, solo vaya directamente al código

void menu()
{
	printf("----------- 菜单  ------------\n");
	printf("***********1、play************\n");
	printf("***********0、exit************\n");
	printf("------------------------------\n");

}

 

 (2), inicializa el tablero de ajedrez

Para esto, creé un tablero de matriz bidimensional [ROW] [COL] para simular un tablero de ajedrez con filas ROW y columnas COL. Definir las filas y columnas de la matriz como variables globales es facilitar el cambio del tamaño del tablero de ajedrez . Inicialmente inicialicé esta matriz 2D con todos los espacios .

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

(3), imprime el tablero de ajedrez

Antes de imprimir el tablero de ajedrez, debe modificar el tablero de ajedrez inicializado; de lo contrario, no podrá ver el tablero de ajedrez que imprimió, entonces, ¿cómo puede jugar el juego ~

void DisplayBoard(char board[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (j = 0; j < ROW; j++)
	{
		for (i = 0; i < COL; i++)
		{
			
			printf(" %c ",board[j][i]);
			if(i<COL-1)
				printf("|");
		}
		printf("\n");
		if (j < ROW - 1)
		{
			for (i = 0; i < COL; i++)
			{
				printf("---");
				if (i <COL - 1)
				printf("|");

			}		
		}
		printf("\n");
	}

}

El siguiente es el tablero de ajedrez correspondiente a este código.

(4) Los jugadores juegan al ajedrez.

Después de imprimir el tablero de ajedrez, es equivalente al trabajo de preparación, y el siguiente paso es el juego entre el jugador y la computadora.

El primero es para que el jugador juegue al ajedrez. "*" representa al jugador. Primero, el jugador ingresa la fila y la columna. Antes de colocar una piedra, el sistema primero debe determinar si la posición no está ocupada y si la entrada es legal . Vuelva a ingresar, la siguiente es la implementación del código:

void player_move(char board[ROW][COL])
{
	int i = 0;
	int j = 0;
	
	while (1)
	{
		scanf("%d %d", &i, &j);
		if (i >= 0 && i < ROW && j >= 0 && j < COL)
		{
			if (board[i][j] == ' ')
			{
				board[i][j] = '*';
				DisplayBoard(board);
				return;

			}
			else
				printf("该位置已被占用,请重新输入!  ");
		}
		else
			printf("输入不合法,请重新输入!");
	}

}

 

(5), ajedrez informático

Aquí tengo que decir que es realmente difícil realizar inteligencia artificial. Cuando escribí movimientos de computadora por primera vez, usé directamente las funciones srand() y rand() para generar aleatoriamente dos números como las coordenadas del movimiento, y luego descubrí que lo escribí Todo el juego es un retraso mental artificial , y luego cambió ligeramente la función de la computadora que juega al ajedrez, para que la computadora pueda aprender a bloquear las piezas del jugador, en lugar de simplemente jugar casualmente. Antes de que la computadora haga un movimiento, primero dejo que juzgue si hay 2 jugadores en una fila, una columna o una línea diagonal. No estoy generando 2 números al azar para determinar mi posición (no me he dado cuenta de cómo dejar que el la computadora tiene su propio camino además de bloquear a otros ), de lo contrario es difícil decir inteligencia artificial , echemos un vistazo a cómo lo hace esta parte

void computer_move(char board[ROW][COL])
{
	while (1)
	{
		int i = 0;
		int j = 0;
		for (i = 0; i < ROW; i++)//判断一行中是否有两个相同的
		{
			if (board[i][0] == ' '&&board[i][1] == board[i][2] && board[i][1] !=' ' || board[i][1] == ' ' && board[i][0] == board[i][2] && board[i][0] != ' ' || board[i][2] == ' ' && board[i][1] == board[i][0] && board[i][1] != ' ')
			{
				for (j = 0; j < COL; j++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						DisplayBoard(board);
						return;

					}

				}
			}
			
		}
		
		for (i = 0; i < ROW; i++)//判断一列中是否有两个相同的
		{
			if (board[0][i] == ' '&&board[1][i] == board[2][i] && board[1][i]!=' ' || board[1][i] == ' ' && board[0][i] == board[2][i] && board[0][i] != ' ' || board[2][i] == ' ' && board[0][i] == board[1][i] && board[0][i] != ' ')//判断列
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][i] == ' ')
					{
						board[j][i] = '#';
						DisplayBoard(board);
						return;

					}

				}
			}
			
		}
				
		//判断主对角线中是否有两个相同的
		if (board[1][1] != ' ' && board[2][2] == board[1][1] || board[0][0] != ' ' && board[0][0] == board[1][1] || board[2][2] != ' ' && board[0][0] == board[2][2])
		{
			for (j= 0; j < ROW; j++)
			{
				if (board[j][j] == ' ')
				{
					board[j][j] = '#';
					DisplayBoard(board);
					return;
				}
			}

		}
			
		//判断副对角线是否有两个相同的
		if (board[2][0] != ' ' && board[2][0] == board[0][2] || board[1][1] !=' ' && board[1][1] == board[2][0] || board[1][1] !=' ' && board[1][1] == board[0][2])
		{
			for (j = 0; j < ROW; j++)
			{
				if (board[2 - j][j] == ' ')
				{
					board[2 - j][j] = '#';
					DisplayBoard(board);
					return;
				}
			}

		}	
		//随机下棋
		int a = rand() % ROW;
		int b = rand() % COL;
		if (board[a][b] == ' ')
		{
			board[a][b] = '#';
			DisplayBoard(board);
			break;

		}

	}
}

Los jugadores juegan al ajedrez y la computadora juega al ajedrez en un bucle, hasta que las tres piezas están conectadas o el tablero está lleno, y el siguiente paso es juzgar si se gana o se pierde.

 (6) Juzgar a los ganadores y perdedores

Esto se escribe principalmente en un bucle. A juzgar que los caracteres en una fila, columna o diagonal son los mismos y no un espacio , se puede determinar el ganador, y luego devolver los caracteres correspondientes y juzgar un poco para saber quién es el ganador. Por supuesto, si el tablero está lleno, es decir, no hay espacio en la matriz de dos dígitos y no hay una conexión de tres piezas, se puede juzgar como un empate. Mira el código:

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

char win(char board[ROW][COL])//判断输赢
{
	int i = 0;
	int j = 0;
	for (j = 0; j < COL; j++)
	{
		if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&& board[0][j] != ' ')//判断列
			return board[0][j];
		
	}
	for (j = 0; j < COL; j++)
	{
		if (board[j][0] == board[j][1] && board[j][0] == board[j][2]&& board[j][0] != ' ')//判断行
			return board[j][0];
	}
	if (board[0][0] == board[1][1] && board[0][0]==board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&& board[0][2] != ' ')
	{
		return board[1][1];
	}
	if (1 == ful_board(board))
		return 'P';
	return 0;
}

Lo anterior es la implementación específica de cada función. Coloco la mayoría de estas funciones en game.c, y luego las declaro en game.c. Finalmente, cuando pruebo en test.c, puedo referirme directamente al archivo de encabezado game.c A continuación, echemos un vistazo a todo el código completo~~

4. La implementación general del código

juego.h

#include<stdio.h>
#include<time.h>
#include <stdlib.h>
void menu();//打印菜单
#define ROW 3//全局变量,3行
#define COL 3//3列
void DisplayBoard(char board[ROW][COL]);//打印棋盘
void Init(char board[ROW][COL]);//初始化棋盘
void player_move(char board[ROW][COL]);//玩家下棋
void computer_move(char board[ROW][COL]);//电脑下棋
char win(char board[ROW][COL]);//判断输赢
int ful_board(char board[ROW][COL]);//判断棋盘是否满

 juego.c

#define _CRT_SECURE_NO_WARNING
#include"game.h"
void menu()
{
	printf("----------- 菜单  ------------\n");
	printf("***********1、play************\n");
	printf("***********0、exit************\n");
	printf("------------------------------\n");

}
void Init(char board[ROW][COL])//将棋盘初始化为空格
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
			board[i][j] = ' ';
	}
}
void DisplayBoard(char board[ROW][COL])//打印棋盘
{
	int i = 0;
	int j = 0;
	for (j = 0; j < ROW; j++)
	{
		for (i = 0; i < COL; i++)
		{
			
			printf(" %c ",board[j][i]);
			if(i<COL-1)
				printf("|");
		}
		printf("\n");
		if (j < ROW - 1)
		{
			for (i = 0; i < COL; i++)
			{
				printf("---");
				if (i <COL - 1)
				printf("|");

			}		
		}
		printf("\n");
	}

}

void player_move(char board[ROW][COL])//玩家下棋
{
	int i = 0;
	int j = 0;
	
	while (1)
	{
		scanf("%d %d", &i, &j);
		if (i >= 0 && i < ROW && j >= 0 && j < COL)
		{
			if (board[i][j] == ' ')
			{
				board[i][j] = '*';
				DisplayBoard(board);
				return;

			}
			else
				printf("该位置已被占用,请重新输入!  ");
		}
		else
			printf("输入不合法,请重新输入!");
	}

}

void computer_move(char board[ROW][COL])//电脑下棋
{
	while (1)
	{
		int i = 0;
		int j = 0;
		for (i = 0; i < ROW; i++)//判断一行中是否有两个相同的
		{
			if (board[i][0] == ' '&&board[i][1] == board[i][2] && board[i][1] !=' ' || board[i][1] == ' ' && board[i][0] == board[i][2] && board[i][0] != ' ' || board[i][2] == ' ' && board[i][1] == board[i][0] && board[i][1] != ' ')
			{
				for (j = 0; j < COL; j++)
				{
					if (board[i][j] == ' ')
					{
						board[i][j] = '#';
						DisplayBoard(board);
						return;

					}

				}
			}
			
		}
		
		for (i = 0; i < ROW; i++)//判断一列中是否有两个相同的
		{
			if (board[0][i] == ' '&&board[1][i] == board[2][i] && board[1][i]!=' ' || board[1][i] == ' ' && board[0][i] == board[2][i] && board[0][i] != ' ' || board[2][i] == ' ' && board[0][i] == board[1][i] && board[0][i] != ' ')//判断列
			{
				for (j = 0; j < COL; j++)
				{
					if (board[j][i] == ' ')
					{
						board[j][i] = '#';
						DisplayBoard(board);
						return;

					}

				}
			}
			
		}
				
		//判断主对角线中是否有两个相同的
		if (board[1][1] != ' ' && board[2][2] == board[1][1] || board[0][0] != ' ' && board[0][0] == board[1][1] || board[2][2] != ' ' && board[0][0] == board[2][2])
		{
			for (j= 0; j < ROW; j++)
			{
				if (board[j][j] == ' ')
				{
					board[j][j] = '#';
					DisplayBoard(board);
					return;
				}
			}

		}
			
		//判断副对角线是否有两个相同的
		if (board[2][0] != ' ' && board[2][0] == board[0][2] || board[1][1] !=' ' && board[1][1] == board[2][0] || board[1][1] !=' ' && board[1][1] == board[0][2])
		{
			for (j = 0; j < ROW; j++)
			{
				if (board[2 - j][j] == ' ')
				{
					board[2 - j][j] = '#';
					DisplayBoard(board);
					return;
				}
			}

		}	
		//随机下棋
		int a = rand() % ROW;
		int b = rand() % COL;
		if (board[a][b] == ' ')
		{
			board[a][b] = '#';
			DisplayBoard(board);
			break;

		}

	}
}

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

char win(char board[ROW][COL])//判断输赢
{
	int i = 0;
	int j = 0;
	for (j = 0; j < COL; j++)
	{
		if (board[0][j] == board[1][j] && board[0][j] == board[2][j]&& board[0][j] != ' ')//判断列
			return board[0][j];
		
	}
	for (j = 0; j < COL; j++)
	{
		if (board[j][0] == board[j][1] && board[j][0] == board[j][2]&& board[j][0] != ' ')//判断行
			return board[j][0];
	}
	if (board[0][0] == board[1][1] && board[0][0]==board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&& board[0][2] != ' ')
	{
		return board[1][1];
	}
	if (1 == ful_board(board))
		return 'P';
	return 0;
}

prueba.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;
	srand((unsigned int)time(NULL));//设置随机种子数
	Init(board);//初始化棋盘
	DisplayBoard(board);//装饰棋盘
	
	while (1)
	{
		
		player_move(board);//玩家下棋
		ret = win(board);//判断胜负
		if (ret == '*')
		{
			printf("恭喜你,获胜了!!!\n");
			break;
		}
		if (ret == 'P')
		{
			printf("平局!!!\n");
			break;
		}
		
		computer_move(board);//电脑下棋
		ret = win(board);
		if (ret == '#')
		{
			printf("很遗憾,你输了!!!\n");
			break;
		}
		if (ret == 'P')
		{
			printf("平局!!!");
			break;
		}
	}
}
void test()
{
	int input = 0;
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入不合法,请重新输入!\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

Este es el final. A continuación, escribiré un pequeño juego de buscaminas jajaja. Los amigos que lo leyeron al final le dan un me gusta.

Supongo que te gusta

Origin blog.csdn.net/m0_63039919/article/details/121253657
Recomendado
Clasificación