首页 C语言五子棋设计

C语言五子棋设计

举报
开通vip

C语言五子棋设计C语言五子棋设计#include #include"bios.h"#include #include #include #defineCROSSRU0xbf/*右上角点*/ #defineCROSSLU0xda/*左上角点*/ #defineCROSSLD0xc0/*左下角点*/ #defineCROSSRD0xd9/*右下角点*/ #defineCROSSL0xc3/*左边*/ #defineCROSSR0xb4/*右边*/ #defineCROSSU0xc2/*上边*/ #defineCROSSD0xc1/*下...

C语言五子棋设计
C语言五子棋 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 #include #include"bios.h"#include #include #include #defineCROSSRU0xbf/*右上角点*/ #defineCROSSLU0xda/*左上角点*/ #defineCROSSLD0xc0/*左下角点*/ #defineCROSSRD0xd9/*右下角点*/ #defineCROSSL0xc3/*左边*/ #defineCROSSR0xb4/*右边*/ #defineCROSSU0xc2/*上边*/ #defineCROSSD0xc1/*下边*/ #defineCROSS0xc5/*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #defineMAPXOFT5 #defineMAPYOFT2 /*定义1号玩家的操作键键码*/ #definePLAY1UP0x1157/*上移--'W'*/ #definePLAY1DOWN0x1f53/*下移--'S'*/ #definePLAY1LEFT0x1e41/*左移--'A'*/ #definePLAY1RIGHT0x2044/*右移--'D'*/ #definePLAY1DO0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #definePLAY2UP0x4800/*上移--方向键up*/ #definePLAY2DOWN0x5000/*下移--方向键down*/ #definePLAY2LEFT0x4b00/*左移--方向键left*/ #definePLAY2RIGHT0x4d00/*右移--方向键right*/ #definePLAY2DO0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出,可按Esc键*/ #defineESCAPE0x011b /*定义棋盘上交叉点的状态,即该点有无棋子*/ /*若有棋子,还应能指出是哪个玩家的棋子*/ #defineCHESSNULL0/*没有棋子*/ #defineCHESS1'O'/*一号玩家的棋子*/ #defineCHESS2'X'/*二号玩家的棋子*/ /*定义按键类别*/ #defineKEYEXIT0/*退出键*/ #defineKEYFALLCHESS1/*落子键*/ #defineKEYMOVECURSOR2/*光标移动键*/ #defineKEYINVALID3/*无效键*/ /*定义符号常量:真,假---真为1,假为0*/ #defineTRUE1 #defineFALSE0 /**********************************************************/ /*定义数据结构*/ /*棋盘交叉点坐标的数据结构*/ structpoint { intx,y; }; /**********************************************************/ /*自定义函数原型说明*/ voidInit(void); intGetKey(void); intCheckKey(intpress); intChangeOrder(void); intChessGo(intOrder,structpointCursor); voidDoError(void); voidDoOK(void); voidDoWin(intOrder); voidMoveCursor(intOrder,intpress); voidDrawCross(intx,inty); voidDrawMap(void); intJudgeWin(intOrder,structpointCursor); intJudgeWinLine(intOrder,structpointCursor,intdirection); voidShowOrderMsg(intOrder); voidEndGame(void); /**********************************************************/ /**********************************************************/ /*定义全局变量*/ intgPlayOrder;/*指示当前行棋方*/ structpointgCursor;/*光标在棋盘上的位置*/ chargChessBoard[19][19];/*用于记录棋盘上各点的状态*/ /**********************************************************/ /**********************************************************/ /*主函数*/ voidmain() { intpress; intbOutWhile=FALSE;/*退出循环标志*/ Init();/*初始化图象,数据*/ while(1) { press=GetKey();/*获取用户的按键值*/ switch(CheckKey(press))/*判断按键类别*/ { /*是退出键*/ caseKEYEXIT: clrscr();/*清屏*/ bOutWhile=TRUE; break; /*是落子键*/ caseKEYFALLCHESS: if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/ DoError();/*落子错误*/ else { DoOK();/*落子正确*/ /*如果当前行棋方赢棋*/ if(JudgeWin(gPlayOrder,gCursor)==TRUE) { DoWin(gPlayOrder); bOutWhile=TRUE;/*退出循环标志置为真*/ } /*否则*/ else /*交换行棋方*/ ChangeOrder(); ShowOrderMsg(gPlayOrder); } break; /*是光标移动键*/ caseKEYMOVECURSOR: MoveCursor(gPlayOrder,press); break; /*是无效键*/ caseKEYINVALID: break; } if(bOutWhile==TRUE) break; } /*游戏结束*/ EndGame(); } /**********************************************************/ /*界面初始化,数据初始化*/ voidInit(void) { inti,j; char*Msg[]= { "Player1key:", "UP----w", "DOWN--s", "LEFT--a", "RIGHT-d", "DO----space", "", "Player2key:", "UP----up", "DOWN--down", "LEFT--left", "RIGHT-right", "DO----ENTER", "", "exitgame:", "ESC", NULL, }; /*先手方为1号玩家*/ gPlayOrder=CHESS1; /*棋盘数据清零,即棋盘上各点开始的时候都没有棋子*/ for(i=0;i<19;i++) for(j=0;j<19;j++) gChessBoard[i][j]=CHESSNULL; /*光标初始位置*/ gCursor.x=gCursor.y=0; /*画棋盘*/ textmode(C40); DrawMap(); /*显示操作键说明*/ i=0; textcolor(BROWN); while(Msg[i]!=NULL) { gotoxy(25,3+i); cputs(Msg[i]); i++; } /*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); } /*画棋盘*/ voidDrawMap(void) { inti,j; clrscr(); for(i=0;i<19;i++) for(j=0;j<19;j++) DrawCross(i,j); } /*画棋盘上的交叉点*/ voidDrawCross(intx,inty) { gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/ if(gChessBoard[x][y]==CHESS1) { textcolor(LIGHTBLUE); putch(CHESS1); return; } /*交叉点上是二号玩家的棋子*/ if(gChessBoard[x][y]==CHESS2) { textcolor(LIGHTRED); putch(CHESS2); return; } textcolor(GREEN); /*左上角交叉点*/ if(x==0&&y==0) { putch(CROSSLU); return; } /*左下角交叉点*/ if(x==0&&y==18) { putch(CROSSLD); return; } /*右上角交叉点*/ if(x==18&&y==0) { putch(CROSSRU); return; } /*右下角交叉点*/ if(x==18&&y==18) { putch(CROSSRD); return; } /*左边界交叉点*/ if(x==0) { putch(CROSSL); return; } /*右边界交叉点*/ if(x==18) { putch(CROSSR); return; } /*上边界交叉点*/ if(y==0) { putch(CROSSU); return; } /*下边界交叉点*/ if(y==18) { putch(CROSSD); return; } /*棋盘中间的交叉点*/ putch(CROSS); } /*交换行棋方*/ intChangeOrder(void) { if(gPlayOrder==CHESS1) gPlayOrder=CHESS2; else gPlayOrder=CHESS1; return(gPlayOrder); } /*获取按键值*/ intGetKey(void) { charlowbyte; intpress; while(bioskey(1)==0) ;/*如果用户没有按键,空循环*/ press=bioskey(0); lowbyte=press&0xff; press=press&0xff00+toupper(lowbyte); return(press); } /*落子错误处理*/ voidDoError(void) { sound(1200); delay(50); nosound(); } /*赢棋处理*/ voidDoWin(intOrder) { sound(1500);delay(100); sound(0);delay(50); sound(800);delay(100); sound(0);delay(50); sound(1500);delay(100); sound(0);delay(50); sound(800);delay(100); sound(0);delay(50); nosound(); textcolor(RED+BLINK); gotoxy(25,20); if(Order==CHESS1) cputs("PLAYER1WIN!"); else cputs("PLAYER2WIN!"); gotoxy(25,21); cputs("\n"); getch(); } /*走棋*/ intChessGo(intOrder,structpointCursor) { /*判断交叉点上有无棋子*/ if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL) { /*若没有棋子,则可以落子*/ gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE); putch(Order); gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoard[Cursor.x][Cursor.y]=Order; returnTRUE; } else returnFALSE; } /*判断当前行棋方落子后是否赢棋*/ intJudgeWin(intOrder,structpointCursor) { inti; for(i=0;i<4;i++) /*判断在指定方向上是否有连续5个行棋方的棋子*/ if(JudgeWinLine(Order,Cursor,i)) returnTRUE; returnFALSE; } /*判断在指定方向上是否有连续5个行棋方的棋子*/ intJudgeWinLine(intOrder,structpointCursor,intdirection) { inti; structpointpos,dpos; constinttestnum=5; intcount; switch(direction) { case0:/*在水平方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y; dpos.x=1; dpos.y=0; break; case1:/*在垂直方向*/ pos.x=Cursor.x; pos.y=Cursor.y-(testnum-1); dpos.x=0; dpos.y=1; break; case2:/*在左下至右上的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y+(testnum-1); dpos.x=1; dpos.y=-1; break; case3:/*在左上至右下的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y-(testnum-1); dpos.x=1; dpos.y=1; break; } count=0; for(i=0;i=0&&pos.x<=18&&pos.y>=0&&pos.y<=18) { if(gChessBoard[pos.x][pos.y]==Order) { count++; if(count>=testnum) returnTRUE; } else count=0; } pos.x+=dpos.x; pos.y+=dpos.y; } returnFALSE; } /*移动光标*/ voidMoveCursor(intOrder,intpress) { switch(press) { casePLAY1UP: if(Order==CHESS1&&gCursor.y>0) gCursor.y--; break; casePLAY1DOWN: if(Order==CHESS1&&gCursor.y<18) gCursor.y++; break; casePLAY1LEFT: if(Order==CHESS1&&gCursor.x>0) gCursor.x--; break; casePLAY1RIGHT: if(Order==CHESS1&&gCursor.x<18) gCursor.x++; break; casePLAY2UP: if(Order==CHESS2&&gCursor.y>0) gCursor.y--; break; casePLAY2DOWN: if(Order==CHESS2&&gCursor.y<18) gCursor.y++; break; casePLAY2LEFT: if(Order==CHESS2&&gCursor.x>0) gCursor.x--; break; casePLAY2RIGHT: if(Order==CHESS2&&gCursor.x<18) gCursor.x++; break; } gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); } /*游戏结束处理*/ voidEndGame(void) { textmode(C80); } /*显示当前行棋方*/ voidShowOrderMsg(intOrder) { gotoxy(6,MAPYOFT+20); textcolor(LIGHTRED); if(Order==CHESS1) cputs("Player1go!"); else cputs("Player2go!"); gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); } /*落子正确处理*/ voidDoOK(void) { sound(500); delay(70); sound(600); delay(50); sound(1000); delay(100); nosound(); } /*检查用户的按键类别*/ intCheckKey(intpress) { if(press==ESCAPE) returnKEYEXIT;/*是退出键*/ else if ((press==PLAY1DO&&gPlayOrder==CHESS1)|| (press==PLAY2DO&&gPlayOrder==CHESS2) ) returnKEYFALLCHESS;/*是落子键*/ else if (press==PLAY1UP||press==PLAY1DOWN|| press==PLAY1LEFT||press==PLAY1RIGHT|| press==PLAY2UP||press==PLAY2DOWN|| press==PLAY2LEFT||press==PLAY2RIGHT ) returnKEYMOVECURSOR;/*是光标移动键*/ else returnKEYINVALID;/*按键无效*/ }
本文档为【C语言五子棋设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
正方体
暂无简介~
格式:doc
大小:112KB
软件:Word
页数:13
分类:
上传时间:2022-05-11
浏览量:1