Langage C ---- (simple) jeu à trois coups

Cet article est un article de blog écrit par l'auteur lorsqu'il a appris le langage C. Veuillez me corriger s'il y a des erreurs. merci! ! ! !


Table des matières

Cet article est un article de blog écrit par l'auteur lorsqu'il a appris le langage C. Veuillez me corriger s'il y a des erreurs. merci! ! ! !

1. Description du problème

Deuxièmement, la logique de base

Trois étapes spécifiques

1. Entrez la logique de sélection du jeu

2. Corps du jeu

3. Créez un échiquier

4. Initialiser la carte

5. Imprimez et embellissez l'échiquier

6. Les joueurs jouent aux échecs

7. Échecs informatiques

8. Jugez gagner ou perdre

Quatrièmement, le corps de la fonction de jeu

Cinq, le code spécifique des trois fichiers

1, source.c

2,jeu.c

3,jeu.h

Merci d'avoir regardé! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !


Étape de préparation : Aujourd'hui, nous utilisons la programmation modulaire pour créer trois fichiers.

test.c //utilisé pour tester la logique du jeu

game.c //Implémentation des fonctions du jeu

game.h //Déclaration des fonctions dans le jeu, définition des symboles.



1. Description du problème

Écrivez du code pour implémenter un jeu de backgammon simple.

Deuxièmement, la logique de base

1. Tout d'abord, nous devons écrire un menu de jeu pour choisir d'entrer dans le jeu ou de le quitter

2. Le corps du jeu doit être encapsulé dans une fonction

3. Créez un tableau à deux dimensions comme un échiquier

4. Imprimez mon échiquier et embellissez la fonction de l'échiquier

5. La fonction du joueur jouant aux échecs

6. La fonction des échecs informatiques

7. La fonction de juger du résultat

8. Revenez au menu et choisissez d'entrer dans le jeu ou de quitter le jeu à nouveau

Trois étapes spécifiques

1. Entrez la logique de sélection du jeu

Écrivez du code pour obtenir :

Entrez 1 --> entrez dans le jeu ;

Entrez 0 --> quitter le jeu ;

Saisissez d'autres chiffres --> affichez l'erreur de saisie, veuillez saisir à nouveau !

#include "game.h"


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


void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//这里是游戏实现的函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误,请重新选择!!!\n");
		}
	}while (input);//这里直接用input也可以
}


int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

Remarque : Le fichier d'en-tête doit être inclus ici #include<stdio.h>, mais nous avons créé "game.h", nous pouvons inclure #include "game.h" dans "test.c" et "game.c". Dans "game.h" contient les fichiers d'en-tête des fonctions de la bibliothèque , les déclarations des fonctions personnalisées et certaines variables de macro personnalisées. De cette manière, certains fichiers d'en-tête, macros personnalisées,,,, etc. peuvent être définis de manière centralisée et le nombre de définitions peut être réduit.

2. Corps du jeu

Cas 1 de la fonction de test : une fonction utilisée est le cœur de ce jeu. Implémentez toutes les fonctions du jeu dans cette fonction. Voici les différents codes de fonction dans la fonction de jeu. Analysons-les maintenant un par un.

void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}

3. Créez un échiquier

En supposant que le joueur joue aux échecs en tant que *, l'ordinateur joue aux échecs en tant que #, et l'endroit où aucun échec n'est joué est représenté par un espace. Nécessite des données non de type char

L'échiquier a besoin d'un tableau bidimensionnel 3*3 pour représenter

char board[ROW][COL] = { ' ' };

Notez que ROW et COL sont ici des variables de macro personnalisées.

1. Améliorer la compatibilité du code, par exemple : changer le ROW et COL peut directement changer l'échiquier.

2. Il est facile à comprendre et améliore la lisibilité.Lorsque vous voyez ROW, vous pouvez le considérer comme une rangée d'un échiquier et COL est une colonne.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3

4. Initialiser la carte

Les éléments du tableau doivent être 'espace' lorsque vous jouez aux échecs, voici une simple double boucle.

Voici la mise en œuvre spécifique.

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

5. Imprimez et embellissez l'échiquier

Lorsque nous imprimons, parce que les données du tableau ne sont que des espaces, nous ne pouvons pas le voir.

