C语言井字棋游戏

C语言练手

利用C语言编写的井字棋游戏,界面是由字符串组成,,用到的知识很简单,确是一个很好的练习。
可以判断该位置是否有棋子,判断胜负以及利用随机数做了一个傻瓜AI。

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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
//
// main.c
// 123
//
// Created by 刘林 on 2018/7/16.
// Copyright © 2018年 刘林. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//定义三个自定义函数,欢迎、游戏和再来一局
void welcome();
void game();
void again();
welcome();
return 0;
}

//游戏模块
void game(){
//定义变量,玩家、获胜者、行、列、选择下棋位置
int player = 0; //玩家 1 或者 2
int winner = 0; // 赢家
int row = 0; // 行
int rank = 0; // 列
int choice = 0; //选择
int ai[9]={};//ai选择列表
char chessboard[3][3]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
}; //创建数字棋盘
printf("\n\n我们开始游戏吧!\n\n");
//开始游戏,结束条件为已经下了超过9步或者有获胜者
for (int i = 0;i < 9 && winner == 0 ;i++)
{ player = (i % 2)+1;
//打印初始化棋谱,将创建的数字棋盘中的二位数组带入
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
printf(" # # \n");
printf(" # # \n");
//游戏规则说明

if (player == 1) {
printf("现在是电脑AI开始下,使用的棋子是%c\n");
printf("正在思考中...\n");
do {
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
choice = rand() % 10; //产生0-9的随机数
rank = choice % 3;
rank--;
row = choice /3;
} while ((chessboard[row][rank]=='X') || (chessboard[row][rank]=='O') || choice==0);

}else{
printf("现在是玩家%d开始下,你使用的棋子是%c\n",player,player == 1?'X':'O');
printf("请根据上面的数字选择下棋位置:\n");
there:scanf("%d",&choice);
}

//读入下棋位置
rank = choice % 3;
rank--;
row = choice /3;

//*****非法判断*****
//1、判断输入的数字是否在9以内
if(choice <1 || choice > 9)
{
printf("请输入1-9范围内的数字!\n");
goto there;
}
//2、判断该位置是否已经有棋子
if((chessboard[row][rank]=='X')||(chessboard[row][rank]=='O'))
{
printf("该位置已经有人下了,请选择其它位置!\n");
goto there;
}

//*****落子并判断*****

//相应的位置落下对应的棋子
chessboard[row][rank] = player == 1?'X':'O';
//判断对角线是否相同
if ((chessboard[0][0] == chessboard[1][1] && chessboard[0][0] == chessboard[2][2])||(chessboard[0][2]==chessboard[1][1]&& chessboard[0][2] == chessboard[2][0]))
{
winner = player;
}
//判断每一行 或者每一列是否相同
else
{
for (int line = 0; line <= 2; line++)
{
if ((chessboard[line][0]==chessboard[line][1] && chessboard[line][0]==chessboard[line][2])||(chessboard[0][line]==chessboard[1][line] && chessboard[0][line]==chessboard[2][line]))
winner = player;

}
}

}

//游戏结束 打出最后棋谱
printf("\n\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
printf(" # # \n");
printf(" # # \n");
if (winner == 0)
{
printf("\n\n厉害!厉害!平局!\n");
}
else
printf("\n\n****恭喜玩家%d,获胜!****\n",winner);
again();
}

//再来一局模块
void again(){
printf("\n\n###########################\n");
printf("# #\n");
printf("# 结 束 游 戏 #\n");
printf("# #\n");
printf("###########################\n\n\n");
char start='N';
printf("请输入Y重新开始游戏!\n");
do {
start=getchar();
} while (start!='Y');
if (start=='Y') {
game();
}
}

//欢迎界面模块
void welcome(){
char start;//开始
//游戏规则
printf("#########################\n");
printf("# #\n");
printf("# 井 字 棋 #\n");
printf("# #\n");
printf("#########################\n");
printf("游戏规则:\n");
printf("欢迎来到井字棋,该游戏有两个玩家,一个打圈(O),一个打叉(✗),轮流在\n3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。\n\n");
//进入游戏界面
printf("请输入Y开始游戏!\n");
do {
start=getchar();
} while (start!='Y');
if (start=='Y') {
game();
}
}

-------------The End-------------
欢迎请我喝咖啡哦~!