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

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

服务器之家 - 编程语言 - C/C++ - C语言实现井字棋游戏

C语言实现井字棋游戏

2021-11-02 14:40晴空孤缕光 C/C++

这篇文章主要为大家详细介绍了C语言实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

首先,我们需要一个大体的思路,先进行宏观规划,再对细节进行实现。

比如:

1、首先需要一个菜单面板作以修饰,在这个面板上,玩家可以选择进入游戏或者退出游戏。
2、需要一个游戏程序,这个是核心。

差不多就是这两个了,我们可以先把这个写下来,这样也可以方便后面使用,像这样:

?
1
2
void Game();
int Menu();//这里Menu之所以用int,是为了用返回值来确定是否退出游戏,并非唯一,也非最佳,读者自己尝试

为了丰富游戏内容,我们可以加入一个选项在函数Game()里,比如PVE模式、PVP模式。

?
1
2
void PVP();
void PVE();

接下来,我们就可以用主函数把这些东西连起来啦!如下:

?
1
2
3
4
5
6
7
8
int main() {
 int i=Menu();
 if (i == 1) {
  Game();
 }
  printf("再见");
 return 0;
}

这样就大功告成啦~~(最后哪个再见可以不要,这个代码中,笔者为了优化玩家游戏体验,加入了很多不必要的东西,读者均可以不写,主要视读者兴趣而定)

接下来我们来实现细节,先来写菜单:(如下)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int Menu() {
//以下是修饰用的菜单面板
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:开始游戏   #####\n");
 printf("###### 2:退出游戏   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
//下面这个循环的目的是为了确认玩家是否输入的是“1”或者“2”,为了使系统可以稳定运行,这个很重要
 int i = 0;
 while (1) {
  scanf("%d", &i);
  if (i == 1 || i == 2) {
   break;
  }
  printf("\n输入无效,请重新输入:");
 }
 if (i == 1)
 return 1;
 return 2;
}

这里我们可以看到,返回了 i ,因为我在主函数里需要借助这个返回值确定是否进入游戏~~

完成面板后,我们就要进行我们的核心部分。

函数Game()的实现

同样的,先宏观操作,根据需求来写代码。

?
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
void Game() {
//首先需要一个看起来像棋盘的东西,数组是个不错的选择,
//因为一般我们用‘x'和‘o'来表示两个玩家的棋子,我们这里把数组定义成char类型
 char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}};
//以下是花里胡哨的面板~~
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1:人机对战   #####\n");
 printf("###### 2:双人对战   #####\n");
 printf("###### 3:退出游戏   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");//提示玩家输入的窗口
 int choose = 0;
//这个循环同样是为了优化系统的稳定,不至于被有些调皮的玩家搞崩~~
 while (1) {
    scanf("%d", &choose);
 if (choose == 1 || choose == 2||choose==3)
  break;
 printf("\n输入无效,请重新输入:");
 }
//根据玩家的选择进入相应的模式,这里if(choose==3)的时候显然Game会运行结束,到达主函数的结束阶段,所以笔者偷了个懒,并没写这个情况~~,不过这并不影响什么。
 if (choose == 1)
  PVE();
 if (choose == 2)
  PVP();
}

以上都是游戏的基本流程,玩过游戏的老铁应该是烂熟与心的,没玩过也没关系~~,去玩一下就知道了,总之要搞出来一个游戏,我们总得知道玩的过程吧?

接下来实现两个模式:

先写人机吧?(这个限于笔者能力有限,写的比较啰嗦,如果读者有更好的创意,可以去自己实现~~)

?
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
void PVE() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //胜负判别
 char win = ' ';
 //落子的坐标定义
 int i = 0;
 int j = 0;
 //打印棋盘
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家落子
  printf("请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\n请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
            win = '0';
   break;
  }
  //电脑落子
  while (1) {
   i = (time(0) % 3);
   j = ((time(0)*time(0)) % 3);
   if (arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\n不会吧?不会吧!不会真的有人输给人工智障吧?\n");//笔者还是个孩子,也比较调皮哈~~,不建议这么写,大家成熟些啊~
 }
 else if (win == 'x') {
  printf("\n恭喜获胜!!!\n");
 }
 else {
  printf("\n恭喜您与人工智障打成平手!!!\n");//捂脸~由于电脑走的棋是笔者用时间戳来随机确定的,可能真的有些人工智障.
  //这里如果笔者有兴趣,可以设计一个难度选择界面,通过感应周围的棋子的位置来确定,或者直接输入经验也可以,凭读者喜好决定~~
 
 }
 //这里笔者考虑到再来一局的设计,觉得可以提供一些便利,于是就有了下面的递归
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜单    #####\n");
 printf("###### 2:再来一次    #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
 while (1) {
     scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n输入违法,请重新输入:");
 }
 if (re == 1) {
  re=Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVE();
 }
}

好嘞!以同样的方式写下PVP模式,思路差不多,就不详细解释了,具体如下

?
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
void PVP() {
 int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} };
 //胜负判别
 char win = ' ';
 //落子的坐标定义
 int i = 0;
 int j = 0;
 //打印棋盘
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
 printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
 printf("\n+---+---+---+\n");
 while (1) {
  //玩家p1落子
  printf("P1玩家请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'x';
    break;
   }
   printf("\nP1玩家请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') {
   win = 'x';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
  //玩家p2落子
  printf("P2玩家请落子:");
  while (1) {
   scanf("%d%d", &i, &j);
   if (i < 3 && j < 3 && arr[i][j] == ' ') {
    arr[i][j] = 'o';
    break;
   }
   printf("\nP2玩家请重新输入:");
  }
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]);
  printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]);
  printf("\n+---+---+---+\n");
  //判定胜负
  if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == '0') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') {
   win = 'o';
   break;
  }
  else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') {
   win = '0';
   break;
  }
 }
 if (win == 'o') {
  printf("\nP2获得胜利!!!\n");
 }
 else if (win == 'x') {
  printf("\nP1获得胜利!!!\n");
 }
 else {
  printf("\n平手!!!\n");
 }
 int re = 0;
 printf("##########################\n");
 printf("######               #####\n");
 printf("###### 1;返回菜单   #####\n");
 printf("###### 2:再来一次   #####\n");
 printf("######               #####\n");
 printf("##########################\n");
 printf("请选择:");
 while (1) {
  scanf("%d", &re);
  if (re == 1 || re == 2)
   break;
  printf("\n输入违法,请重新输入:");
 }
 if (re == 1) {
  re = Menu();
  if (re == 1) {
   Game();
  }
 }
 else if (re == 2) {
  PVP();
 }
}

这样,所有我们设计好的细节就都被实现啦,一个完整的简单游戏就大功告成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/S_xi_730/article/details/116111142

延伸 · 阅读

精彩推荐