服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 适合初学者练习的C语言实现三子棋小游戏

适合初学者练习的C语言实现三子棋小游戏

2022-01-25 14:39小明bite C/C++

今天这篇文章主要介绍给大家分享一个适合初学者练习的利用C语言写三子棋小游戏,用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能 详细内容就请跟小编一起来阅读

用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能

 一、写代码前明确下棋时的步骤与顺序

  • 1.创建一个3*3的棋盘.
  • 2.将上面创建的棋盘中每个格初始化成' '状态.
  • 3.打印出初始化完成的棋盘
  • 4.玩家落子
  • 5.电脑落子
  • 6.判断胜负

写代码之前梳理好大概的思路,先写出初步的主函数

?
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
int main() {
 char winner = ' ';
 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盘
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
  //6.电脑落子
  computerMove(board);
  //7.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
 }

在创建棋盘是char board[][]的[]中不要写3,写3在后面看代码时不能明确分清3代表什么

因此建议定义宏

?
1
2
#define MAX_ROW  3
#define MAX_COL  3

这样可以清楚的看出[]中的内容代表什么,提高可读性.

 二 根据初步的主函数完成想要的代码

1.写一个函数来初始化棋盘

?
1
2
3
4
5
6
7
8
9
10
11
//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //设计随机种子
 srand((unsigned int) time(0));
}

2.打印棋盘

?
1
2
3
4
5
6
7
8
9
10
11
12
void printBoard(char board[MAX_ROW][MAX_COL]) {
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  printf("+---+---+---+\n");
  for (int col = 0; col < MAX_COL; col++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}

system("cls")是让每次打印棋盘前清除之前的棋盘这样能让界面清晰一些

(使用的是简单的C来完成程序所以打印的棋盘也比较简陋)

3.玩家落子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("请玩家落子!");
 while (1) {
  printf("请输入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入后验证输入内容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("输入有误.请重新输入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("当前位置已有棋子,请重新输入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}

以输入坐标的方式来实现落子,并且要检测玩家落子是否合理,以免输入无效的坐标.

4.电脑落子

?
1
2
3
4
5
6
7
8
9
10
11
12
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}

电脑落子采用随机数的方式来进行落子,因此需要设置随机种子,将它写在初始化棋盘函数内,每次初始化一次进行一次随机种子的设置

由于是随机落子因此实现的不是人工智能而是人工智障.

5.判断胜负

?
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
int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //检查所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //检查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //检查对角线
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}

检查每行 每列  对角线是否有三个相同的棋子从而判断胜负.

?
1
2
3
4
5
6
7
8
9
10
11
12
int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盘没满
    return 0;
   }
  }
 }
 return 1;
}

检查棋盘有没有下满(可能出现和棋)

 这就实现一个简单的三子棋游戏

在主函数中玩家落子后应也判断一次胜负,以免出现玩家胜利电脑再落子的情况.

三、三子棋实现代码

?
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
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
 
#define MAX_ROW  3
#define MAX_COL  3
 
//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for(int col = 0; col < MAX_COL; col++) {
   board[row][col] = ' ';
  }
 }
 //设计随机种子
 srand((unsigned int) time(0));
}
void printBoard(char board[MAX_ROW][MAX_COL]) {
 system("cls");
 for (int row = 0; row < MAX_ROW; row++) {
  printf("+---+---+---+\n");
  for (int col = 0; col < MAX_COL; col++) {
   printf("| %c ", board[row][col]);
  }
  printf("|");
  printf("\n");
 }
 printf("+---+---+---+\n");
}
void playerMove(char board[MAX_ROW][MAX_COL]) {
 printf("请玩家落子!");
 while (1) {
  printf("请输入落子的位置(row col):");
  int row = 0;
  int col = 0;
  scanf("%d %d", &row, &col);
  //输入后验证输入内容是否合法.
  if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
   printf("输入有误.请重新输入!\n");
   continue;
  }
  if (board[row][col] != ' ') {
   printf("当前位置已有棋子,请重新输入!\n");
   continue;
  }
  board[row][col] = 'x';
  break;
 }
}
void computerMove(char board[MAX_ROW][MAX_COL]) {
 printf("轮到电脑落子");
 while (1) {
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  if (board[row][col] != ' ') {
   continue;
  }
  board[row][col] = 'o';
  break;
 }
}
int isFull(char board[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (board[row][col] == ' ') {
    //棋盘没满
    return 0;
   }
  }
 }
 return 1;
}
int checkWinner(char board[MAX_ROW][MAX_COL]) {
 //检查所有行
 for (int row = 0; row < MAX_ROW; row++) {
  if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
   return board[row][0];
  }
 }
 //检查所有列
 for (int col = 0; col < MAX_COL; col++) {
  if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
   return board[0][col];
  }
 }
 //检查对角线
 if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ') {
  return board[0][0];
 }
 if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ') {
  return board[0][2];
 }
 if (isFull(board)) {
  return 'q';
 }
 return ' ';
}
int main() {
 char winner = ' ';
 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = { 0 };
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);
 while (1) {
  //3.打印棋盘
  printBoard(board);
  //4.玩家落子
  playerMove(board);
  //5.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
  //6.电脑落子
  computerMove(board);
  //7.判断胜负
  winner = checkWinner(board);
  if (winner != ' ') {
   //胜负已分
   break;
  }
 }
 if (winner == 'x') {
  printf("恭喜你,你赢了!\n");
 }else if(winner=='o') {
  printf("你真菜连人工智障都玩不过\n");
 }else {
  printf("你和人工智障五五开\n");
 }
 return 0;
}

运行界面如下:

适合初学者练习的C语言实现三子棋小游戏

到此这篇关于初学者练习--C语言写三子棋小游戏的文章就介绍到这了,更多相关C语言写三子棋小游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_62031099/article/details/120792262

延伸 · 阅读

精彩推荐