[Langage C] Version simplifiée du jeu d'échecs en trois temps (avec code source)

Annuaire d'articles

avant-propos

1. Qu'est-ce que le backgammon ?

2. Réalisation de la fonction

1. Menu Imprimer

2. Imprimez l'échiquier

3. Jouez aux échecs

4. Jugez gagner ou perdre

3. Test de jeu

4. Code source

1.game.h (fichier d'en-tête, définition de fonction, définition de macro)

2.game.c (implémentation de la fonction)

3.test.c (fonction principale, appel de fonction)

Résumer


avant-propos

        Au fur et à mesure que nous en apprenons davantage sur le langage C, après avoir maîtrisé les connaissances théoriques, nous avons besoin de "petits projets" ou de "petits jeux" pour pratiquer nos mains, et les échecs à trois sont un bon choix. Ci-dessous, je présenterai brièvement le jeu des trois jeux et comment l'implémenter en langage C.


1. Qu'est-ce que le backgammon ?

        Le backgammon est un jeu folklorique traditionnel, également connu sous le nom d'échecs Jiugong, d'échecs cercle chacha, un dragon, tic tac toe et ainsi de suite. Le jeu est divisé en deux camps pour jouer l'un contre l'autre. Les deux camps placent des pièces sur le plateau à 9 grilles à tour de rôle. Il est considéré comme une victoire s'ils sont les premiers à aligner leurs trois pièces en ligne. Même si l'adversaire perd, il y aura un match nul à plusieurs reprises. Situation d'échecs.

        Regles du jeu:

        Si deux personnes ont maîtrisé les compétences, alors en général, c'est un match nul. De manière générale, il est plus avantageux de placer la deuxième marche au milieu (car la première marche ne peut pas être placée au milieu), suivie de la marche suivante dans le coin et la troisième sur le côté. Le plus grand avantage est que vous pouvez jouer à ce jeu simple et amusant où vous voulez.

2. Réalisation de la fonction

1. Menu Imprimer

void menu()
{
	printf("***************************\n");
	printf("*******   1. paly   *******\n");
	printf("*******   0. exit   *******\n");
	printf("***************************\n");
}

2. Imprimez l'échiquier

#define ROW 3	//棋盘的行数
#define COL 3	//棋盘的列数

char board[ROW][COL];    //演示用,不是全局变量

Ici, un "échiquier" à matrice bidimensionnelle est considéré comme un échiquier. "ROW" représente le nombre de lignes de l'échiquier et "COL" représente le nombre de colonnes de l'échiquier, ce qui est pratique pour personnaliser le nombre de lignes et de colonnes à l'avenir.

//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		//1.打印数据
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//2.打印分割线
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

3. Jouez aux échecs

Laissez le joueur (sous la forme de coordonnées d'entrée) jouer d'abord aux échecs, puis l'ordinateur joue aux échecs au hasard.

//玩家输入坐标下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x, y;
	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] = 'X';
				break;
			}
			//不能落子
			else
			{
				printf("坐标被占有,不能落子,请重新输入坐标\n");
			}
		}
		//坐标非法
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x, y;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

4. Jugez gagner ou perdre

Après chaque partie d'échecs, il faut juger s'il faut gagner ou perdre (il y a 3 pièces identiques sur la ligne, la colonne et la diagonale), et la situation d'égalité (le gagnant n'a pas encore été déterminé une fois l'échiquier rempli ).

//判断棋盘是否被占满
//未占满 --- 0
//占  满 --- 1
int IsFull(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
//玩家赢 --- 'X'
//电脑赢 --- 'O'
//平  局 --- 'Q'
//继  续 --- 'C'
char IsWin(char board[ROW][COL], int row, int col)
{
	//赢
	int i;
	//行
	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[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
		return board[0][2];
	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

3. Test de jeu

 

4. Code source

Compilateur : Visual Studio 2022

1.game.h (fichier d'en-tête, définition de fonction, définition de macro)

#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 PrintBoard(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);
//判断输赢
//玩家赢 --- 'X'
//电脑赢 --- 'O'
//平  局 --- 'Q'
//继  续 --- 'C'
char IsWin(char board[ROW][COL], int row, int col);

2.game.c (implémentation de la fonction)

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//初始化棋盘为空格
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		//1.打印数据
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//2.打印分割线
		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, y;
	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] = 'X';
				break;
			}
			//不能落子
			else
			{
				printf("坐标被占有,不能落子,请重新输入坐标\n");
			}
		}
		//坐标非法
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

//电脑随机下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x, y;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'O';
			break;
		}
	}
}

//判断棋盘是否被占满
//未占满 --- 0
//占  满 --- 1
int IsFull(char board[ROW][COL], int row, int col)
{
	int i, j;
	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;
	//行
	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[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
		return board[0][2];
	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}

3.test.c (fonction principale, appel de fonction)

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("***************************\n");
	printf("*******   1. paly   *******\n");
	printf("*******   0. exit   *******\n");
	printf("***************************\n");
}

void game()
{
	char board[ROW][COL];
	InitBoard(board, ROW, COL);		//初始化棋盘
	PrintBoard(board, ROW, COL);	//打印棋盘
	//下棋
	char ret;
	while (1)
	{
		PlayerMove(board, ROW, COL);	//玩家下棋
		PrintBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		ComputerMove(board, ROW, COL);	//电脑下棋
		PrintBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == 'X')
		printf("玩家赢\n");
	else if (ret == 'O')
		printf("电脑赢\n");
	else
		printf("平局\n");
}

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

Résumer

        Ce qui précède est l'intégralité du contenu de la version simple du backgammon implémentée en langage C. Il y a encore beaucoup de place pour l'amélioration de ce code. Je le mettrai à jour plus tard : "Upgrading backgammon from three-moon chess" et "smarter AI" , alors restez à l'écoute!

Je suppose que tu aimes

Origine blog.csdn.net/m0_73156359/article/details/130932205
conseillé
Classement