Jeu en langage C d'entrée de gamme ——implémentation d'échecs en trois pièces (explications détaillées avec images et textes, le code peut être copié)

Je crois que tout le monde a eu l'expérience de jouer avec des camarades de classe en classe. Avez-vous déjà pensé à écrire un jeu de va-et-vient sur un ordinateur ? Bienvenue sur ce blog, et travaillons avec le blogueur pour implémenter une version simple des échecs à trois pièces en langage C !

1. Description du problème

Utiliser les connaissances acquises en langage C pour mettre en œuvre un jeu d'échecs simple en trois parties

2. Processus de mise en œuvre de base

Avant de commencer à taper du code, clarifions d’abord la logique de base de notre codage :

1. Créez une interface de menu dans laquelle vous pouvez choisir de démarrer ou de quitter le jeu.
2. Créez un échiquier en trois parties et initialisez un échiquier vide.
3. Imprimez l'échiquier.
4. Le joueur effectue un mouvement (le joueur entre les coordonnées de la ligne et de la colonne pour effectuer un mouvement) et l'imprime. « x » signifie que le joueur effectue un mouvement. 5. L'ordinateur effectue un mouvement (une position
aléatoire) et l'imprime. .'o' signifie que l'ordinateur fait un mouvement.
6. Déterminez le résultat (perdre, gagner, faire match nul), « q » signifie match nul.
7. Revenez à l'étape 2 pour poursuivre l'exécution.

3. Principales étapes de mise en œuvre

3.1 Interface des menus

int menu(){
    
    
	printf("-------------------------\n");
	printf("--------1.开始游戏--------\n");
	printf("--------0.退出游戏--------\n");
	printf("-------------------------\n");
	int input = 0;
	printf("请输入你的选择:");
	scanf("%d", &input);
	return input;
}

3.2 Créer un échiquier

Parce que ce que nous implémentons est un jeu d'échecs en trois pièces, nous imprimons un échiquier 3*3 et utilisons le type char pour l'implémenter.

#define MAX_ROW 3
#define MAX_COL 3
char chessBoard[MAX_ROW][MAX_COL] = {
    
     0 };

Remarque :使用宏定义的原因 :

1. Améliorer la lisibilité du code et faciliter la compréhension de la signification MAX_ROWlorsqu'elle est rencontrée dans les codes suivants MAX_COL.
2. Améliorer l'évolutivité.Si vous souhaitez modifier la taille de l'échiquier à l'avenir, la modification du code sera très pratique.

3.3 Initialisation de l'échiquier

Nous pouvons simplement le laisser vide

void init(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		for (int col = 0; col < MAX_COL; col++)
		{
    
    
			chessBoard[row][col] = ' ';
		}
	}
}

3.4 Imprimer l'échiquier

Remarque : Nous utilisons la zone vierge pour imprimer l'échiquier, de sorte que l'échiquier que nous voyons ne peut être que noir sans lignes de séparation claires, nous devons donc ajouter des symboles appropriés lors de l'impression de l'échiquier pour rendre notre motif plus beau (bien sûr, Compétent les vétérans peuvent essayer d'utiliser la fonction easyx() pour se débarrasser de la fenêtre noire dans notre petit jeu), nous choisissons donc une méthode d'impression plus belle. L'implémentation spécifique est la suivante :

void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	printf("+---+---+---+\n");
	for (int row = 0; row <MAX_ROW; row++) 
	{
    
    
		printf("| %c | %c | %c |\n", chessBoard[row][0],
			chessBoard[row][1], chessBoard[row][2]);
		printf("+---+---+---+\n");
	}
}

Regardons les rendus, n'est-ce pas relativement beau ?
Insérer la description de l'image ici
L’échiquier est également prêt, il est temps pour nous de jouer aux échecs ->

3.5. Les mouvements du joueur

Le joueur entre les coordonnées de ligne et de colonne pour indiquer les coordonnées du mouvement, et utilise « x » pour indiquer le mouvement du joueur.

Avis:

1. Le mouvement du joueur doit être dans le cadre de l'échiquier.
2. Les joueurs doivent placer des pierres dans l'espace vide au-dessus de l'échiquier.
3. Si les coordonnées saisies ne sont pas satisfaisantes, saisissez-les à nouveau.

