三子棋

C语言实现简易三子棋游戏

前言

三子棋(Tic-tac-toe)是一种简单而经典的两人对战游戏,规则简单,但蕴含着一定的策略性。本文将介绍如何使用C语言实现一个简易的三子棋游戏,通过这个小项目,我们可以学习到C语言的基本语法、二维数组的使用、函数的定义与调用、条件判断等知识点。

游戏规则

  • 游戏在3×3的棋盘上进行
  • 玩家使用符号 ‘*’,电脑使用符号 ‘#’
  • 玩家和电脑轮流在棋盘上放置自己的符号
  • 谁先在横、竖或对角线上连成一条线,谁就获胜
  • 如果棋盘填满但没有连成线,则游戏平局

代码结构

整个游戏的代码结构如下:

  1. 定义棋盘大小和全局变量
  2. 实现棋盘打印函数
  3. 实现胜负判断函数
  4. 实现游戏主逻辑函数
  5. 实现主菜单和游戏流程控制

核心代码实现

1. 定义棋盘大小和全局变量

1
2
3
4
# define ROW 3
# define LIE 3
#include<stdio.h>
char broad[ROW][LIE];

这里我们定义了棋盘的行数和列数,并创建了一个全局的字符型二维数组作为棋盘。

2. 棋盘打印函数

1
2
3
4
5
6
7
8
9
10
11
12
13
void print()
{
int i,r;
for(i=0;i<ROW;i++)
{
for(r=0;r<LIE;r++)
{
printf("%c ",broad[i][r]);
}
printf("\n");
}

}

这个函数负责将当前棋盘状态打印到控制台,使用嵌套循环遍历二维数组并打印每个位置的字符。

3. 胜负判断函数

游戏中有两个判断函数:win()和lost(),分别用于判断玩家和电脑是否获胜。这两个函数的逻辑基本相同,都是检查横向、纵向和对角线是否有连成一线的情况。

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
int win(char v)
{
int i,r=0;
// 检查横向
for(i=0;i<ROW;i++)
{
if(broad[i][r]== v &&broad[i][r]==broad[i][r+1]&&broad[i][r+1]==broad[i][r+2])
{
printf("you win!!!\n");
return 0;
}
}
// 检查纵向
for(r=0,i=0;r<LIE;r++)
{
if(broad[i][r]== v &&broad[i][r]==broad[i+1][r]&&broad[i+1][r]==broad[i+2][r])
{
printf("you win!!!\n");
return 0;
}
}
// 检查主对角线
for(i=0;i<ROW;i++)
{
for(r=0;r<LIE;r++)
{
if(i==r)
{
if(broad[i][r]== v &&broad[i][r]==broad[i+1][r+1]&&broad[i+1][r+1]==broad[i+2][r+2])
{
printf("you win!!!\n");
return 0;
}
}

}
}
// 检查副对角线
for(i=0;i<ROW;i++)
{
for(r=0;r<LIE;r++)
{
if(i+r==2)
{
if(broad[i][r]== v &&broad[i][r]==broad[i+1][r-1]&&broad[i+1][r-1]==broad[i+2][r-2])
{
printf("you win!!!\n");
return 0;
}
}
}
}



return 1;

}

4. 游戏主逻辑函数

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
void game()
{
int i,r,k1,j1,j,k;

// 初始化棋盘
for(i=0;i<ROW;i++)
{
for(r=0;r<LIE;r++)
{
broad[i][r]='-';
}
}
print();

// 游戏主循环
do{
// 玩家下棋
printf("请输入 >");
scanf("%d %d",&j1,&k1);
broad[j1][k1]='*';
print();

// 电脑下棋
printf("电脑下棋中 >\n");

for(j=0;j<ROW;j++)
{
for(k=0;k<LIE;k++)
{
// 电脑AI逻辑,尝试阻止玩家连成一线
// 或者在合适的位置下棋
// ...
}
break;
}

print();

}while(lost('#')&&win('*')); // 循环直到有人获胜或平局
}

游戏主逻辑函数首先初始化棋盘,然后进入游戏主循环。在循环中,玩家和电脑轮流下棋,每次下棋后都会检查胜负情况。

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
26
27
28
29
30
31
int main(){
int zl;
do{
printf("**********************\n");
printf("******1.开始游戏******\n");
printf("******0.退出游戏******\n");
printf("**********************\n");

printf("请选择 >");
scanf("%d",&zl);
if(zl==1)
{
printf("游戏开始\n");
game();
}
else if(zl==0)
{
printf("您已经成功退出游戏\n");
return 0;
}
else
{
printf("错误\n");

}


}while(zl);

return 0;
}

主函数实现了一个简单的菜单系统,让玩家可以选择开始游戏或退出游戏。

电脑AI策略

在这个简易版的三子棋中,电脑的AI策略比较简单:

  1. 首先检查玩家是否有两个棋子连在一起,如果有,则在第三个位置下棋阻止玩家获胜
  2. 如果没有需要阻止的情况,则优先选择靠近玩家最后一步棋的位置
  3. 如果以上位置都不可用,则选择任意一个空位

虽然这个AI策略比较简单,但对于初学者来说已经具有一定的挑战性。

游戏改进方向

这个三子棋游戏还有很多可以改进的地方:

  1. 增加输入验证,防止玩家输入无效的坐标
  2. 优化电脑AI算法,使其更具挑战性
  3. 添加游戏难度选择
  4. 改进用户界面,使用更直观的棋盘显示
  5. 添加游戏统计功能,记录胜负次数

总结

通过这个简单的三子棋游戏项目,我们学习了C语言的基本语法和程序设计思想。虽然代码还有很多可以优化的地方,但作为一个入门级的小项目,它已经很好地展示了C语言的基本特性和游戏开发的基本思路。

希望这个项目能够帮助大家更好地理解C语言编程,并激发更多的编程兴趣!