寒假作业——五子棋简单实现
来源:互联网 发布:淘宝店铺进货虚拟 编辑:程序博客网 时间:2024/04/30 13:41
时间过的真快,寒假这就快完了.....作业也刚刚完成,100道oj和一个小游戏的作业量感觉秒杀了不少学生(学霸走开).....
oj很多水题就不发了,把五子棋的简单实现奉上,可能会有点帮助,代码写的很乱,不过注释自我感觉还是很全面的.....
这个代码用到的知识都很简单,主要还是思路吧,所以做出来很low,根本不能当作小游戏,权当是简单实现....
这个代码我是参考了别人写的框架,然后自己想的核心,算是个半仿,水平很低,代码还有很多改进的地方,甚至有bug,时间有限,后来功力上涨后在看吧
/*Copyright(c)2016,烟台大学计算机学院 all rights reserved. 作者:曹欣宇 指导教师:贺利坚 完成日期:2017年2月21日 输入 落子坐标 输出 落子后棋盘样例输入 见运行图样例输出 见运行图 */ #include <stdio.h>#include <stdlib.h>#define N 20//以下为初始化棋盘函数,将棋盘初始化void init_wzq(char (*game)[N]){ int i,j; for(i=0; i<N; i++) { for(j=0; j<N; j++) game[i][j]='+'; }}//以下为展示棋盘函数,将棋盘展示出来void show_wzq(char (*game)[N]){ int i,j; for(i=0; i<N; i++) { for(j=0; j<N; j++) { printf("%c ",game[i][j]); } printf("\n"); }}//黑棋的判断输赢函数int playBlack_wzq(int qizi1,int qizi2,char (*game)[N]){ int j,j2,p1,p2,p3,p4,q3,q4,m=1; //以下为横向 if(qizi2>=4)//横向分两种情况,第一,下的子纵坐标>=4,第二,下的子纵坐标<4 p1=qizi2-4; else p1=0; for(j=p1; j<=qizi2+4; j++)//从下子左边4个开始看整行是否存在五子连珠,若左边不到四个就到零的话就从零开始。 { if(game[qizi1][j]=='@') { for(j2=j; j2<=j+4; j2++) { if(game[qizi1][j2]!='@') m=0; } if(m==1) { printf("黑棋获得胜利!\n"); return 1; } } } m=1; //以下为竖向 if(qizi1>=4)//与横向相似 p2=qizi1-4; else p2=0; for(j=p2; j<=qizi1+4; j++) { if(game[j][qizi2]=='@') { for(j2=j; j2<=j+4; j2++) { if(game[j2][qizi2]!='@') m=0; } if(m==1) { printf("黑棋获得胜利!\n"); return 1; } } } m=1; //一下为“/”向 p3=qizi1,p4=qizi2;//这里最好将qizi变量固定,因为\向一会还要用到,如果不变,将影响\向的判断 while(p4!=0&&p3!=N-1)//将落子的数值通过循环,变到/向的最左下角 { p3++; p4--; } j=p3; while(p3!=0&&p4!=N-1)//从之前的左下角,遍历到右上角,检测是否有五子连珠 { if(game[p3][p4]=='@') { q3=p3,q4=p4; for(j2=j; j2<=j+4; q3--,q4++,j2++) { if(game[q3][q4]!='@') m=0; } if(m==1) { printf("黑棋获得胜利!\n"); return 1; } } j--; p3--,p4++; } m=1; //以下为“\”方向 while(qizi2!=N-1&&qizi1!=N-1)//思路同/向 { qizi1++; qizi2++; } j=qizi1; while(qizi1!=0&&qizi2!=0) { if(game[qizi1][qizi2]=='@') { p3=qizi1,p4=qizi2; for(j2=j; j2<=j+4; p3--,p4--,j2++) { if(game[p3][p4]!='@') m=0; } if(m==1) { printf("黑棋获得胜利!\n"); return 1; } } j--,qizi1--,qizi2--; } return 0;}//以下为白棋的判断函数,和黑棋几乎一样,相似度如此之高(只是‘@’变为‘O’),还是有改进的余地int playWhile_wzq(int qizi1,int qizi2,char (*game)[N]){ int j,j2,p1,p2,p3,p4,q3,q4,m=1; //以下为横向 if(qizi2>=4) p1=qizi2-4; else p1=0; for(j=p1; j<=qizi2+4; j++) { if(game[qizi1][j]=='O') { for(j2=j; j2<=j+4; j2++) { if(game[qizi1][j2]!='O') m=0; } if(m==1) { printf("白棋获得胜利!\n"); return 1; } } } m=1; //以下为竖向 if(qizi1>=4) p2=qizi1-4; else p2=0; for(j=p2; j<=qizi1+4; j++) { if(game[j][qizi2]=='O') { for(j2=j; j2<=j+4; j2++) { if(game[j2][qizi2]!='O') m=0; } if(m==1) { printf("白棋获得胜利!\n"); return 1; } } } m=1; //一下为“/”向 p3=qizi1,p4=qizi2; while(p4!=0&&p3!=N-1) { p3++; p4--; } j=p3; while(p3!=0&&p4!=N-1) { if(game[p3][p4]=='O') { q3=p3,q4=p4; for(j2=j; j2<=j+4; q3--,q4++,j2++) { if(game[q3][q4]!='O') m=0; } if(m==1) { printf("白棋获得胜利!\n"); return 1; } } j--; p3--,p4++; } m=1; //以下为“\”方向 while(qizi2!=N-1&&qizi1!=N-1) { qizi1++; qizi2++; } j=qizi1; while(qizi1!=0&&qizi2!=0) { if(game[qizi1][qizi2]=='O') { p3=qizi1,p4=qizi2; for(j2=j; j2<=j+4; p3--,p4--,j2++) { if(game[p3][p4]!='O') m=0; } if(m==1) { printf("白棋获得胜利!\n"); return 1; } } j--,qizi1--,qizi2--; } return 0;}int main(){ char game[N][N]; int white1=0,white2=0;//白棋的坐标 int black1=0,black2=0;//黑棋的坐标 int judge=0;//判断输赢 int count=0;//判断落子 printf("简易(麻烦)五子棋,本棋盘黑棋先走\n"); init_wzq(game); show_wzq(game); while(1) { if(count==N*N) { printf("棋盘已满,平局!\n"); } if(count%2==0)//count为0,2,4,等偶数时,黑棋落子 { printf("请输入您要落子(黑子)的坐标(例如0 1或4 8,4 8为5行9列):"); scanf("%d %d",&black1,&black2); while(black1>N-1||black2>N-1||black1<0||black2<0) { printf("落子出界,请重新输入!"); scanf("%d %d",&black1,&black2); } while(game[black1][black2]!='+') { printf("此处已经落过子,请重新落子:"); scanf("%d %d",&black1,&black2); } game[black1][black2]='@';//这行是参考别人的,感觉很巧妙,大神勿喷.... judge=playBlack_wzq(black1,black2,game); if(judge==1) { show_wzq(game); printf("程序结束\n"); return 0; } } else//白棋 { printf("请输入您要落子(白子)的坐标(例如0 1或4 8,4 8为5行9列):"); scanf("%d %d",&white1,&white2); if(white1>N-1||white2>N-1||white1<0||white2<0) { printf("落子出界,请重新输入!\n"); while(white1<=N-1&&white2<=N-1) { scanf("%d %d",&white1,&white2); } } while(game[white1][white2]!='+') { printf("此处已经落过子,请重新落子:"); scanf("%d %d",&white1,&white2); } game[white1][white2]='O'; judge=playWhile_wzq(white1,white2,game); if(judge==1) { show_wzq(game); printf("程序结束\n"); return 0; } } count++; show_wzq(game); } return 0;}
0 0
- 寒假作业——五子棋简单实现
- 第七届蓝桥杯—寒假作业
- 寒假作业——画空心三角形
- 寒假作业——画8
- 寒假作业——分数求和
- 如何实现简单五子棋?
- java实现简单五子棋
- 五子棋的简单实现
- 简单五子棋----C语言实现
- java实现简单的五子棋
- C语言简单实现五子棋
- 博弈算法实现简单五子棋
- 五子棋的简单实现方式
- JavaScript实现简单人机五子棋
- Java简单实现的五子棋
- 寒假集训作业(1)——结构体
- 寒假集训作业(2)——链表
- 寒假集训作业(3)——栈与队列
- Windows7下Python3.4使用MySQL数据库(安装教程)
- 360浏览器默认打开页面的方式(极速、IE)
- Fresco使用的一些坑(初学者)
- Lnmp mysql+php+nigx+discuz 续
- 阿里提示Discuz uc.key泄露导致代码注入漏洞的解决方法
- 寒假作业——五子棋简单实现
- 稀疏编码工具箱SPAMS windows下 Matlab接口配置
- CF #398B The Queue
- 机器视觉开源代码(英语)
- PCA 原理
- [华为OJ--C++]046-成绩排序
- Java程序莫名其妙卡死的一次经历
- sed基础使用
- MySQL 的一些坑