奇妙的三子棋之旅
来源:互联网 发布:淘宝红包雨是怎么回事 编辑:程序博客网 时间:2024/04/25 11:39
用C语言实现三子棋游戏,不论人或者电脑哪一方连成一条直线就算是赢
相信大家小时候都玩过三子棋游戏,双方只要连成一条线就算是赢,那仫如何用C语言去实现这个小游戏呢?
一. 拿到这样的一道题如何去分析呢?这才是我们要关心的问题,三子棋首先需要一定的棋盘可是如何去实现并打印这样的棋盘呢?C语言的二维数组为我们提供了极好的解决方法,用一个for循环控制语句就可以打印出相应的棋盘了。下面我们先来实现打印棋盘的部分功能:
void print_chess(){ int i=0; for(i=0;i<3;i++) { printf("_%c_|_%c_|_%c_\n",arr[i][0],arr[i][1],arr[i][2]); }}
二. 接下来的问题就是人如何输入自己要走的步数了?首先要对人输入的下标进行判断,在我的游戏中我设置的人输入的下标为0,1,2,如果正确就将对应位置赋成#号,代表人已经输入正确;如果输入下标不满足0,1,2就再次调用player()函数,重新输入下标直到输入正确的数组下标。下面我们就来实现人下棋的部分功能:
void player(){ printf("请输入你要走的坐标行号和列号:\n"); scanf("%d %d",&x,&y); if((x<0 || x>=3 || y<0 || y>=3) && arr[x][y] != 0) { printf("请重新输入\n"); player(); } else { arr[x][y]='#'; sz--; }}
三.然后就是电脑如何输入自己要走的步数,在我的游戏设置里使用了随机数来产生电脑所对应的数组下标,同样需要对下标进行一定的控制只有当该下标对应的数组中没有元素的时候电脑才可以输入对应的符号@,在程序中使用了do{}while循环,每当电脑或者人输入对应的符号时sz(数组初始长度)就减一,以便于判断当数组是否还有空位置的情况。下面我们就来实现电脑下棋的部分结果:
void comper(){ do { srand((unsigned)time(NULL)); x=rand()%3; y=rand()%3; }while (arr[x][y] != 0); sz--; arr[x][y] = '@';}
四. 接下来就是如何判断游戏的结果了了,很明显可能会出现三种情况:1.当sz(数组初始长度)减为0时说明没有空位置了,当然游戏就可以结束了,此时是平局;2.当横着三行,竖着三行或者交叉两行连成一条直线的时候游戏也可以结束,如果对应符号时#则玩家赢否则是电脑赢。
char winner(){ int i=0; for(i=0;i<3;i++) { if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != 0) { return arr[i][0]; } } for(i=0;i<3;i++) { if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != 0) { return arr[2][i]; } } if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != 0) { return arr[0][0]; } if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != 0 ) { return arr[0][2]; } if(sz == 0) { return 1; } else { return 0; }}
五. 最后当然就是主函数如何去调用这些函数啦!用w来接收判断输赢函数的返回值,由上面判断可知,当返回值为0时说明数组中还存在空位置,可以进入循环,即分别调用print_chess()函数,player()函数,只有当sz不为0说明存在空位置则可以再次调用comper()函数和winner(),至此游戏就可以结束了。
在这里附上程序源代码,方便理解:
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>#define LINE 3#define MAX 3char arr[LINE][MAX]={0};int sz=sizeof(arr)/sizeof(arr[0][0]);int x=0;int y=0;void print_chess(){ int i=0; for(i=0;i<3;i++) { printf("_%c_|_%c_|_%c_\n",arr[i][0],arr[i][1],arr[i][2]); }}void player(){ printf("请输入你要走的坐标行号和列号:\n"); scanf("%d %d",&x,&y); if((x<0 || x>=3 || y<0 || y>=3) && arr[x][y] != 0) { printf("请重新输入\n"); player(); } else { arr[x][y]='#'; sz--; }}void comper(){ do { srand((unsigned)time(NULL)); x=rand()%3; y=rand()%3; }while (arr[x][y] != 0); sz--; arr[x][y] = '@';}char winner(){ int i=0; for(i=0;i<3;i++) { if(arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != 0) { return arr[i][0]; } } for(i=0;i<3;i++) { if(arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != 0) { return arr[2][i]; } } if(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != 0) { return arr[0][0]; } if(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != 0 ) { return arr[0][2]; } if(sz == 0) { return 1; } else { return 0; }}int main(){ int i=0; char w = 0; while (w == 0) { print_chess(); player(); if (sz != 0) { comper(); w=winner(); } } print_chess(); if(w == '#') { printf("玩家赢\n"); } else if (w == 1) { printf("平局\n"); } else { printf("电脑赢\n"); } system("pause");}
那仫这个游戏是不是能达到我们预期的效果呢?下面我们就来看一组下棋的示例:
看到这里千万不要以为只有人可以赢,电脑也是可以赢得呢!
在这个游戏中电脑下棋使用的是用时间生成的种子,其实存在一定的缺陷,如果程序没有运行到你要指定的程序部分,那仫你就需要等待一定的时间才能生成随机数。
2 0
- 奇妙的三子棋之旅
- EXT的奇妙之旅
- 探究Linux的奇妙之旅
- 尝试的奇妙之处
- ++运算的奇妙之处
- table的奇妙之处
- Eclipse-ECF 感受奇妙的协同编程之旅
- 程序员 2014-9-25 一天的奇妙之旅
- 程序员 2014-9-26 一天的奇妙之旅
- 程序员 2014-9-28 一天的奇妙之旅
- 程序员2014-10-10一天的奇妙之旅
- 产品经理与需求文档的一场奇妙之旅
- 奇妙的北京之旅——软考总结
- NSArray的奇妙探索之旅(深入探究NSArray)
- Kotlin与Android的奇妙之旅(一)
- Kotlin与Android的奇妙之旅-FindViewbyid(三)
- 码神之奇妙之旅3
- 悟透JavaScript之奇妙的对象
- 续:node解决通过npm无法安装forever的方法
- 安卓LayoutInflater.inflate用法
- C语言中空格符,制表符,换行符详解
- 自旋锁和互斥锁区别
- [疯狂Java]JDBC:JDBC/ODBC基本概念、MySQL基本命令、SQL语句基本概念
- 奇妙的三子棋之旅
- android mediarecorder自制录相机花屏问题
- 高效编程之互斥锁和自旋锁的一些知识
- javascript处理HTML的Encode(转码)和Decode(解码)总结,避免js脚本注入问题
- cocos2dx之界面响应提速
- spring+mybatis时会出现Cannot load JDBC driver class ${jdbc.driverClassName}'
- 多线程编程-互斥锁
- jsp#0开发环境配置注意点
- crossDomain、allowDomain()、allowScriptAccess三者的关系解析