小萝莉五子棋(高能绕行)
问题及代码:
/*
*copyright (t) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:test.cpp
*作者:张晴晴
*完成日期:2016年6月30日
*版本号:v1.0
*问题描述:五子棋
*输入描述:按照方式操作进行五子棋游戏,落子还可以悔棋
*程序输出:五子棋对战的实况,判断输赢
*///五子棋小游戏#include <stdio.h>
#include<windows.h>
#include <stdlib.h>
#include<conio.h> //使用getch()函数int startchoice,winner,player,Q[200][200]= {0}; //Q数组记录旗子
char button; //读入键盘输入的指令,如→struct Point //点坐标的结构体
{int x,y;
} point,game_xy;struct Piece //棋子的坐标记录
{struct Point coord;struct Piece *fore;
};struct Piece *head,*p,*ptr,*ptr1;void goto_xy(int x, int y) //光标移动函数
{COORD c;c.X=2*x;c.Y=y;SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}void Init() //初始化函数,将记录棋子的数组初始化
{for(int i=0; i<200; i++)for(int j=0; j<200; j++)Q[i][j]=0;startchoice=0;player=1;p=(struct Piece *)malloc(sizeof(struct Piece));head=p;
}void Welcome() //欢迎界面
{system("color 2F"); //#include<windows.h> 2 背景绿色 F 字体亮白色goto_xy(10,3);printf("—→");goto_xy(17,1);printf("主菜单");goto_xy(13,3);printf(" ***人人对战***");goto_xy(13,4);printf(" ***退出***");point.x=12;point.y=3;goto_xy(0,0);
}void ShowWho() //显示轮到哪一方下棋
{goto_xy(17,22);if(player==0)printf("轮到甲方落子");elseprintf("轮到乙方落子");goto_xy(point.x,point.y);
}void Draw() //绘画游戏界面
{game_xy.x=10;game_xy.y=3;system("cls");system("color 3F"); //3 湖蓝色 F 亮白色goto_xy(15,1);printf("欢迎play our 五子棋!");/*goto_xy(29,22);printf("重新开始 r");*/goto_xy(1,22);printf("悔棋 b");goto_xy(1,23);printf("退出 ESC");const int i=8; //const 定义的数据不可以被改变 而且修改数据比较方便const int j=19;const int k=3;goto_xy(game_xy.x-i,game_xy.y+k); //输出甲方的下棋方法printf("甲方: ●");goto_xy(game_xy.x-i,game_xy.y+k+2);printf("移动: 上 ↑");goto_xy(game_xy.x-i,game_xy.y+k+4);printf(" 下 ↓");goto_xy(game_xy.x-i,game_xy.y+k+6);printf(" 左 ←");goto_xy(game_xy.x-i,game_xy.y+k+8);printf(" 右 →");goto_xy(game_xy.x-i,game_xy.y+k+10);printf("落子: Enter");goto_xy(game_xy.x+j,game_xy.y+k); //输出乙方的下棋方法printf("乙方: ○");goto_xy(game_xy.x+j,game_xy.y+k+2);printf("移动: 上 ↑");goto_xy(game_xy.x+j,game_xy.y+k+4);printf(" 下 ↓");goto_xy(game_xy.x+j,game_xy.y+k+6);printf(" 左 ←");goto_xy(game_xy.x+j,game_xy.y+k+8);printf(" 右 →");goto_xy(game_xy.x+j,game_xy.y+k+10);printf("落子: Enter");for(int k1=0; k1<200; k1++) //初始化棋子记录,在第二局时有明确的作用for(int k2=0; k2<200; k2++)Q[k1][k2]=0;for(int i=0; i<18; i++) //画棋盘{if(i==0) //画第一行{goto_xy(10,i+3);printf("┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐");}if(i!=0&&i!=17) //画出中间16行{goto_xy(10,i+3);printf("├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤");}if(i==17) //画最后一行{goto_xy(10,i+3);printf("└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘");}}point.x=19;point.y=12;goto_xy(19,12);
}void Clean() //清除—→运动的轨迹
{goto_xy(10,3);printf(" ");goto_xy(24,3);printf(" ");goto_xy(10,4);printf(" ");goto_xy(24,4);printf(" ");
}void menu_choose(char press) //选择游戏还是退出
{if(press==72) //↑的ASCLL码{if(point.y==3)point.y=4;elsepoint.y=3;Clean();goto_xy(10,point.y);printf("—→");}if(press==80) //↓的ASCLL码{if(point.y==4)point.y=3;elsepoint.y=4;Clean();goto_xy(10,point.y);printf("—→");}if(press==13) // 13:回车键的ASCLL码{startchoice=point.y-2; //startchoice 为1或2}
}void go_back(int x1,int y1) //悔棋函数
{goto_xy(x1,y1);if(x1==10){if(y1==3){printf("┌");}else if(y1==20){printf("└");}else{printf("├");}}else if(x1==27){if(y1==3){printf("┐");}else if(y1==20){printf("┘");}else{printf("┤");}}else{if(y1==3){printf("┬");}else if(y1==20){printf("┴");}else{printf("┼");}}Q[point.x][point.y]=0; //在数组中将弹出的棋子对应的数据设为0goto_xy(x1,y1);
}void Record() //记录棋子的情况
{p->coord.x=point.x;p->coord.y=point.y;ptr=p;p=(struct Piece *)malloc(sizeof(struct Piece));p->fore=ptr;ShowWho();Q[point.x][point.y]=player+1;if(player){player=0;return;}player=1;goto_xy(point.x,point.y);
}void PutDown() //显示落子函数
{if(Q[point.x][point.y]==0) //先判断该位置是否有棋子{if(player){printf("●");printf("\a"); //'\a'表示蜂鸣声Record();}else{printf("○");printf("\a");Record();}goto_xy(point.x,point.y);}
}void Play(char ch) //键盘的操作 移动光标 下棋和悔棋操作
{if(ch==72) //↑的ASCLL码 光标上移{if(point.y<=3)point.y=20;elsepoint.y--;goto_xy(point.x,point.y);}if(ch==75) //←的ASCLL码 光标左移{if(point.x<=10)point.x=27;elsepoint.x--;goto_xy(point.x,point.y);}if(ch==77) //→的ASCLL码 光标右移{if(point.x>=27)point.x=10;elsepoint.x++;goto_xy(point.x,point.y);}if(ch==80) //↓的ASCLL码 光标下移{if(point.y>=20)point.y=3;elsepoint.y++;goto_xy(point.x,point.y);}if(ch==13) //回车键的ASCLL码 下棋{PutDown();}if(button=='b'||button=='B') //悔棋的操作{ptr1=p;if(p!=head){p=p->fore;free(ptr1);point.x=p->coord.x;point.y=p->coord.y;go_back(point.x,point.y);}}
}int Judge()
{int count=0;int pp=player==0?2:1; //三目运算for(int c=0; c<200; c++){for(int r=0; r<200; r++){if(Q[r][c]!=pp)continue;//检查列int rr=r;int cc=c;while(--cc>=3 &&Q[rr][cc]==pp)count++;cc=c;while(++cc<23 &&Q[rr][cc]==pp)count++;cc=c;if(count>=4)return pp;//检查行count=0;while(--rr>=10 &&Q[rr][cc]==pp)count++;rr=r;while(++rr<30 &&Q[rr][cc]==pp)count++;rr=r;if(count>=4)return pp;//检查反斜边count=0;cc--;rr--;while((cc>=3||rr>=10) &&Q[rr][cc]==pp){count++;cc--;rr--;}rr=r;cc=c;cc++;rr++;while((cc<23||rr<30) &&Q[rr][cc]==pp){count++;cc++;rr++;}rr=r;cc=c;if(count+1>=5)return pp;//检查正斜边count=0;cc++;rr--;while((cc<23||rr>=10) &&Q[rr][cc]==pp){count++;cc++;rr--;}rr=r;cc=c;cc--;rr++;while((cc>=3||rr<30) &&Q[rr][cc]==pp){count++;cc--;rr++;}rr=r;cc=c;if(count+1>=5)return pp;count=0;}}return 0;
}int main(void)
{system("color 4E");printf("\n 欢迎play五子棋!");goto_xy(15,3);printf("作者:小萝莉");goto_xy(17,5);printf(" HE·Honda");goto_xy(17,7);printf(" ZSSB");Sleep(3000);system("cls");while(1){Init(); //初始化int winner=0;Welcome(); //欢迎界面while(1) //读取菜单选项{char choice=getch();menu_choose(choice);if(startchoice!=0)break;}if(startchoice==1) //选择人人对战{Draw();goto_xy(17,22);printf("轮到甲方落子");goto_xy(point.x,point.y);while(1){button=getch();Play(button); //读取键盘的操作 移动光标 下棋和悔棋操作if(button==27) //ESC的ASCLL码{if(MessageBox(NULL,TEXT("确定退出?"),TEXT(""),MB_ICONQUESTION|MB_OKCANCEL)==IDOK){system("cls");printf("\n 谢谢使用!\n");return 0;}}if(button==13) //回车键ASCLL码 按下后开始判断输赢winner=Judge();if(winner!=0){goto_xy(15,24);if(winner==2){printf("恭喜!甲方赢!\n");}if(winner==1){printf("恭喜!乙方赢!\n");}}if(winner!=1&&winner!=2){continue;}goto_xy(13,22);printf(" 继续游戏?(Y/N): ");while(1){button=getch();if(button=='n'||button=='N'||button=='y'||button=='Y')break;}if(button=='n'||button=='N'){if(MessageBox(NULL,TEXT(" 确定退出?"),TEXT(""),MB_ICONQUESTION|MB_OKCANCEL)==IDOK){system("cls");printf("\n 谢谢使用!\n");return 0;}}if(button=='y'||button=='Y'){winner=0;system("cls");break;}}}if(startchoice==2){if(MessageBox(NULL,TEXT(" 确定退出?"),TEXT(""),MB_ICONQUESTION|MB_OKCANCEL)==IDOK){printf("\n\n 谢谢使用!\n");return 0;}}}return 0;
}
运行结果:
学习心得:
感觉好高能所以就保存发博文了,很多界面啥的搞不懂
小萝莉五子棋(高能绕行)相关推荐
- 当大叔爱上小萝莉我就爱上了正则表达式(一)
当大叔爱上小萝莉我就爱上了正则表达式 正则表达式的含义 正则表达式是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一 ...
- html网页制作看板娘原理,给网站添加 网页看板娘 效果 给网页添加一个可爱的小萝莉...
今天遇到了点小问题,上百度搜问题,无意中看到了这个效果,就找了下,给大家分享一下. 效果如下图 鼠标进入网页,小萝莉会根据鼠标位置而发生变化,此效果是canvas来实现的 需要给自己网站添加,复制下方 ...
- 游戏建模:手绘暗黑小萝莉
平时喜欢画画,最近呐再做一些个人作品.然后再A站各种淘原画,从一堆原画中挑选自己喜欢的,把它画成模型.然后发现选的原画每次都给自己挖了很多的坑. 在选这张原画的时候想的是,小萝莉卡哇伊.一身金闪闪发光 ...
- 关于《小萝莉的猴神大叔》些许体会
周末随意点着看的一部电影<小萝莉的猴神大叔>,没想到给了自己意想不到的触动:久违的感动,久违的"热泪盈眶". 关于"猴神": 笑点演绎生活中的苦乐. ...
- 小萝莉说Crash(一):Unrecognized selector sent to instance xxxx
写在前面的:分享一篇文,原文地址:小萝莉说Crash(一):Unrecognized selector sent to instance xxxx -------------------------- ...
- 小萝莉和他的数学迷老爸
不知道大数据文摘的读者里有没有数学不好的姑娘?会不会希望有个数学超好的老爸,可以经常手把手耐心地教导自己?这里带来的是一组系列漫画,生动地描绘了小萝莉和她的数学迷老爸之间发生的故事. 其实育儿既是一个 ...
- 小萝莉说Crash(二): Unrecognized selector xxx 之 ForwardInvocation
2015年不急不忙地到来,小萝莉为大家奉上新年礼包,祝大家新年快乐,希望开发GGMM们新一年的开发工作更加顺利.安心! 在上篇的分享中,小萝莉给大家介绍了一个入门必现的应用崩溃问题 -- Unreco ...
- 一只喵的西行记-11 与大叔小萝莉的不打不相识
还记得曾经我们一起躲在窗户外面听一户人家传来的音乐吗?没记错的话,那首歌好像叫<Shape Of My Heart>.那时,我跳到窗台上盯着电视,一点点把看到的内容向你复述.那是一个杀手和 ...
- linux开源社区贡献代码,4岁小萝莉向Linux内核贡献代码修复「漏洞」而且代码已经合并到内核...
最近国外社区 Reddit 上有个非常有趣的讨论 , 在过去发布的Linux内核中有处代码改进是名4岁的小萝莉提交的. 这名小萝莉向内核提交代码以修复某处「漏洞」,这次代码修订还是在 2014 年发 ...
最新文章
- Google创始人公开信:AI暖春和黑暗面
- Nginx服务器编译添加SSL模块
- 团队角色测试(结果分析已公布)
- hive整合phoenix
- 语言中根号打法_知识的诅咒,数学老师在教学中不得不防的陷阱
- 实验四:用一维数组输出等腰三角形的杨辉三角
- cck8graphpad作图_北京cck8数据作图「上海儒安生物科技供应」
- Netty4 学习笔记之三:粘包和拆包
- win7系统如何重启服务器,云骑士解决win7系统重启IIS服务的技巧介绍
- html word页面展示,word文档怎样调页面
- 54元阿里云上建站详细步骤
- 7-1 换硬币(20 分)
- c语言将数据写入文件后乱码_C语言 文件写入输出。文件载入后输出是乱码,纠结啊!...
- 0005 键盘打字如何练成像黑客一样的飞速
- 前端高频面试题-场景题
- 研究了3天,终于将 Shader 移植到 Cocos Creator 2.2.0 上了
- java google map_java如何通过google map api实现地址解析
- 在Ubuntu系统下运行c语言程序
- button设置为disabled
- ACCESS+ADO学习记录一点点