Réalisation de Duoziqi en langage C

Il y a quelques étapes dans la réalisation de Duo Ziqi

(1) Conception générale du jeu

#include<stdio.h>
int main()
{
	int input = 0;
	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;
}

Tout d'abord, utilisez l'instruction do while() pour réaliser l'utilisation répétée du jeu, puis utilisez la fonction Switch pour créer l'interface de démarrage du jeu et l'utiliser avec le menu.

(2) Conception du menu du jeu

void menu()
{
	printf("********************************\n");
	printf("***** 1、进入游戏 **************\n");
	printf("***** 0、退出游戏 **************\n");
	printf("********************************\n");
}

Le menu du jeu utilise toujours la fonction printf() pour réaliser simplement la fonction de menu.

(3) Conception de jeux

Étant donné que l'échiquier est petit conformément à la signification de l'espace à deux dimensions, il est réalisé en utilisant un tableau à deux dimensions.Définissez d'abord le tableau comme un tableau à deux dimensions.

int arr[ROW][COL] = {0} ;

ROW et COL utilisent la voie de la définition de macro, juste pour pouvoir réaliser plusieurs ziqi, pas seulement limités aux échecs à trois ou quatre lunes et ainsi de suite.

#define ROW 3
#define COL 3

Ici, nous le définissons d'abord comme trois pour expliquer, et plus tard, vous pouvez modifier le nombre à volonté.

L'échiquier est d'abord un tableau blanc, nous devons d'abord initialiser le tableau et l'initialiser à un espace juste pour laisser de la place pour jouer aux échecs.

Construisez d'abord une fonction d'initialisation initialize(arr, ROW, COL). Continuez ensuite à construire la fonction de cette fonction.

void initialize(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

Une fois l'initialisation terminée, il n'y a actuellement que 9 espaces supplémentaires, et il est nécessaire d'imprimer l'apparence initiale de l'échiquier et de créer une fonction pour imprimer l'échiquier.

void copychec(char arr[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 ", arr[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");
		}
	}
}

Une fois l'impression de l'échiquier terminée, le jeu d'échecs commencera officiellement.

Tout d'abord, le joueur joue aux échecs, construisez la fonction.

Parce que nous avons appris quelques connaissances en informatique, nous savons que le tableau commence à partir de l'indice 0, et les non-informaticiens ne le savent probablement pas. Par conséquent, la gamme d'échecs de nos joueurs, les coordonnées horizontales et verticales doivent être supérieures ou égales à 1, et inférieur ou égal à ROW ou COL (C'est le nombre de pièces d'échecs que vous avez défini au début, mais nous l'avons écrit avec trois pièces d'échecs au début, donc notre plage est supérieure ou égale à 1 et inférieur ou égal à 3).

void playmove(char arr[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 (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*' ;
				break;
			}
			else
			{
				printf("位置被占,请重新输入\n");
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
	}
}

Après avoir joué aux échecs, afin de faciliter la prochaine étape, nous devons imprimer l'échiquier à ce moment

Appelez à nouveau la fonction copycheck().

Puis c'est au tour de l'ordinateur de jouer aux échecs, qui est aussi la fonction de construction. Parmi eux, nous utilisons également la fonction rand() pour que les coordonnées sous l'ordinateur soient des valeurs aléatoires. Avant d'utiliser la fonction rand, vous devez ajouter srand ((unsigned int )time(NULL)) à la fonction principale ; les noms des fichiers d'en-tête sont : #include<stdlib.h> et #include<time.h>

void computemove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#'; 
			break;
		}
	}
}

Il faut aussi imprimer l'échiquier et appeler la fonction copycheck().

-------------------------------------------------- ------------------------------

Il nous est impossible de jouer aux échecs en un seul coup, nous mettons donc ce qui précède dans la fonction while()

À ce stade, le cadre du jeu est simple à construire

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘

	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
	}
}

Bien sûr, il y a des gagnants et des perdants dans le jeu.

