用 c 语言实现三子棋。
在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:
1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'q’表示和棋。
6.电脑落子(随机位置落子) ,'o’表示电脑落子。
7.判定胜负关系。
8.回到 步骤 2 继续执行。
1.开始游戏 0.退出游戏
1 2 3 4 5 6 7 8 9 10 |
int menu(){ printf("**************************\n"); printf("********1.开始游戏*********\n"); printf("********0.退出游戏*********\n"); printf("**************************\n"); int choice = 0; printf("请输入你的选择:"); scanf("%d", &choice); return choice; } |
棋盘:使用 3 行 3 列的二维数组来表示,元素类型是 char。
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
1 2 3 |
#define MAX_ROW 3 #define MAX_COL 3 char chessBoard[MAX_ROW][max_col] = { 0 }; |
’ '表示棋盘上的空白区域
1 2 3 4 5 6 7 |
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] = ' '; } } } |
(1)简陋棋盘:
1 2 3 4 5 6 7 8 |
void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]){ for (int row = 0; row <MAX_ROW; row++){ for (int col = 0; col < MAX_COL; col++){ printf("%c",chessBoard[row][col]) ; } printf("\n"); } } |
结果:
注意:
这里不是棋盘没打印出来,而是我们使用’ '表示空白区域,所以我们看到的棋盘是一片黑色。
这样看的不是很清楚,所以我们选用更加美观的方法打印。
(2)自己打印棋盘:
1 2 3 4 5 6 7 8 |
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"); } } |
结果:
玩家输入行列坐标表示落子,使用’x’表示玩家落子。
注意:
1. 玩家落子需要在棋盘范围内。
2. 玩家要在棋盘上空的地方落子。
3. 如果输入的坐标不满足要重新输入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){ printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n"); continue; } if (chessBoard[row][col] != ' '){ printf("您的坐标位置已经有子了!\n"); continue; } chessBoard[row][col] = 'x'; break; } } |
电脑随机产生行列坐标,'o’表示电脑落子。
注意:
1. 要在主函数中使用 srand((unsigned int)time(0))将时间作为随机数种子,确保得到的行列坐标是真随机。
2. 要在棋盘上空的地方下棋。
1 2 3 4 5 6 7 8 9 10 11 |
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; } } |
此处约定返回结果的含义:
(1)‘x’ 表示玩家获胜
(2)‘o’ 表示电脑获胜
(3)’ ’ 表示胜负未分
(4) ‘q’ 表示和棋
1) 判定是否和棋
(1)调用 isFull 函数。
(2)如果数组中有元素为’ ‘,那么没满,返回 0。如果全不为’ ',满了,返回 1。
(3)如果棋盘满了未分出胜负,和棋。
2) 判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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 ' '; } |
1.玩家胜利
2.电脑胜利
3.和棋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
#define _CRT_SECURE_NO_WARNINGS #define MAX_ROW 3 #define MAX_COL 3 #include <stdio.h> #include <stdlib.h> #include <time.h> 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 < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){ printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n"); continue; } if (chessBoard[row][col] != ' '){ printf("您的坐标位置已经有子了!\n"); continue; } chessBoard[row][col] = '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 menu(){ printf("**************************\n"); printf("********1.开始游戏*********\n"); printf("********0.退出游戏*********\n"); printf("**************************\n"); int choice = 0; printf("请输入你的选择:"); scanf("%d", &choice); return choice; } int main() { srand((unsigned int)time(0)); while (1){ int choice = menu(); if (choice == 1){ game(); } else if (choice == 0){ printf("退出游戏,GOODBYE!!!!!\n"); break; } else{ printf("输入错误!请重新输入!\n"); continue; } } system("pause"); return 0; } |