[Lenguaje C] Realización de tres ajedrez (tres en raya)


prefacio

Después de aprender algunos conocimientos básicos del lenguaje C, podemos escribir algunos códigos más complicados por nosotros mismos. Aquí, les presentaré un pequeño juego: tres ajedrez.


1. Nuevo proyecto

Por ejemplo, el Visual Studio 2022 que usé creó un nuevo archivo de encabezadojuego.hy dos archivos fuentejuego.cyprueba.cpara escribir todo el programa.inserte la descripción de la imagen aquí

2. Ideas de diseño

1. Archivo de cabecera juego.h

el código se muestra a continuación:

#pragma once

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

#define ROW 3
#define COL 3

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);

//打印棋盘
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断游戏状态
char is_win(char board[ROW][COL], int row, int col);

Coloque todas las declaraciones de funciones necesarias, las llamadas a funciones de la biblioteca del lenguaje C y las definiciones de macros en el archivo de encabezado, de modo que se pueda hacer referencia directa al archivo de encabezado en los dos archivos de origen, como este *#include "game.h"*.

2. Prueba de archivo fuente.c

El archivo fuente donde se ubica la función principal, en el cual se diseña la idea principal de todo el proyecto.

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

En primer lugar, el usuario tiene que elegir jugar o no jugar, y luego usar la instrucción switch-case para juzgar, ingresar 1 para jugar, ingresar a la función del juego, 0 para salir del juego, de lo contrario elegir nuevamente.

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

void game()
{
    
    

}

A continuación, está la escritura de las funciones más importantes del juego.


3. Archivo fuente juego.h

3.1 Inicialización de matrices

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

Inicialice una matriz de 3*3 con todos los espacios, de modo que sea conveniente imprimir un tablero de ajedrez normal.


3.2 Imprimir el tablero de ajedrez

inserte la descripción de la imagen aquí
Finalmente imprima un tablero de ajedrez como este:
inserte la descripción de la imagen aquí


3.3 Los jugadores juegan al ajedrez

Después de imprimir el tablero, el jugador comienza a jugar al ajedrez.
inserte la descripción de la imagen aquí


3.4 Ajedrez informático

Debido a que quiero que la computadora juegue al ajedrez de manera inteligente, puede implicar un conocimiento profundo relacionado con el aprendizaje, que no está disponible para mí ahora. Así que deja que la computadora genere coordenadas al azar.
Usa la función rand:

		int x = rand() % row;
		int y = rand() % col;
srand((unsigned int)time(NULL));
//主函数中利用时间戳生成随机数

El código completo es el siguiente:

void computer_move(char board[ROW][COL], int row, int col)
{
    
    
	printf("电脑下棋:>\n");
	//0~32726
	//%3-->0~2
	while (1)
	{
    
    
		int x = rand() % row;//这里利用随机数除以函数和列数,这样得到的
		int y = rand() % col;//x,y的值就是在0~2之间了
		if (board[x][y] == ' ')
		{
    
    
			board[x][y] = '#';
			break;
		}
	}
}

3.5 Juzgando el estado del juego

Después de la feroz confrontación entre el jugador y la computadora, el siguiente paso es juzgar si el juego se gana o se pierde.
Para diseñar cuatro estados,
1. La computadora gana
2. El jugador gana
3. Un empate
4. Ninguno de los tres estados, el juego continúa,

		//玩家赢 - '*'
		//电脑赢 - '#'
		//平局了 - 'Q'
		//游戏继续 - 'C'
		//通过这样的判断,可以省很多事,因为玩家执‘*’,计算机执‘#’,这样可
		//以直接返回数组的元素值来进行判断游戏状态
char is_win(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 (is_full(board, row, col) == 1)
	{
    
    
		return 'Q';
	}

	//继续
	return 'C';
}
//用于判断是否平局
//如果棋盘满了,返回1
//不满,返回0
int is_full(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.6 Diseño de la función del juego en el archivo test.c

void game()
{
    
    
	char ret = 0;
	//数据的存储需要一个3*3的二维数组
	char board[ROW][COL] = {
    
    0};
	init_board(board, ROW, COL);
	display_board(board, ROW, COL);
	//玩游戏
	while(1)
	{
    
    
	//设计循环来进行判断,如果返回‘C’,则继续下棋,返回不是‘C’,则游戏继续
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);


		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);

		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;

	}
	  //根据返回值进行判断游戏结局,最后再将游戏的最终状态打印出来
	if (ret == '*')
	{
    
    
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
    
    
		printf("电脑赢\n");
	}
	else if(ret == 'Q')
	{
    
    
		printf("平局\n");
	}
	display_board(board, ROW, COL);

}

Resumir

Hasta ahora, este pequeño y sencillo juego ha tenido un diseño muy tosco. Finalmente, el código completo se pone aquí para su referencia.

1.juego.h

#pragma once

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

#define ROW 3
#define COL 3

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);

//打印棋盘
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断游戏状态
char is_win(char board[ROW][COL], int row, int col);

2.juego.c

#include "game.h"

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


void display_board(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++)
		{
    
    
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//---|---|---
		if (i < row - 1)
		{
    
    
			//printf("---|---|---\n");
			for (j = 0; j < col; j++)
			{
    
    
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void player_move(char board[ROW][COL], int row, int col)
{
    
    
	int x = 0;
	int y = 0;

	printf("玩家下棋:>\n");

	while (1)
	{
    
    
		printf("请输入要下棋的坐标:>");
		scanf("%d %d", &x, &y);
		//1.坐标的合法性
		//2.坐标是否被占用
		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 computer_move(char board[ROW][COL], int row, int col)
{
    
    
	printf("电脑下棋:>\n");
	//0~32726
	//%3-->0~2
	while (1)
	{
    
    
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
    
    
			board[x][y] = '#';
			break;
		}
	}
}

//用于判断是否平局
//如果棋盘满了,返回1
//不满,返回0
static int is_full(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;
}

		//玩家赢 - '*'
		//电脑赢 - '#'
		//平局了 - 'Q'
		//游戏继续 - 'C'
char is_win(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 (is_full(board, row, col) == 1)
	{
    
    
		return 'Q';
	}

	//继续
	return 'C';
}

3.prueba.c

#include "game.h"

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

void game()
{
    
    
	char ret = 0;
	//数据的存储需要一个3*3的二维数组
	char board[ROW][COL] = {
    
    0};
	init_board(board, ROW, COL);
	display_board(board, ROW, COL);
	//玩游戏
	while(1)
	{
    
    
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);


		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);

		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;

	}
	    //玩家赢 - '*'
		//电脑赢 - '#'
		//平局了 - 'Q'
		//游戏继续 - 'C'

	if (ret == '*')
	{
    
    
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
    
    
		printf("电脑赢\n");
	}
	else if(ret == 'Q')
	{
    
    
		printf("平局\n");
	}
	display_board(board, ROW, COL);

}



int main()
{
    
    
	int input = 0;
	srand((unsigned int)time(NULL));

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

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/lyq2632750277/article/details/126042760
Recomendado
Clasificación