void playerMove(char chessBoard[MAX_ROW][MAX_COL]){
    
    
	while (1)
	{
    
    
		int row = 0;
		int col = 0;
		printf("请输入坐标(row col):");
		scanf("%d %d", &row, &col);
		if (row < 1 || row >= MAX_ROW+1 || col < 1 || col >= MAX_COL+1)
		{
    
    
			printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");
			continue;
		}
		if (chessBoard[row][col] != ' ')
		{
    
    
			printf("您的坐标位置已经有子了!\n");
			continue;
		}
		chessBoard[row-1][col-1] = 'x';
		break;
	}
}

3.6 Déplacements de l'ordinateur (aléatoires)

Nous ne pouvons pas terminer le jeu d'échecs intelligent par l'IA simplement en commençant par la connaissance du langage C. Nous ne pouvons terminer notre simple jeu d'échecs en trois pièces que par des mouvements aléatoires.
L'ordinateur génère de manière aléatoire les coordonnées des lignes et des colonnes, et « o » représente le mouvement de l'ordinateur.
Avis:

1. Utilisez le fichier d'en-tête de temps dans la fonction principale pour utiliser le temps comme valeur de départ de nombre aléatoire afin de garantir que les coordonnées de ligne et de colonne obtenues sont véritablement aléatoires.
2. Le reste du jeu d'échecs est similaire à la façon dont les joueurs jouent aux échecs.

void computerMove(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	while (1)
	{
    
    
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ')
		{
    
    
			continue;
		}
		chessBoard[row][col] = 'o';
		break;
	}
}

A cette époque, les deux parties ont déjà joué aux échecs, et nous devrions juger s'il y a une victoire ou une défaite, ou un match nul.

3.7 Le jugement de victoire ou de défaite est un match nul

On sait que quatre situations se produiront après chaque coup, à savoir : le joueur gagne, l'ordinateur gagne, un match nul ou continue.
La détermination de la victoire ou de la défaite est la suivante :

1. Déterminez toutes les lignes
2. Déterminez toutes les colonnes
3. Déterminez deux diagonales

La détermination d’une égalité est la suivante :

1. Si un élément du tableau est " ", alors il n'est pas plein. Si aucun des éléments n'est " ", alors il est plein.
2. Si l'échiquier est plein et qu'il n'y a pas de gagnant, ce sera un match nul.

int isFull(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		for (int col = 0; col < MAX_COL; col++)
		{
    
    
			if (chessBoard[row][col] == ' ')
			{
    
    
				return 0;
			}

		}
	}
	return 1;
}

char isWin(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	 {
    
    
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2]) 
		{
    
    
			return chessBoard[row][0];
		}
	}
	for (int col = 0; col < MAX_COL; col++) 
	{
    
    
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col]) 
		{
    
    
			return chessBoard[0][col];
		}
	}
	
	if (chessBoard[0][0] != ' '
		&& chessBoard[0][0] == chessBoard[1][1]
		&& chessBoard[0][0] == chessBoard[2][2]) 
	{
    
    
		return chessBoard[0][0];
	}
	
	if (chessBoard[2][0] != ' '
		&& chessBoard[2][0] == chessBoard[1][1]
		&& chessBoard[2][0] == chessBoard[0][2]) 
	{
    
    
		return chessBoard[2][0];
	}
	
	if (isFull(chessBoard)) 
	{
    
    
		return 'q';
	}
	
	return ' ';
}

3.8 Fonction principale du jeu

Nous utilisons une fonction pour appeler d'autres fonctions dont nous avons besoin, comme suit :

void game() {
    
    
	char chessBoard[MAX_ROW][MAX_COL] = {
    
     0 };
	init(chessBoard);
	char winner = ' ';
	while (1) {
    
    
		system("cls");
		print_chessBoard(chessBoard);
		playerMove(chessBoard);
		winner = isWin(chessBoard);
		if (winner != ' ') {
    
    
			break;
		}
		computerMove(chessBoard);
		winner = isWin(chessBoard);
		if (winner != ' ') {
    
    
			break;
		}
	}
	print_chessBoard(chessBoard);
	if (winner == 'x') {
    
    
		printf("恭喜您, 您赢了!\n");
	}
	else if (winner == 'o') {
    
    
		printf("哈哈,您连人工智障都下不过!\n");
	}
	else {
    
    
		printf("您只能和人工智障打平手!!\n");
	}
}

4. Démonstration des résultats

Nous effectuons une série de démonstrations aléatoires, et les résultats sont les suivants :
Insérer la description de l'image ici

