本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下
思路:
main函数结构部署
game函数功能的实现
①创建存储空间
②初始化存储空间为空格
③打印棋盘
④实现玩家下棋
⑤实现电脑下棋
⑥实现玩家和电脑下棋后的输赢判断
所使用的文件:
test.c-----用于测试游戏
game.c----用于实现游戏中的一些函数
game.h-----头文件
test.c
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
|
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
#include<stdlib.h>
void menu()
{
printf ( "%s\n" , "**********" );
printf ( "%s\n" , "* 1.play *" );
printf ( "%s\n" , "* 0.exit *" );
printf ( "%s\n" , "**********" );
}
void game()
{
//建立存储空间--二维数组
char ch[ROW][COL]; //我们想让数组空间变得灵活,就要保证行和列可变,单数组不接受变量,只能使用define定义的常量-----最好放在头文件里---从而改变头文件实现数组空间灵活变化
//初始化存储空间----显示正常
innit(ch,ROW,COL);
//打印棋盘
pri_board(ch, ROW, COL);
char re= '\0' ; //接收游戏结果
//玩家和电脑博弈
while (1)
{
//玩家下棋
pla_move(ch, ROW, COL);
pri_board(ch, ROW, COL);
//使用函数判断是否产生输赢
re=is_win(ch,ROW,COL);
//只要不等于"c"说明产生了结果,直接结束博弈
if (re != 'C' )
break ;
//电脑下棋
com_move(ch, ROW, COL);
pri_board(ch, ROW, COL);
//使用函数判断是否产生输赢
re=is_win(ch, ROW, COL);
if (re != 'C' )
break ;
}
if (re == '*' )
printf ( "玩家获胜!\n" );
else if (re == '#' )
printf ( "电脑获胜!\n" );
else
printf ( "平局!\n" );
pri_board(ch, ROW, COL);
}
int main()
{
//srand函数的使用,后面的com_move函数使用(难点)
srand ((unsigned int ) time (NULL));
int input = 0;
do {
//打印游戏菜单提示玩家
menu();
//玩家选择
printf ( "请选择>:" );
scanf ( "%d" , &input);
//对玩家的选择进行实现
switch (input)
{
case 1:
game();
break ;
case 0:
printf ( "退出游戏\n" );
break ;
default :
printf ( "输入错误,重新输入\n" );
break ;
}
} while (input);
}
|
game.c
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
152
153
154
155
156
|
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void innit( char ch[ROW][COL], int row, int col)
{ //遍历二维数组将值改为空格实现初始化
int i = 0;
int w = 0;
for (i = 0; i < row; i++)
{
for (w = 0; w < col; w++)
{
ch[i][w] = ' ' ;
}
}
}
void pri_board( char ch[ROW][COL], int row, int col)
{ //
int i = 0;
int w = 0;
//行的循环里有两个列的循环
//列的循环里有两个打印循环
for (i = 0; i < row; i++)
{
for (w = 0; w < col; w++)
{
printf ( " %c " , ch[i][w]);
if (w < col - 1)
printf ( "|" );
}
printf ( "\n" );
if (i < row - 1)
{
for (w = 0; w < col; w++)
{
printf ( "---" );
if (w < col - 1)
printf ( "|" );
}
printf ( "\n" );
}
}
}
void pla_move( char ch[ROW][COL], int row, int col)
{
while (1)
{
//玩家输入下棋坐标
int a = 0;
int b = 0;
printf ( "玩家走>:\n" );
printf ( "请输入你要下的棋子坐标:" );
scanf ( "%d%d" , &a, &b);
//判断坐标是否合法
if ((a >= 1 && a <= row) && (b >= 1 && b <= col))
{
//符合规范后,判断棋子位置是否被占用
//玩家下棋的坐标和数组坐标有差异
if (ch[a-1][b-1] == ' ' )
{
ch[a-1][b-1] = '*' ;
break ;
}
else
{
printf ( "该位置被占用,请重新输入\n" );
}
}
else
{
printf ( "你所输入的棋子位置不符合规范,请重新输入\n" );
}
}
}
void com_move( char ch[ROW][COL], int row, int col)
{
printf ( "电脑走>\n" );
//涉及到srand和rand函数的使用(较难)
//取余后坐标在正确范围内
while (1)
{
int a = rand ()%row;
int b = rand ()%col;
//判断坐标处是否已经下过
if (ch[a][b] == ' ' )
{
ch[a][b] = '#' ;
break ;
}
}
}
//通过遍历二维数组里面的内容判断是否平局
int is_full( char ch[ROW][COL], int row, int col)
{
int i = 0;
int w = 0;
for (i = 0; i < row;i++)
{
for (w = 0; w < col; w++)
{
if (ch[i][w] == ' ' );
return 0;
}
}
return 1;
}
char is_win( char ch[ROW][COL], int row, int col)
{
int i = 0;
//判断行(三子棋版本)
for (i = 0; i < row; i++)
{
if (ch[i][0] == ch[i][1] && ch[i][1] == ch[i][2] && ch[i][0] != ' ' )
return ch[i][0];
}
//判断列(三子棋版本)
for (i = 0; i < col; i++)
{
if (ch[0][i] == ch[1][i] && ch[1][i] == ch[2][i] && ch[0][i] != ' ' )
return ch[0][i];
}
//判断对角线(三子棋版本)
if (ch[0][0]==ch[1][1]&&ch[1][1]==ch[2][2]&&ch[1][1]!= ' ' )
return ch[1][1];
if (ch[0][2] == ch[1][1] && ch[1][1] == ch[2][0] && ch[0][2] != ' ' )
return ch[0][2];
//判断是否平局
int ispj = is_full(ch, ROW, COL);
//棋盘满返回1
//不满返回0
if (ispj == 1)
return 'Q' ;
else
return 'C' ;
}
|
game.h
1
2
3
4
5
6
7
8
9
10
11
|
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void innit( char ch[ROW][COL], int row, int col);
void pri_board( char ch[ROW][COL], int row, int col);
void pla_move( char ch[ROW][COL], int row, int col);
void com_move( char ch[ROW][COL], int row, int col);
char is_win( char ch[ROW][COL], int row, int col);
|
然而,这个三子棋代码只能在3*3棋盘下实现
我们可以通过改变is_win()输赢判断条件,来实现棋盘的*变化.
修改
优化后的判断条件
列和行的判断
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
|
for (i = 0; i < col; i++)
{
int count = 0;
for (q=0;q<row;q++)
{ //列的判断
if (ch[q][i] == ch[q + 1][i] && ch[q][i] != ' ' )
{
count++;
continue ;
}
else
break ;
}
if (count >= 2)
return ch[q][i];
}
//判断行(三子棋版本)
for (q = 0; q < row; q++)
{
int count = 0;
for (i = 0; i < col; i++)
{ //行的判断
if (ch[q][i] == ch[q][i + 1] && ch[q][i] != ' ' )
{
count++;
continue ;
}
else
break ;
}
if (count >= 2)
return ch[q][i];
}
|
对角线的判断
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
|
//判断对角线(三子棋版本)
//左上角到右下角
for (q = 0; q < row; q++)
{
for (i = 0; i < col; i++)
{
if (ch[q][i] == ' ' )
{
continue ;
}
else
{
if (ch[q][i] == ch[q + 1][i + 1])
{
if (ch[q + 1][i + 1] == ch[q + 2][i + 2])
return ch[q][i];
}
}
}
}
//右上角到左下角
for (q = 0; q < row; q++)
{
for (i = 0; i < col; i++)
{
if (ch[q][i] == ' ' )
{
continue ;
}
else
{
if (ch[q][i] == ch[q + 1][i - 1])
{
if (ch[q + 1][i - 1] == ch[q + 2][i - 2])
return ch[q][i];
}
}
}
}
|
等日后有时间,再来实现电脑的算法.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_56388189/article/details/121444298