C语言实现简易三子棋游戏
前言
三子棋(Tic-tac-toe)是一种简单而经典的两人对战游戏,规则简单,但蕴含着一定的策略性。本文将介绍如何使用C语言实现一个简易的三子棋游戏,通过这个小项目,我们可以学习到C语言的基本语法、二维数组的使用、函数的定义与调用、条件判断等知识点。
游戏规则
- 游戏在3×3的棋盘上进行
- 玩家使用符号 ‘*’,电脑使用符号 ‘#’
- 玩家和电脑轮流在棋盘上放置自己的符号
- 谁先在横、竖或对角线上连成一条线,谁就获胜
- 如果棋盘填满但没有连成线,则游戏平局
代码结构
整个游戏的代码结构如下:
- 定义棋盘大小和全局变量
- 实现棋盘打印函数
- 实现胜负判断函数
- 实现游戏主逻辑函数
- 实现主菜单和游戏流程控制
核心代码实现
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++) { } 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策略比较简单:
- 首先检查玩家是否有两个棋子连在一起,如果有,则在第三个位置下棋阻止玩家获胜
- 如果没有需要阻止的情况,则优先选择靠近玩家最后一步棋的位置
- 如果以上位置都不可用,则选择任意一个空位
虽然这个AI策略比较简单,但对于初学者来说已经具有一定的挑战性。
游戏改进方向
这个三子棋游戏还有很多可以改进的地方:
- 增加输入验证,防止玩家输入无效的坐标
- 优化电脑AI算法,使其更具挑战性
- 添加游戏难度选择
- 改进用户界面,使用更直观的棋盘显示
- 添加游戏统计功能,记录胜负次数
总结
通过这个简单的三子棋游戏项目,我们学习了C语言的基本语法和程序设计思想。虽然代码还有很多可以优化的地方,但作为一个入门级的小项目,它已经很好地展示了C语言的基本特性和游戏开发的基本思路。
希望这个项目能够帮助大家更好地理解C语言编程,并激发更多的编程兴趣!