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 !
Annuaire d'articles
-
- 1. Description du problème
- 2. Processus de mise en œuvre de base
- 3. Principales étapes de mise en œuvre
-
- 3.1 Interface des menus
- 3.2 Créer un échiquier
- 3.3 Initialisation de l'échiquier
- 3.4 Imprimer l'échiquier
- 3.5. Les mouvements du joueur
- 3.6 Déplacements de l'ordinateur (aléatoires)
- 3.7 Le jugement de victoire ou de défaite est un match nul
- 3.8 Fonction principale du jeu
- 4. Démonstration des résultats
- 5. Implémentation globale du code
- Résumer
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_ROW
lorsqu'elle est rencontrée dans les codes suivantsMAX_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 ?
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 :
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!