Ajoutez donc quelques lignes pour former un damier et embellissez-le.

Certaines boucles et jugements sont imbriqués ici.

void print_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)//这个就是打印数据行,
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//最后一个|不要
			{
				printf("|");
			}
		}
		printf("\n");//注意换行
		if (i < row - 1)//最后一个分割行不要
		{
			for (int z = 0; z < col; z++)//这个循环分割行
			{
				printf("---");
				if (z < col - 1)//同样最后一个|也不要
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}

}

6. Les joueurs jouent aux échecs

Les joueurs jouent aux échecs en entrant les coordonnées correspondantes.Ici, il est nécessaire de juger d'abord de la légalité des coordonnées, et également de juger s'il y a des pièces d'échecs à ce stade.

S'il y a déjà des pièces d'échecs, imprimez les pièces d'échecs existantes et laissez-le entrer à nouveau.

Si les coordonnées ne sont pas valides, imprimez les coordonnées et demandez-lui de les réimprimer.

Voici l'implémentation spécifique de la fonction.

Faites attention à la structure de la boucle

//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	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] = '*';
				break;
			}
			else
				printf("已有棋子,请重新输入!!!\n");
		}
		else
		{
			printf("坐标不合法,请重新输入!!!\n");
		}
	}
}

7. Échecs informatiques

Le code que nous écrivons est simplement du code

Les échecs informatiques jouent aux échecs au hasard, ce qui nécessite la génération de deux nombres aléatoires, et le rand, le srand et le temps sont utilisés ici.

Référencez les fonctions srand et time dans la fonction principale (car le srand ici ne doit être référencé qu'une seule fois)

int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

Ici, ajoutez 1 au nombre aléatoire %3 pour générer des coordonnées légales, et jugez simplement s'il y a une pièce d'échecs sous les coordonnées.


//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
	while (1)
	{

		int x = rand() % 3 + 1;
		int y = rand() % 3 + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '#';
				break;
			}
		}
	}
}

Notez qu'il est écrit comme une structure de boucle.

8. Jugez gagner ou perdre

Gagner ou perdre doit être jugé après chaque partie d'échecs. Il n'y a que quatre situations pour juger ici,

retours de victoire de joueur *

la victoire de l'ordinateur revient #

tirage au sort p

continuer à revenir j

Voici l'implémentation de la fonction

char win(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//判断三行是否相等
	{
	if (board[i][1] == board[i][0] && board[i][0] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	for (int 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[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	int count = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count = 0)
	{
		return 'p';
	}
	else
		return 'j';

}

Quatrièmement, le corps de la fonction de jeu

void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}

Cinq, le code spécifique des trois fichiers

1, source.c

#include"game.h"


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


void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}




void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误,请重新选择!!!\n");
		}
	}while (input);
}






int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

2,jeu.c

#include"game.h"

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘并美化棋盘
void print_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)//这个就是打印数据行,
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)//最后一个|不要
			{
				printf("|");
			}
		}
		printf("\n");//注意换行
		if (i < row - 1)//最后一个分割行不要
		{
			for (int z = 0; z < col; z++)//这个循环分割行
			{
				printf("---");
				if (z < col - 1)//同样最后一个|也不要
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}

}

//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	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] = '*';
				break;
			}
			else
				printf("已有棋子,请重新输入!!!\n");
		}
		else
		{
			printf("坐标不合法,请重新输入!!!\n");
		}
	}
}

//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
	while (1)
	{

		int x = rand() % 3 + 1;
		int y = rand() % 3 + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '#';
				break;
			}
		}
	}
}




//判断输赢
//玩家赢返回*
//电脑赢返回#
//平局返回p
//继续返回j


char win(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//判断三行是否相等
	{
	if (board[i][1] == board[i][0] && board[i][0] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][1];
		}
	}
	for (int 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[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	int count = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count = 0)
	{
		return 'p';
	}
	else
		return 'j';

}

3,jeu.h

#pragma once


#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3

//舒适化棋盘
void init_board(char bpard[ROW][COL], int row, int col);
//打印棋盘并美化棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void play_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char win(char board[ROW][COL], int row, int col);

Merci d'avoir regardé! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !

Acho que você gosta

Origin blog.csdn.net/zxf123567/article/details/123488060
Recomendado
Clasificación