[Ajedrez de tres piezas] Implementación simple del ajedrez de tres piezas en lenguaje C

Prefacio

Todo el mundo debería estar familiarizado con el Sanbangqi. El Sanbangqi es un antiguo juego folclórico tradicional, también conocido como Otelo, Cruz circular, Tres en raya, Un dragón, Nueve palacios, etc. El juego se divide en una batalla entre dos bandos. Ambos bandos colocan sus piezas de ajedrez en un tablero de 9 casillas, por turnos. El primer bando que conecte sus tres piezas de ajedrez en una línea se considera el ganador.

Insertar descripción de la imagen aquí
Adoptamos la idea de programación modular para colocar el código de cada módulo en diferentes archivos .c y proporcionar la declaración de funciones externas invocables en el archivo .h. Cuando otros archivos .c quieren usar el código que contiene, solo es necesario #incluir el archivo "xxx .h". El uso de programación modular puede mejorar enormemente la legibilidad, mantenibilidad, portabilidad, etc. del código.

Ideas de juegos

1. Crear una función de menú que nos permita elegir entrar o salir del juego
2. Inicializar el tablero
3. Imprimir el tablero    Nota: asegúrese de inicializar primero y luego imprimir el tablero de ajedrez.
4. Los jugadores juegan ajedrez con la computadora
5. Determinar si el jugador gana o pierde.

Implementación del juego

Menú de interfaz de menú()

El menú de funciones que genera la interfaz del menú es en realidad una de nuestras interfaces, al igual que la interfaz de selección cuando comenzamos a jugar. El código de muestra es el siguiente↓

void menu()
{
    
    
	printf("======================================\n");
	printf("==============1.play==================\n");
	printf("==============0.exit==================\n");
	printf("====玩家:*  ==========电脑:#   =====\n");
}

Implementar tablero de ajedrez de varias piezas.

El tablero de ajedrez está dispuesto en tres filas horizontales y tres columnas verticales, en forma de una cuadrícula de nueve cuadrados. Podemos usar macros para establecer el tamaño del tablero de ajedrez, si queremos cambiar el tamaño del tablero más adelante, esto nos facilitará modificarlo más adelante.

#define ROW 3
#define COL 3

Los beneficios de usar la definición de macro #define aquí:
1. Es conveniente modificar el programa, no es necesario modificar todo el programa, solo es necesario modificar la definición de macro.
2. Mejorar la eficiencia operativa del programa y hacerlo más conveniente para la modularización.
3. Sobre la base del ajedrez de tres piezas, solo necesita cambiar el valor de la definición macro para lograr el efecto del ajedrez de varias piezas.

Inicialización del tablero de ajedrez.

//初始化棋盘
void InitBoard(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] = ' ';
		}
	}
}

Impresión de tablero de ajedrez

El ajedrez de tres piezas es esencialmente una matriz bidimensional. Imprimir el tablero de ajedrez es en realidad imprimir una matriz bidimensional. Definimos una función DisplayBoard para lograr esto.

//打印棋盘
void DisplayBoard(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++)
		{
    
    
			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 efecto es el siguiente↓
Insertar descripción de la imagen aquí

Jugadores jugando ajedrez

//玩家下棋
void PlayerMove(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");
		}
	}
}

ajedrez por computadora

//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    
    
	printf("电脑下棋\n");
	int x = 0;
	int y = 0;
	while (1)
	{
    
    
		//使用rand函数生成随机数
		x = rand() % row; //0~row-1
		y = rand() % col; //0~col-1
		if (board[x][y] == ' ')
		{
    
    
			board[x][y] = '#';
			break;
		}
	}
}

Juez ganando o perdiendo

Primero determinemos si es un empate.

static int IsFull(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++)
		{
    
    
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

Debido a que la función tiene el atributo de enlace externo de forma predeterminada, pero después de ser modificada por estática, la función perderá el atributo de enlace externo y se convertirá en un atributo de enlace interno. Debido a que la función IsFull aquí solo se usa en el archivo fuente, se puede modificar con estática.

Luego decide si ganar o perder.

//判断输赢
char IsWin(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 (IsFull(board, row, col))
	{
    
    
		return 'Q';
	}

	return 'C';
}

Demostración de resultados

El jugador gana el sorteo
Insertar descripción de la imagen aquí
por computadora
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Ejemplo de código completo

Insertar descripción de la imagen aquí
Prueba.c

Test.c es el punto de entrada del programa.

#include "game.h"

void menu()
{
    
    
	printf("======================================\n");
	printf("==============1.play==================\n");
	printf("==============0.exit==================\n");
	printf("====玩家:*  ==========电脑:#   =====\n");
}

void game()
{
    
    
	int ret = 0;
	char board[ROW][COL] = {
    
     0 };
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
    
    
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
    
    
			break;
		}
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		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("请选择--->");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:
			printf("选择错误,请重新选择!");
		}
	} while (input);
	return 0;
}

juego.h

El juego contiene archivos de encabezado para declaraciones de funciones y declaraciones de símbolos.

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.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 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);

juego.c

Implementación de funciones relacionadas necesarias en el juego.

#include "game.h"

//初始化棋盘
void InitBoard(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 DisplayBoard(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++)
		{
    
    
			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 PlayerMove(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 ComputerMove(char board[ROW][COL], int row, int col)
{
    
    
	printf("电脑下棋\n");

	int x = 0;
	int y = 0;

	while (1)
	{
    
    
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
    
    
			board[x][y] = '#';
			break;
		}
	}
}
//判断是否平局
static int IsFull(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++)
		{
    
    
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
char IsWin(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 (IsFull(board, row, col))
	{
    
    
		return 'Q';
	}

	return 'C';
}

Supongo que te gusta

Origin blog.csdn.net/qq_58032742/article/details/131915757
Recomendado
Clasificación