Lenguaje C elemental - juego de ajedrez

        Después de aprender el conocimiento relevante de las matrices, entonces con el conocimiento que hemos aprendido ahora, podemos escribir algunos juegos lógicos simples, y luego lo siguiente es: el juego de ajedrez. Creo que alguna gente ha oído hablar de este juego, o que hay más gente que conoce el tres en raya. Luego vamos a implementar este juego (emocionado, escribiendo un juego por primera vez).

        Quiere que el código caiga directamente en la implementación final (jaja).


contenido

1. Crear un entorno de proyecto

2. archivo prueba.c

3. Crea la función del juego

4. Juega al ajedrez

        4.1 Los jugadores juegan al ajedrez

        4.2 Ajedrez por computadora

5. Empieza a jugar

6. Juzgando ganadores y perdedores

7. Implementación final

Bono: Jugador VS Jugador

Conclusión: 


1. Crear un entorno de proyecto

        En el código original que escribimos, generalmente creamos un nuevo proyecto primero y agregamos un archivo fuente test.c al nuevo proyecto.

Pero ahora tenemos que escribir código en módulos para implementar este juego.

Aquí se crean dos archivos fuente y un archivo de encabezado implementa sus respectivas funciones.


 2. archivo prueba.c

El código en text.c al principio es el siguiente:

#include "game.h"//引用自己创建的头文件,可以把stdio.h这个头文件包括在那里面

//测试三子棋的逻辑

void menu()
{
	printf("*****************************\n");
	printf("*********  1.play  **********\n");
	printf("*********  0.exit  **********\n");
	printf("*****************************\n");
}
void test()
{
	int input = 0;
	do
	{
		menu();//打印菜单,1.代表玩游戏,0.代表退出
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩游戏
            game();//游戏的逻辑在game函数中去实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);//想要能够重复玩,所以这里是循环
}
int main()
{
	test();
	return 0;
}

3. Crea la función del juego

Como quieres jugar a Sanbang, debes tener un tablero de ajedrez y, por supuesto, el primer paso es imprimir el tablero.

void game()
{
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
}

 código de archivo de encabezado game.h

#include <stdio.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);

 Implementación del tablero de ajedrez en el archivo game.c

#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++)
	{
		//打印数据
		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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

El aspecto final del tablero de ajedrez, al principio todas las matrices del tablero de ajedrez tienen espacios asignados, y luego es el tablero de ajedrez que diseñamos cuidadosamente con '|' y '-'. De esta manera, puede imprimir el tablero de ajedrez de varios caracteres incluso si no es una pieza de ajedrez en el futuro, pero esta vez escribiremos una pieza de ajedrez.

 Ahora que el tablero está listo, comencemos a jugar al ajedrez.


4. Juega al ajedrez

        4.1 Los jugadores juegan al ajedrez

       Escribiré las definiciones de todas las funciones en la función del juego, las declaraciones de funciones en el archivo de encabezado game.h y la implementación de todas las funciones en el archivo game.c.

void game()
{
	//存放下棋的数据
	//char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	//InitBoard(board, ROW, COL);
	//打印棋盘
	//DisplayBoard(board, ROW, COL);

	//玩家下棋
	player_move(board, ROW, COL);
	DisplayBoard(board, ROW, COL);//下完之后打印棋盘
}

       ¿Qué sucede si no sabe que los subíndices de la matriz comienzan en 0? Entonces ingrese un número entre 1 y 3 y reste 1 para convertirlo en un subíndice de matriz.

        También es necesario juzgar si la coordenada ha sido ocupada o si se ha ingresado una coordenada más allá del rango del tablero de ajedrez.

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	while (1)//这里写成循环,因为我们如果输入错误需要重新输入,输入正确就break跳出
	{
		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");
		}
	}
}

        


        4.2 Ajedrez por computadora

       Con la habilidad actual, solo puedo hacer que la computadora juegue al ajedrez al azar. El código que es demasiado complicado aún no se puede escribir. Aunque el jugador y la computadora juegan al ajedrez aquí, también escribiré un fragmento de código para el jugador VS. jugador en el futuro.

