Proyecto en lenguaje C: realización de ajedrez de tres piezas (ajedrez de varias piezas)

  Hola a todos, mi nombre es Doki sy. Hoy les traeré un juego de lenguaje C simple y divertido: Sanbianqi (Multi-bangqi). Sanbangqi es un pequeño juego que puede revisar sistemáticamente los conocimientos básicos del lenguaje C. Proyecto, sugiero que aquellos que son nuevos en el lenguaje C deben probarlo por su cuenta. Hoy compartiré con ustedes el proyecto de ajedrez de tres piezas que implementé. Si tienen alguna pregunta, no duden en corregirme y apoyarme ~~ Jeje.


  En primer lugar, el ajedrez de tres o varias piezas es un tablero de ajedrez n*n, por lo que antes de escribir, pensaremos en la construcción de una matriz bidimensional. A través de la matriz bidimensional, determinamos las filas y columnas. del tablero de ajedrez, y luego determine una serie de funciones para la matriz bidimensional. La matriz dimensional realiza funciones como inicialización y asignación, juzgar si se gana o pierde, jugar al ajedrez, mostrar resultados, etc., logrando así la construcción de tres- Ajedrez de piezas o de varias piezas.

  Para implementar este proyecto, podemos dividirlo en tres archivos, a saber, test.c, game.c y game.h, lo que puede hacer que nuestro proyecto sea más claro y controlar mejor el funcionamiento de todo el programa. El archivo test.c almacena la parte principal del código del marco; el archivo game.c implementa principalmente el proceso de ejecución del juego, incluidas todas las definiciones de funciones relacionadas con la implementación del proceso del juego; game.h contiene definiciones de macros, la biblioteca archivos de encabezado de función que deben usarse y declaración de cada función. El siguiente código se implementa según archivos y módulos:

 parte del cuerpo función principal

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

Explicación de srand((unsigned int)time(NULL))

  Primero, en la función principal, srand((unsigned int)time(NULL)) inicializa la semilla de la función aleatoria. Aquí tomamos el tiempo como semilla aleatoria. Dado que el tiempo cambia constantemente, se pueden generar diferentes valores aleatorios. Después de eso , jugaremos ajedrez en la computadora . La implementación de valores aleatorios es generar una semilla de tiempo a través del generador de valores aleatorios srand () y luego usar rand () para generar un número aleatorio. El int sin signo aquí es un tipo de conversión forzada, lo que significa forzar la semilla del parámetro a un tipo entero sin signo. Generalmente usamos el valor de retorno de tiempo (NULL) como semilla para inicializar el valor inicial de rand ().

 Explicación de la función principal de la estructura principal.

  En primer lugar, necesitamos ejecutar una serie de opciones antes de recircular si queremos jugar el juego, etc., por lo que usamos el bucle do.... while(), primero imprimimos un menú menu() y seleccionamos si queremos jugar el juego. juego. Aquí usamos scanf Ingrese un número entero para seleccionar, y use la instrucción switch branch para hacer una selección específica. Si el valor de entrada es 1, el juego comenzará e ingresará a la función game(). Si es 0, el juego saldrá Si se ingresan otros valores, se volverá a ingresar la selección del bucle.

Comencemos a implementar el cuerpo principal del juego:

  Primero defina un tablero de matriz bidimensional de caracteres, en el que las filas y columnas se definen mediante reemplazo de macro en el archivo de encabezado. Aquí inicializo las filas y columnas a 3. También podemos cambiarlas a 5, 10, etc.

#define ROW 3
#define COL 3

Implemente el juego en bloques de funciones:

1. Utilice la función InitBoard() para inicializar el tablero de ajedrez (escriba la definición de la función en el archivo de encabezado y todas las funciones posteriores lo serán)

  Comience a inicializar cada elemento de la matriz bidimensional como un espacio

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] = ' ';
		}
	}
}

2. Utilice la función DisplayBoard() para imprimir el tablero de ajedrez   (luego el jugador y la computadora pueden llamar a esta función para imprimir el resultado cada vez que juegan ajedrez)

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]);//注意为使数据居于中间,需在%c两边加空格
			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");
	}
}

  La tabla para la impresión inicial es la siguiente: (Esta es una tabla de 3*3. Si necesita modificarla a 10*10, solo necesita modificar las columnas y filas en la definición de macro en el archivo de encabezado)

 

