C语言二维数组应用之井字棋游戏

Jcinta ·
更新时间:2024-11-01
· 763 次阅读

本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下

数组是C语言中一种重要的数据类型,接下来我和大家分享用二维数组完成一个井字棋游戏。

井字棋,是一种在3*3格子上进行的连珠游戏,和五子棋类似。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

井字棋的规则想必大家都已非常清楚,下面来简单梳理一下完成这个游戏的主要思路

一、变量的定义

1、首先要定义棋盘变量为一个3*3的二维数组
      char   board[3][3]。

2、用一个int型的变量来表示棋盘上棋子的个数,初始值为0
      int numberOfPieces 。

3、用一个char型的变量来表示游戏的赢家是谁(这是游戏是否能够继续进行下去的关键),当该变量为'  '时表示胜负未分,游戏继续;为' o '时表示电脑获胜;为' x '时表示玩家获胜;为' * '时表示玩家与电脑平手;初始值为'   '
     char winer

二、游戏步骤

1、初始化棋盘,将棋盘上的每一个元素赋为'   ';

2、打印棋盘;

3、玩家落子,棋盘上的棋子数加一;

需注意 (1)、判断该位置是否已经有子;

          (2)、判断玩家落子位置是否出界;

4、打印棋盘;

5、判断胜负,游戏是否继续;

需注意(1)、判断所有行

           (2)、判断所有列

           (3)、判断所有对角线

6、判断结果为胜负未分则继续,否则告知玩家游戏结果并结束游戏;

7、电脑随机落子(用随机数生成落子的坐标)

需注意(1)、用随机数生成坐标时棋子位置不能超界;

          (2)、判断该位置是否已经有子;

8、打印棋盘;

9、判断胜负,同5;

10、判断结果为胜负未分则回到步骤3,否则告知玩家游戏结果并结束游戏;