5. Implémentation globale du code

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_ROW 3
#define MAX_COL 3

//主菜单
int menu() {
    
    
	printf("-------------------------\n");
	printf("--------1.开始游戏--------\n");
	printf("--------0.退出游戏--------\n");
	printf("-------------------------\n");
	int input = 0;
	printf("请输入你的选择:");
	scanf("%d", &input);
	return input;
}

//初始化棋盘
void init(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		for (int col = 0; col < MAX_COL; col++)
		{
    
    
			chessBoard[row][col] = ' ';
		}
	}
}

//打印棋盘
void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	printf("+---+---+---+\n");
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		printf("| %c | %c | %c |\n", chessBoard[row][0],
			chessBoard[row][1], chessBoard[row][2]);
		printf("+---+---+---+\n");
	}
}

//玩家落子
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
    
    
	while (1) {
    
    
		int row = 0;
		int col = 0;
		printf("请输入坐标(row col):");
		scanf("%d %d", &row, &col);
		if (row < 1 || row >= MAX_ROW+1 || col < 1 || col >= MAX_COL+1) {
    
    
			printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");
			continue;
		}
		if (chessBoard[row-1][col-1] != ' ') {
    
    
			printf("您的坐标位置已经有子了!\n");
			continue;
		}
		chessBoard[row-1][col-1] = 'x';
		break;
	}
}

//电脑随机落子
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) 
{
    
    
	while (1) 
	{
    
    
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') 
		{
    
    
			continue;
		}
		chessBoard[row][col] = 'o';
		break;
	}
}

//判断落子后的四种情况
int isFull(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		for (int col = 0; col < MAX_COL; col++)
		{
    
    
			if (chessBoard[row][col] == ' ')
			{
    
    
				return 0;
			}

		}
	}
	return 1;
}
char isWin(char chessBoard[MAX_ROW][MAX_COL])
{
    
    
	for (int row = 0; row < MAX_ROW; row++)
	{
    
    
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2])
		{
    
    
			return chessBoard[row][0];
		}
	}
	for (int col = 0; col < MAX_COL; col++)
	{
    
    
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col])
		{
    
    
			return chessBoard[0][col];
		}
	}

	if (chessBoard[0][0] != ' '
		&& chessBoard[0][0] == chessBoard[1][1]
		&& chessBoard[0][0] == chessBoard[2][2])
	{
    
    
		return chessBoard[0][0];
	}

	if (chessBoard[2][0] != ' '
		&& chessBoard[2][0] == chessBoard[1][1]
		&& chessBoard[2][0] == chessBoard[0][2])
	{
    
    
		return chessBoard[2][0];
	}

	if (isFull(chessBoard))
	{
    
    
		return 'q';
	}

	return ' ';
}

//游戏实现总函数
void game() {
    
    
	char chessBoard[MAX_ROW][MAX_COL] = {
    
     0 };
	init(chessBoard);
	char winner = ' ';
	while (1) {
    
    
		system("cls");
		print_chessBoard(chessBoard);
		playerMove(chessBoard);
		winner = isWin(chessBoard);
		if (winner != ' ') {
    
    
			break;
		}
		computerMove(chessBoard);
		winner = isWin(chessBoard);
		if (winner != ' ') {
    
    
			break;
		}
	}
	print_chessBoard(chessBoard);
	if (winner == 'x') {
    
    
		printf("恭喜您, 您赢了!\n");
	}
	else if (winner == 'o') {
    
    
		printf("哈哈,您连人工智障都下不过!\n");
	}
	else {
    
    
		printf("您只能和人工智障打平手!!\n");
	}
}


int main()
{
    
    
	srand((unsigned int)time(0));
	while (1) {
    
    
		int input = menu();
		if (input == 1) {
    
    
			game();
		}
		else if (input == 0) {
    
    
			printf("退出游戏,GOODBYE!!!!!\n");
			break;
		}
		else {
    
    
			printf("输入错误!请重新输入!\n");
			continue;
		}
	}
	system("pause");
	return 0;
}

Résumer

C'est ainsi que les échecs simples en trois pièces sont mis en œuvre. Allez défier notre "retard artificiel". Le blogueur mettra à jour la mise en œuvre du dragueur de mines à l'avenir. Si vous êtes intéressé, n'oubliez pas de donner au blogueur un trois-en- une rangée!

Je suppose que tu aimes

Origine blog.csdn.net/m0_65038072/article/details/127479006
conseillé
Classement