void game()
{
	//存放下棋的数据
	//char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	//InitBoard(board, ROW, COL);
	//打印棋盘
	//DisplayBoard(board, ROW, COL);
	//玩家下棋
	//player_move(board, ROW, COL);
	//DisplayBoard(board, ROW, COL);

	//电脑下棋
	Computer_move(board, ROW, COL);//随机下棋
	DisplayBoard(board, ROW, COL);
}
void Computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:>\n");
	while (1)
	{
		x = rand() % row;//0~2
		y = rand() % col;//0~2  所以不需要判断是否合法
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

       Si desea generar un número aleatorio aquí, necesita usar la función rand. Puede buscar el uso de esta función usted mismo. Necesita una marca de tiempo para generar un número aleatorio. El tiempo cambia cada segundo. Si usa un solo función rand, el número aleatorio generado cada vez es el mismo, por lo que se usa la función srand, y ponemos la marca de tiempo, para que el número generado cada vez sea diferente.

 También se requieren archivos de encabezado para usar funciones de biblioteca

 


5. Empieza a jugar

       Ahora que se ha escrito el código para el juego de ajedrez, es hora de comenzar a jugar. Debe haber un paso para el jugador y un paso para la computadora, por lo que debe haber un bucle aquí.

void game()
{
	//存放下棋的数据
	//char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	//InitBoard(board, ROW, COL);
	//打印棋盘
	//DisplayBoard(board, ROW, COL);
	
    while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//电脑下棋
		Computer_move(board, ROW, COL);//随机下棋
		DisplayBoard(board, ROW, COL);
	}
}

  De esta manera, el código básicamente puede realizar la batalla entre el jugador y la computadora, y finalmente se deja juzgar si se gana o se pierde.


6. Juzgando ganadores y perdedores

El juego ha terminado en estos casos:

El jugador gana, la computadora gana, empate.

void game()
{
	//存放下棋的数据
	//char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	//InitBoard(board, ROW, COL);
	//打印棋盘
	//DisplayBoard(board, ROW, COL);

	char ret = 0;
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		Computer_move(board, ROW, COL);//随机下棋
		DisplayBoard(board, ROW, COL);
		//判断输赢		
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢了\n");
	else if (ret == '#')
		printf("电脑赢了\n");
	else
		printf("平局\n");
	DisplayBoard(board, ROW, COL);//最后再打印一遍棋盘
}
//玩家赢了 - 返回'*'
//电脑赢了 - 返回'#'
//平局    - 返回'Q'
//继续    - 返回'C'
static int is_full(char board[ROW][COL], int row, int col)//static修饰,这个函数只能在这个源文件中使用
{
	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 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][1] != ' ')
		{
			return board[i][1];
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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';
}

7. Implementación final

En este punto, el juego ha sido escrito, echemos un vistazo al efecto final. 

Todo el código adjunto:

archivo 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 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);

archivo 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++)
	{
		//打印数据
		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)
		{
			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);
		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)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:>\n");
	while (1)
	{
		x = rand() % row;//0~2
		y = rand() % col;//0~2  所以不需要判断是否合法
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

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;//棋盘满了
}
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][1] != ' ')
		{
			return board[i][1];
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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';
}

archivo 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 ret = 0;
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		//电脑下棋
		Computer_move(board, ROW, COL);//随机下棋
		DisplayBoard(board, ROW, COL);
		//判断输赢		
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢了\n");
	else if (ret == '#')
		printf("电脑赢了\n");
	else
		printf("平局\n");
	DisplayBoard(board, ROW, COL);//最后再打印一遍棋盘
}
//玩家赢了 - 返回'*'
//电脑赢了 - 返回'#'
//平局    - 返回'Q'
//继续    - 返回'C'

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印菜单,1.代表玩游戏,0.代表退出
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩游戏
			game();
			break;
		case 0://退出游戏
			printf("退出游戏\n");
			break;
		default://选择错误,重新选择
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

Bono: Jugador VS Jugador

El archivo game.h es el mismo que el anterior.

archivo 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++)
	{
		//打印数据
		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)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void player1_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家1下棋:>\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] = '*';//玩家1下棋用*代表
				break;
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

void player2_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家2下棋:>\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] = '#';//玩家2下棋用#代表
				break;
			}
			else
			{
				printf("该坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

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;//棋盘满了
}
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][1] != ' ')
		{
			return board[i][1];
		}
	}
	//判断列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][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';
}

archivo 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 ret = 0;
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家1下棋
		player1_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		//玩家2下棋
		player2_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢		
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家1赢了\n");
	else if (ret == '#')
		printf("玩家2赢了\n");
	else
		printf("平局\n");
	DisplayBoard(board, ROW, COL);//最后再打印一遍棋盘
}
//玩家1赢了 - 返回'*'
//玩家2赢了 - 返回'#'
//平局    - 返回'Q'
//继续    - 返回'C'

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印菜单,1.代表玩游戏,0.代表退出
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩游戏
			game();
			break;
		case 0://退出游戏
			printf("退出游戏\n");
			break;
		default://选择错误,重新选择
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

Conclusión:

Era la primera vez que escribía un juego, se sintió muy divertido y también fue una prueba, pero tengo que perseverar, ¡todavía puedo escribir (jaja)! ! !

Supongo que te gusta

Origin blog.csdn.net/m0_64607843/article/details/122637247
Recomendado
Clasificación