三、代码实现 #define MAX_ROW 3 #define MAX_COLUMN 3 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> int menu(){     printf("----------------------------\n");     printf("1.开始游戏\n");     printf("2.退出游戏\n");     printf("----------------------------\n");     int choice = 0;     scanf("%d", &choice);     return choice; } //棋盘初始化,无落子 void initBoard(char newBoard[MAX_ROW][MAX_COLUMN]){     for (int row = 0; row < MAX_ROW; row++){         for (int col = 0; col < MAX_COLUMN; col++){             newBoard[row][col] = ' ';         }     } } void printBoard(char chessBoard[MAX_ROW][MAX_COLUMN]) {     // 把棋盘打印出来.      //for (int row = 0; row < MAX_ROW; row++) {     //    for (int col = 0; col < MAX_COL; col++) {     //        // 注意: 使用 %c 来打印字符     //        printf("%c ", chessBoard[row][col]);     //    }     //    printf("\n");     //}     // 上面的代码虽然能够打印出棋盘, 但是都是空格, 看不清.      // 最好让元素能有边框     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 playerDo(char board[MAX_ROW][MAX_COLUMN], int* numberOfPieces){     int row = 0;     int col = 0;     while (1){         printf("请您落子(行 列) 注意:行列值均属于[0,2]\n");         scanf("%d %d", &row, &col);         //判断是否越界         if (row < 0 || row >= MAX_ROW ||             col < 0 || col >= MAX_COLUMN){             printf("您的子飞出棋盘,请重新落子\n");         }//判断玩家落子位置是否已经有子         else if (board[row][col] != ' '){             printf("您落子的位置已经有子,请重新落子\n");         }         else{             break;         }     }     board[row][col] = 'x';     *numberOfPieces = *numberOfPieces + 1;     printf("现在落子%d颗\n", *numberOfPieces); } //电脑落子 void computerDo(char board[MAX_ROW][MAX_COLUMN], int* numberOfPieces){     printf("电脑落子\n");     int row = 0;     int col = 0;     while (1){         row = rand() % 3;         col = rand() % 3;         if (board[row][col] == ' '){             //该位置无子             break;         }     }     board[row][col] = 'o';     *numberOfPieces = *numberOfPieces + 1; } //判断棋盘是否下满,1表示下满,0表示未下满 int isfull(int numberOfPieces){     if (numberOfPieces == 9)         return 1;     else         return 0; } //判断胜负,返回值为'x'玩家赢,返回值为'o'电脑赢,返回值为'*'平手,返回值为' '继续 char whoIsWiner(char board[MAX_ROW][MAX_COLUMN],int numberOfPieces){     //判断所有行     for (int row = 0; row < MAX_ROW; row++){         if (board[row][0] != ' '&&             board[row][0] == board[row][1] &&             board[row][1] == board[row][2]){             return board[row][0];         }     }     //判断所有列     for (int col = 0; col < MAX_COLUMN; col++){         if (board[0][col] != ' '&&             board[0][col] == board[1][col] &&             board[1][col] == board[2][col]){             return board[0][col];         }     }     //判断所有对角线     if (board[1][1] != ' '&&         board[1][1] == board[0][0] &&         board[2][2] == board[0][0]){         return board[0][0];     }     if (board[1][1] != ' '&&         board[0][2] == board[1][1] &&         board[1][1] == board[2][0]){         return board[1][1];     }     //判断棋盘是否下满     if (isfull(numberOfPieces) == 0){         return ' ';     }     return '*'; } void game(){     char board[MAX_ROW][MAX_COLUMN];     char winer = ' ';     棋盘上棋子的个数,游戏刚开始的时候棋盘上棋子的个数为0     int numberOfPieces = 0;     printf("游戏开始\n");     //1.初始化棋盘     initBoard(board);     //2.打印棋盘     printBoard(board);     while (1){         //3.玩家落子(行,列),玩家的子用x表示         playerDo(board, &numberOfPieces);         //4.打印棋盘         printBoard(board);         //5.判断胜负         //if (isFull(numberOfPieces) == 1){         //    if (whoIsWiner(board) == 'o'){//电脑胜         //        printf("你输了\n");         //        return;         //    }         //    if (whoIsWiner(board) == 'x'){//玩家胜         //        printf("你赢了\n");         //        return;         //    }         //    if (whoIsWiner(board) == '*'){//平手         //        printf("你和电脑势均力敌\n");         //        return;         //    }         //}         winer = whoIsWiner(board, numberOfPieces);         if (winer != ' '){             break;         }         //6.电脑随机落子,电脑的子用o表示         computerDo(board, &numberOfPieces);         //7.打印棋盘         printBoard(board);         //8.判断胜负         winer = whoIsWiner(board, numberOfPieces);         if (winer != ' '){             break;         }         //if (isFull(numberOfPieces) == 1){         //    if (whoIsWiner(board) == 'o'){//电脑胜         //        printf("你输了\n");         //        return;         //    }         //    if (whoIsWiner(board) == 'x'){//玩家胜         //        printf("你赢了\n");         //        return;         //    }         //    if (whoIsWiner(board) == '*'){//平手         //        printf("你和电脑势均力敌\n");         //        return;         //    }         //}     }     if (winer == 'x'){         printf("你赢了\n");     }     if (winer == 'o'){         printf("你输了\n");     }     if (winer == '*'){         printf("平手\n");     } } int main(){     int chioce;     srand((unsigned int)time(0));     while (1){         //菜单,1.进行游戏;2.退出游戏         chioce = menu();         if (chioce == 1){             game();             break;         }         else if (chioce == 2){             printf("再见\n");             break;         }         else{             printf("您的输入有误,请重新输入\n");         }     }     system("pause");     return 0; }

大家可以自己在电脑上敲一下这个代码,实现过程还是非常有意思的。



c语言二维数组 二维数组 井字棋 维数 二维 C语言 数组

需要 登录 后方可回复, 如果你还没有账号请 注册新账号