纯C语言做的键盘操作的五子棋.docx

上传人:人*** 文档编号:559821263 上传时间:2023-08-24 格式:DOCX 页数:9 大小:34.27KB
返回 下载 相关 举报
纯C语言做的键盘操作的五子棋.docx_第1页
第1页 / 共9页
纯C语言做的键盘操作的五子棋.docx_第2页
第2页 / 共9页
纯C语言做的键盘操作的五子棋.docx_第3页
第3页 / 共9页
纯C语言做的键盘操作的五子棋.docx_第4页
第4页 / 共9页
纯C语言做的键盘操作的五子棋.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《纯C语言做的键盘操作的五子棋.docx》由会员分享,可在线阅读,更多相关《纯C语言做的键盘操作的五子棋.docx(9页珍藏版)》请在金锄头文库上搜索。

1、为了帮助初学者理解,注释非常详细,希望对初学者有所启发!#include #include #include #include #define MAXIMUS 15 /定义棋盘大小int pMAXIMUSMAXIMUS;/存储对局信息char buffMAXIMUS*2+1MAXIMUS*4+3;/输出缓冲器int Cx,Cy;/当前光标位置int Now;/当前走子的玩家,1代表黑,2代表白int wl,wp;/当前写入缓冲器的列数和行数位置char* showText;/在棋盘中央显示的文字信息int count;/回合数char* Copy(char* strDest,const cha

2、r* strSrc)/修改过的字符串复制函数,会忽略末端的0char* strDestCopy = strDest;while (*strSrc!=0)*strDest+=*strSrc+;return strDestCopy;void Initialize()/初始化一个对局函数int i,j;/循环变量showText=;/重置显示信息count=0;/回合数归零for(i=0;iMAXIMUS;i+)/重置对局数据for(j=0;jMAXIMUS;j+)pij=0;Cx=Cy=MAXIMUS/2;/重置光标到中央Now=1;/重置当前为黑方char* getStyle(int i,int

3、 j)/获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘if(pij=1)/1为黑子return ;else if(pij=2)/2为白子return ;else if(i=0&j=0)/以下为边缘棋盘样式return ;else if(i=MAXIMUS-1&j=0)return ;else if(i=MAXIMUS-1&j=MAXIMUS-1)return ;else if(i=0&j=MAXIMUS-1)return ;else if(i=0)return ;else if(i=MAXIMUS-1)return ;else if(j=0)return ;else if(j=MAXIM

4、US-1)return ;return ;/中间的空位char* getCurse(int i,int j)/获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示if(i=Cx)if(j=Cy)return ;else if (j=Cy+1)return ;else if(i=Cx+1)if(j=Cy)return ;else if (j=Cy+1)return ;return ;/如果不在光标附近则为空void write(char* c)/向缓冲器写入字符串Copy(buffwl+wp,c);wp+=strlen(c);void ln()/缓冲器写入位置提行wl+=1;wp=0;v

