一、问题描述
用C语言实现三子棋。
二、基本流程
1.打印菜单选择开始或退出游戏
2.创建一个二维数组作为棋盘并初始化
3.打印棋盘
4.玩家落子“X”代表玩家
5.检验结果
6.电脑落子“O”代表电脑
7.检验结果
8.判断结果
9.回到步骤2
三、步骤
1.菜单界面
1.开始游戏 2.退出游戏
void Menu() { printf("+--------------------+\n"); printf("| 1.Play 2.Exit |\n"); printf("+--------------------+\n"); } int main() { int select = 0; int quit = 0; while (!quit){ Menu(); printf("Please Select#"); scanf("%d",&select); switch (select){ case 1: //选择1进入游戏 Game(); break; case 2: //选择2退出游戏 quit = 1; break; default: //输入其他显示出错 printf("You Enter Error,Try Again!\n"); break; } } printf("ByeBye!\n"); system("pause"); return 0; }
结果:
2.创建棋盘
使用三行三列的二维数组表示,在这里使用宏定义,提高代码的可读性和可维护性。
#define ROW 3 #define COL 3 #define WHITE 'X' //玩家 #define BLACK 'O' //电脑 #define INIT ' ' #define DRAW 'D' //和棋 #define NEXT 'N' //继续
3.棋盘初始化
INIT表示空格
#define INIT ' ' static void InitBoard(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ board[i][j] = INIT; } } }
4.打印棋盘
static void ShowBoard(char board[][COL], int row, int col){ system("cls"); for (int i = 0; i < col; i++){ printf(" %4d", i+1); } printf("\n +---+----+---+\n"); for (int i = 0; i < row; i++){ printf("%-2d", i+1); for (int j = 0; j <col; j++){ printf("| %c", board[i][j]); } printf("\n +---+----+---+\n"); } }
结果:
5.玩家落子
玩家输入行列坐标表示落子,“X”代表玩家。
注意:
1.玩家落子需要在棋盘范围内;
2.玩家要选择棋盘上空的位置落子;
3.如果输入的坐标不对要重新输入。
static void PlayerMove(char board[][COL], int row, int col){ int x = 0; int y = 0; while (1) { printf("Please Enter Position<x,y>#"); scanf("%d %d", &x, &y); if (x<1 || y<1 || x>3 || y>3){ //判断玩家输入的坐标是否满足要求 printf("Enter Position Error!\n"); continue; } if (board[x - 1][y - 1] == INIT){ //判断玩家落子的地方是否为空 board[x - 1][y - 1] = WHITE; break; } else{ printf("Position Is Not Empty!\n"); } } }
6.电脑落子
种一颗随机数种子,让电脑随机生成行列坐标,“O”表示电脑落子。
注意:
1.在数函数中使用srand((unsigned long)time(NULL)),用时间作为随机数种子;
2.电脑要在棋盘空格地方落子;(走到这里,表示一定还有空格,因为在玩家落子之后进行了结果判断,在这里就不需要在判断是否还有空格);
//srand((unsigned long)time(NULL)); 种一个随机数种子 static void ComputerMove(char board[][COL], int row, int col){ while (1){ int x = rand() % row; //x取值范围为0到2 int y = rand() % col; //y取值范围为0到2 if (board[x][y] == INIT){ //判断落子点是否为空 board[x][y] = BLACK; break; } } }
7.检验结果
1.返回结果:
(1).“X”表示玩家胜;
(2).“O”表示电脑胜;
(3).“D”表示和棋;
(4).“N”表示一盘棋还没下完,继续下棋。
2.判断和棋或者继续
如果数组元素中有空格,表示棋盘没满,继续;如果棋盘满了没分出胜负,和棋。
3.判断电脑或玩家胜
(1).判断所有行
(2).判断所有列
(3).判断两条对角线
static char IsEnd(char board[][COL], int row, int col){ for (int i = 0; i < row; i++){ if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != INIT){ return board[i][0]; //判断所有行 } } for (int j = 0; j < col; j++){ if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != INIT) { return board[0][j]; //判断所有列 } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != INIT){ return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != INIT){ return board[0][2]; //判断两条对角线 } for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ if (board[i][j] == INIT){ return NEXT; } } } return DRAW; }
玩家胜:
电脑胜:
和棋:
注意:每次玩家落子之后都要判断一下结果,每次电脑落子之后也要判断
四、代码实现
游戏逻辑:
void Game() { char board[ROW][COL]; //创建棋盘 InitBoard(board, ROW, COL); //初始化棋盘 srand((unsigned long)time(NULL)); //种随机数种子 char result = 0; while (1){ ShowBoard(board, ROW, COL); //显示棋盘 PlayerMove(board, ROW, COL); //玩家下 result = IsEnd(board, ROW, COL); //判断结果 if (result != NEXT){ break; } ShowBoard(board, ROW, COL); //显示棋盘 ComputerMove(board, ROW, COL); //电脑下 result = IsEnd(board, ROW, COL); //判断结果 if (result != NEXT){ break; } } ShowBoard(board, ROW, COL); //显示棋盘 switch (result){ case WHITE: printf("You Win!\n"); break; case BLACK: printf("You Lose!\n"); break; case DRAW: printf("You==Computer!\n"); break; default: printf("BUG!\n"); break; } }
那说到这里,一款三子棋游戏就结束了咯!