Il doit être jugé après que le joueur a fini de jouer et que l'ordinateur a fini de jouer aux échecs. Concevez donc une fonction pour satisfaire cette fonction.

Il y a quatre situations dans le jugement, "le joueur gagne, l'ordinateur gagne, match nul, continue", qui sont représentées par la valeur de retour "*, #, m, n" respectivement. Dans le processus de jugement, nous utilisons le comptage pour juger qui gagne , qui répond également aux exigences changeantes du Duo Ziqi, non limité à un certain nombre de pièces d'échecs, donc l'écriture est plus flexible. Lors du jugement des colonnes, nous avons échangé les positions de boucle de i et j, de sorte qu'il puisse être jugé colonne par colonne.

Et enfin, lors du jugement de l'égalité, nous utilisons la fonction Inspect() pour vérifier s'il y a des grilles vides sur tout l'échiquier, et renvoyons 0 s'il y en a, et renvoyons 1 sinon.

//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//

int Inspect(char arr[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 (arr[i][j] == ' ')
				return 0;
		
		}
	}
	return 1;
}

char Deter(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row ; i++)
	{
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row - 1)
				return arr[i][j];
		}
	}
	//判断列
	for (j = 0; j < col ; j++)
	{
		int count = 0;
		for (i = 0; i < row - 1; i++)
		{
			if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row -1)
				return arr[i][j];
		}
	}
	//判断对角线
		int countn = 0;
	for (i = 0; i < row - 1; i++)
	{
		//判断右对角线

		for (j = 0; j < col; j++)
		{
			if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
			{
				countn++;
			}
			if(countn == row - 1)
				return arr[i][j];
		}
	}
	//判断左对角线
	int count = 0;
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row - 1)
				return arr[i][j];
		}
	}
	//平局
	if (Inspect(arr, ROW, COL) == 1)
	{
		return 'm';
	}
    //继续
	return 'n';
}

Enfin, la fonction du jeu a été conçue avec succès.

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘
	char net = 0;
	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;
	}
		if (net == '*')
		{
			printf("玩家赢了\n");
		}
		else if (net == '#')
		{
			printf("电脑赢了\n");
		}
		else if (net == 'm')
		{
			printf("平局\n");
		
		}
	
}

Le code global du jeu est :

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************************\n");
	printf("***** 1、进入游戏 **************\n");
	printf("***** 0、退出游戏 **************\n");
	printf("********************************\n");
}

void initialize(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void copychec(char arr[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 ", arr[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 playmove(char arr[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 (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("位置被占,请重新输入\n");
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
	}
}

void computemove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}


//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//

int Inspect(char arr[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 (arr[i][j] == ' ')
				return 0;

		}
	}
	return 1;
}

char Deter(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row; i++)
	{
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//判断列
	for (j = 0; j < col; j++)
	{
		int count = 0;
		for (i = 0; i < row - 1; i++)
		{
			if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//判断对角线
	int countn = 0;
	for (i = 0; i < row - 1; i++)
	{
		//判断右对角线

		for (j = 0; j < col; j++)
		{
			if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
			{
				countn++;
			}
			if (countn == row - 1)
				return arr[i][j];
		}
	}
	//判断左对角线
	int count = 0;
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//平局
	if (Inspect(arr, ROW, COL) == 1)
	{
		return 'm';
	}
	return 'n';
}

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘
	char net = 0;
	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;
	}
		if (net == '*')
		{
			printf("玩家赢了\n");
		}
		else if (net == '#')
		{
			printf("电脑赢了\n");
		}
		else if (net == 'm')
		{
			printf("平局\n");
		
		}
	
}



int main()
{
	int input = 0;
	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;
}

C'est la fin de l'explication du jeu Duoziqi cette fois, car mon niveau est limité, l'explication n'est pas très claire à certains endroits, tout le monde est le bienvenu pour corriger, merci !

Je suppose que tu aimes

Origine blog.csdn.net/weixin_74967884/article/details/131342078
conseillé
Classement