5、oid Display()/将缓冲器内容输出到屏幕int i,l=strlen(showText);/循环变量,中间文字信息的长度int Offset=MAXIMUS*2+2-l/2;/算出中间文字信息居中显示所在的横坐标位置if(Offset%2=1)/如果位置为奇数,则移动到偶数,避免混乱Offset-;Copy(buffMAXIMUS+Offset,showText);/讲中间文字信息复制到缓冲器if(l%2=1)/如果中间文字长度为半角奇数,则补上空格,避免混乱*(buffMAXIMUS+Offset+l)=0x20;system(cls);/清理屏幕,准备写入for(i=0;iMAX

6、IMUS*2+1;i+)/循环写入每一行printf(%s,buffi);if(iMAXIMUS*2)/写入完每一行需要换行printf(n);void Print()/将整个棋盘算出并储存到缓冲器,然后调用Display函数显示出来int i,j;/循环变量wl=0;wp=0;for(j=0;j=MAXIMUS;j+)/写入出交点左上角的字符,因为需要打印棋盘右下角,所以很以横纵各多一次循环for(i=0;i=MAXIMUS;i+)write(getCurse(i,j);/写入左上角字符if(j=0|j=MAXIMUS)/如果是棋上下盘边缘则没有连接的竖线,用空格填充位置if(i!=MAXI

7、MUS)write();else/如果在棋盘中间则用竖线承接上下if(i=0|i=MAXIMUS-1)/左右边缘的竖线更粗write();else if(i!=MAXIMUS)/中间的竖线write();if(j=MAXIMUS)/如果是最后一次循环,则只需要处理边侧字符,交点要少一排break;ln();/提行开始打印交点内容write();/用空位补齐位置for(i=0;iMAXIMUS;i+)/按横坐标循环正常的次数write(getStyle(i,j);/写入交点字符if(i!=MAXIMUS-1)/如果不在最右侧则补充一个横线承接左右if(j=0|j=MAXIMUS-1)write(

8、);/上下边缘的横线更粗elsewrite();/中间的横线ln();/写完一行后提行Display();/将缓冲器内容输出到屏幕int Put()/在当前光标位置走子,如果非空,则返回0表示失败if(pCxCy=0)pCxCy=Now;/改变该位置数据return 1;/返回1表示成功elsereturn 0;int Check()/胜负检查,即判断当前走子位置有没有造成五连珠的情况int w=1,x=1,y=1,z=1,i;/累计横竖正斜反邪四个方向的连续相同棋子数目for(i=1;i5;i+)if(Cy+iMAXIMUS&pCxCy+i=Now)w+;else break;/向下检查fo

9、r(i=1;i0&pCxCy-i=Now)w+;else break;/向上检查if(w=5)return Now;/若果达到5个则判断当前走子玩家为赢家for(i=1;i5;i+)if(Cx+iMAXIMUS&pCx+iCy=Now)x+;else break;/向右检查for(i=1;i0&pCx-iCy=Now)x+;else break;/向左检查if(x=5)return Now;/若果达到5个则判断当前走子玩家为赢家for(i=1;i5;i+)if(Cx+iMAXIMUS&Cy+iMAXIMUS&pCx+iCy+i=Now)y+;else break;/向右下检查for(i=1;i

10、0&Cy-i0&pCx-iCy-i=Now)y+;else break;/向左上检查if(y=5)return Now;/若果达到5个则判断当前走子玩家为赢家for(i=1;i5;i+)if(Cx+i0&pCx+iCy-i=Now)z+;else break;/向右上检查for(i=1;i0&Cy+i=5)return Now;/若果达到5个则判断当前走子玩家为赢家return 0;/若没有检查到五连珠,则返回0表示还没有玩家达成胜利int RunGame()/进行整个对局,返回赢家信息(虽然有用上)int input;/输入变量int victor;/赢家信息Initialize();/初始

11、化对局while(1)/开始无限回合的死循环,直到出现胜利跳出Print();/打印棋盘input=getch();/等待键盘按下一个字符if(input=27)/如果是ESC则退出程序exit(0);else if(input=0x20)/如果是空格则开始走子if(Put()/如果走子成功则判断胜负victor=Check();Now=3-Now;/轮换当前走子玩家count+;if(victor=1)/如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息showText=黑方获得了胜利!;Print();if(getch()=0xE0)getch();return Now;else

12、if(victor=2)/如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息showText=白方获得了胜利!;Display();if(getch()=0xE0)getch();return Now;else if(count=MAXIMUS*MAXIMUS)/如果回合数达到了棋盘总量,即棋盘充满,即为平局showText=平局!;Display();if(getch()=0xE0)getch();return 0;else if(input=0xE0)/如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键input=getch();/获得第二次输入信息switch(input)/判断方向键方向并移动光标位置case 0x4B:/Cx-;break;case 0x48:Cy-;break;case 0x4D:Cx+;break;case 0x50:Cy+;break;if(Cx0)Cx=MAXIMUS-1;/如果光标位置越界则移动到对侧if(CyMAXIMUS-1)Cx=0;if(CyMAXIMUS-1)Cy=0;int main()/主函数system(title 简易五子棋 Etsnarl制作);/设置标题sy

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号