3. Utilice la función PlayerMove() para permitir que los jugadores jueguen ajedrez.

  El tablero [x - 1] [y - 1] aquí se debe a que las coordenadas ingresadas por el jugador no seguirán las reglas de los subíndices de matriz que comienzan desde 0 como los programadores, sino que son filas y columnas visibles a simple vista, por lo que la computadora Necesitas restar uno de las coordenadas xey.

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋:\n");
	while (1)
	{
		printf("请输入下棋坐标(中间用空格分开)如(1 1)\n");
		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. Utilice la función ComputerMove() para realizar juegos de ajedrez por computadora.

  Aquí x = rand() % fila significa elegir aleatoriamente un entero aleatorio entre 0 ~ fila-1 para x. Por ejemplo, x=rand()%3 toma el resto de 3 y el valor x resultante es 0~2. Enteros aleatorios entre, lo mismo se aplica a y.

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;
		}
	}
}

 5. Utilice la función IsWin() para determinar si se gana o se pierde.

  Esta parte del código es muy importante para la implementación del juego. Necesitamos determinar si las filas y columnas, así como los elementos diagonales principales y subdiagonales son iguales, para determinar quién gana y quién pierde. Aquí usamos un bucle for y declaraciones if anidadas para tomar la determinación. , puede juzgar cualquier número establecido de filas y columnas. Estipulamos:

El jugador gana --- Regresa a '*'
La computadora gana --- Regresa a '#'
Empate --- Regresa a 'Q'
El juego continúa - Regresa a 'C'

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int n = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;//计数器
		int r = 0;
		for (n = 0; n < col; n++)
		{
			if (board[i][n] == '*')
			{
				j++;
			}
			if (board[i][n] == '#')
			{
				r++;
			}
		}
		if (j == row)
		{
			return '*';
		}
		if (r == row)
		{
			return '#';
		}
	}
	for (i = 0; i < row; i++)
	{
		//清零
		int r = 0;
		int j = 0;
		for (n = 0; n < col; n++)
		{
			if (board[n][i] == '*')
			{
				r++;
			}
			if (board[n][i] == '#')
			{
				j++;
			}
		}
		if (r == col)
		{
			return '*';
		}
		if (j == col)
		{
			return '#';
		}
	}
	//判断正对角线
	int r = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (n = 0; n < col; n++)
		{
			if (i == n)
			{
				if (board[i][n] == '*')
				{
					r++;
				}
				if (board[i][n] == '#')
				{
					j++;
				}
			}
		}
	}
	if (r == row)
	{
		return '*';
	}
	if (j == row)
	{
		return '#';
	}
	//判断反对角线
	r = 0;
	j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][row - 1 - i] == '*')
		{
			r++;
		}
		if (board[i][row - 1 - i] == '#')
		{
			j++;
		}
	}
	if (r == row)
	{
		return '*';
	}
	if (j == row)
	{
		return '#';
	}

	//判断平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}

	return 'C';
}

6. Utilice la función IsFull() para determinar el valor de retorno para determinar si hay un empate.

Esta función está anidada en la condición de juicio de la última declaración if en la función IsWin () y se usa para juzgar si hay un empate. Si devuelve 1, ingresa la declaración if y devuelve "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;//如果遍历完整个二维数组没有空格,返回1
}

El código de implementación del archivo es el siguiente: 

archivo prueba.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("**************************************\n");
	printf("**********请选择是否玩游戏:**********\n");
	printf("*************1.开始游戏***************\n");
	printf("*************0.退出游戏***************\n");
	printf("**************************************\n");

}
void game()
{
	char board[ROW][COL];
	int ret = 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);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏!\n");
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

 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;
	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("请输入下棋坐标(中间用空格分开)如(1 1)\n");
		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;
}
//玩家赢 - '*'
//电脑赢 - '#'
//平局 --- 'Q'
//游戏继续-'C'

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int n = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;//计数器
		int r = 0;
		for (n = 0; n < col; n++)
		{
			if (board[i][n] == '*')
			{
				j++;
			}
			if (board[i][n] == '#')
			{
				r++;
			}
		}
		if (j == row)
		{
			return '*';
		}
		if (r == row)
		{
			return '#';
		}
	}
	for (i = 0; i < row; i++)
	{
		//清零
		int r = 0;
		int j = 0;
		for (n = 0; n < col; n++)
		{
			if (board[n][i] == '*')
			{
				r++;
			}
			if (board[n][i] == '#')
			{
				j++;
			}
		}
		if (r == col)
		{
			return '*';
		}
		if (j == col)
		{
			return '#';
		}
	}
	//判断正对角线
	int r = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (n = 0; n < col; n++)
		{
			if (i == n)
			{
				if (board[i][n] == '*')
				{
					r++;
				}
				if (board[i][n] == '#')
				{
					j++;
				}
			}
		}
	}
	if (r == row)
	{
		return '*';
	}
	if (j == row)
	{
		return '#';
	}
	//判断反对角线
	r = 0;
	j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][row - 1 - i] == '*')
		{
			r++;
		}
		if (board[i][row - 1 - i] == '#')
		{
			j++;
		}
	}
	if (r == row)
	{
		return '*';
	}
	if (j == row)
	{
		return '#';
	}

	//判断平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}

	return 'C';
}

archivo juego.h

#pragma once
#include<stdio.h>
#include<time.h>
#define ROW 10
#define COL 10
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);

¡gracias a todos! ¡Gracias por leer, señores! Soy un novato en programación. Si hay algún error, puedes dejar un mensaje en el área de comentarios. ¡Puedes corregirme! ! !

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_74475605/article/details/131926904
Recomendado
Clasificación