Projet en langage C - réalisation d'échecs en trois pièces (échecs multi-pièces)

  Bonjour à tous, je m'appelle Doki sy. Aujourd'hui, je vais vous présenter un jeu simple et amusant en langage C - Sanbianqi (Multi-bangqi). Sanbangqi est un petit jeu qui permet de réviser systématiquement les connaissances de base du langage C. Projet, je suggère que ceux qui débutent en langage C doivent l'essayer par eux-mêmes. Aujourd'hui, je vais partager avec vous le projet d'échecs en trois parties que j'ai mis en œuvre. Si vous avez des questions, n'hésitez pas à me corriger et à me soutenir ~~ Hehe.


  Tout d'abord, les échecs à trois pièces ou à plusieurs pièces sont un échiquier n*n, donc avant d'écrire, nous penserons à la construction d'un tableau bidimensionnel. Grâce au tableau bidimensionnel, nous déterminons les lignes et les colonnes. de l'échiquier, puis déterminer une série de fonctions pour le tableau bidimensionnel. Le tableau dimensionnel exécute des fonctions telles que l'initialisation et l'affectation, juger de la victoire ou de la perte, jouer aux échecs, afficher la sortie, etc., réalisant ainsi la construction de trois- échecs en pièces ou en plusieurs pièces.

  Pour mettre en œuvre ce projet, nous pouvons le diviser en trois fichiers, à savoir test.c, game.c et game.h, ce qui peut rendre notre projet plus clair et mieux contrôler le fonctionnement de l'ensemble du programme. Le fichier test.c stocke la partie principale du code ; le fichier game.c implémente principalement le processus en cours d'exécution du jeu, y compris toutes les définitions de fonctions liées à l'implémentation du processus de jeu ; game.h contient les définitions de macros, la bibliothèque fichiers d'en-tête de fonction qui doivent être utilisés et déclaration de chaque fonction. Le code suivant est implémenté selon les fichiers et modules :

 partie du corps à fonction principale

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

Explication de srand((unsigned int)time(NULL))

  Tout d'abord, dans la fonction principale, srand((unsigned int)time(NULL)) initialise la graine de la fonction aléatoire. Nous prenons ici le temps comme graine aléatoire. Comme le temps change constamment, différentes valeurs aléatoires peuvent être générées. Après cela , nous jouerons aux échecs sur l'ordinateur .Le déploiement de valeurs aléatoires consiste à générer une graine temporelle via le générateur de valeurs aléatoires srand() puis à utiliser rand() pour générer un nombre aléatoire. L'int non signé ici est un type de conversion forcée, ce qui signifie forcer la graine du paramètre à un type entier non signé. Habituellement, nous utilisons la valeur de retour de time(NULL) comme graine pour initialiser la valeur de départ de rand().

 Explication de la fonction principale de la structure principale

  Tout d'abord, nous devons exécuter une série de choix avant de recirculer s'il faut jouer au jeu, etc., nous utilisons donc la boucle do....while(), imprimons d'abord un menu menu() et sélectionnons s'il faut jouer au jeu. jeu. Ici, nous utilisons scanf Entrez un entier pour sélectionner et utilisez l'instruction switch branch pour effectuer une sélection spécifique. Si la valeur d'entrée est 1, le jeu démarrera et entrera dans la fonction game(). Si elle est 0, le jeu quittera. Si d'autres valeurs sont saisies, la sélection de boucle sera rentrée.

Commençons par implémenter le corps principal du jeu :

  Définissez d'abord un tableau de caractères bidimensionnel, dans lequel les lignes et les colonnes sont définies par remplacement de macro dans le fichier d'en-tête. Ici, j'initialise les lignes et les colonnes à 3. On peut également les changer à 5, 10, etc.

#define ROW 3
#define COL 3

Implémentez le jeu en blocs fonctionnels :

1. Utilisez la fonction InitBoard() pour initialiser l'échiquier (écrivez la définition de la fonction dans le fichier d'en-tête, et toutes les fonctions suivantes le seront)

  Commencez à initialiser chaque élément du tableau bidimensionnel en tant qu'espace

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. Utilisez la fonction DisplayBoard() pour imprimer l'échiquier   (le joueur et l'ordinateur peuvent alors appeler cette fonction pour imprimer le résultat à chaque fois qu'ils jouent aux échecs)

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

  Le tableau pour l'impression initiale est le suivant : (Il s'agit d'un tableau 3*3. Si vous devez le modifier en 10*10, il vous suffit de modifier les colonnes et les lignes dans la définition de la macro dans le fichier d'en-tête)

 

3. Utilisez la fonction PlayerMove() pour permettre aux joueurs de jouer aux échecs

  Le tableau[x - 1][y - 1] ici est dû au fait que les coordonnées saisies par le joueur ne suivront pas les règles des indices de tableau commençant à 0 comme les programmeurs, mais sont des lignes et des colonnes visibles à l'œil nu, donc l'ordinateur le fera. Vous devez en soustraire un des coordonnées x et y.

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. Utilisez la fonction ComputerMove() pour réaliser un jeu d'échecs sur ordinateur

  Ici, x = rand() % row signifie choisir au hasard un entier aléatoire entre 0~row-1 pour x. Par exemple, x=rand()%3 prend le reste de 3 et la valeur x résultante est 0~2. Entiers aléatoires entre, il en va de même pour 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. Utilisez la fonction IsWin() pour déterminer le gain ou la perte

  Cette partie du code est très importante pour la mise en œuvre du jeu. Nous devons déterminer si les lignes et les colonnes, ainsi que les principaux éléments diagonaux et sous-diagonaux sont égaux, afin de déterminer qui gagne et qui perd. La boucle for et les instructions if imbriquées pour effectuer la détermination. , peuvent juger n'importe quel nombre défini de lignes et de colonnes. Nous stipulons :

Le joueur gagne --- Retour à '*'
L'ordinateur gagne --- Retour à '#'
Tirage --- Retour à 'Q'
Le jeu continue - Retour à '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. Utilisez la fonction IsFull() pour déterminer la valeur de retour afin de déterminer s'il existe une égalité.

Cette fonction est imbriquée dans la condition de jugement de la dernière instruction if de la fonction IsWin() et est utilisée pour juger s'il s'agit d'une égalité. Si elle renvoie 1, elle entre dans l'instruction if et renvoie "égalité".

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
}

Le code d'implémentation du fichier est le suivant : 

fichier test.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;
}

 fichier game.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';
}

fichier game.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);

Merci à tous! Merci d'avoir lu, messieurs! Je suis novice en programmation. S'il y a des erreurs, vous pouvez laisser un message dans la zone de commentaire. Vous pouvez me corriger ! ! !

 

 

Je suppose que tu aimes

Origine blog.csdn.net/m0_74475605/article/details/131926904
conseillé
Classement