中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用C語言寫五子棋游戲

發布時間:2021-08-11 14:59:21 來源:億速云 閱讀:163 作者:chen 欄目:編程語言

這篇文章主要介紹“怎么用C語言寫五子棋游戲”,在日常操作中,相信很多人在怎么用C語言寫五子棋游戲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用C語言寫五子棋游戲”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

#include <stdio.h>#include <bios.h>#include <ctype.h>#include <conio.h>#include <dos.h>#define CROSSRU 0xbf /*右上角點*/#define CROSSLU 0xda /*左上角點*/#define CROSSLD 0xc0 /*左下角點*/#define CROSSRD 0xd9 /*右下角點*/#define CROSSL 0xc3 /*左邊*/#define CROSSR 0xb4 /*右邊*/#define CROSSU 0xc2 /*上邊*/#define CROSSD 0xc1 /*下邊*/#define CROSS 0xc5 /*十字交叉點*/ /*定義棋盤左上角點在屏幕上的位置*/#define MAPXOFT 5#define MAPYOFT 2 /*定義1號玩家的操作鍵鍵碼*/#define PLAY1UP 0x1157/*上移--'W'*/#define PLAY1DOWN 0x1f53/*下移--'S'*/#define PLAY1LEFT 0x1e41/*左移--'A'*/#define PLAY1RIGHT 0x2044/*右移--'D'*/#define PLAY1DO 0x3920/*落子--空格鍵*/ /*定義2號玩家的操作鍵鍵碼*/#define PLAY2UP 0x4800/*上移--方向鍵up*/#define PLAY2DOWN 0x5000/*下移--方向鍵down*/#define PLAY2LEFT 0x4b00/*左移--方向鍵left*/#define PLAY2RIGHT 0x4d00/*右移--方向鍵right*/#define PLAY2DO 0x1c0d/*落子--回車鍵Enter*/ /*若想在游戲中途退出, 可按 Esc 鍵*/#define ESCAPE 0x011b /*定義棋盤上交叉點的狀態, 即該點有無棋子 *//*若有棋子, 還應能指出是哪個玩家的棋子 */#define CHESSNULL 0 /*沒有棋子*/#define CHESS1 'O'/*一號玩家的棋子*/#define CHESS2 'X'/*二號玩家的棋子*/ /*定義按鍵類別*/#define KEYEXIT 0/*退出鍵*/#define KEYFALLCHESS 1/*落子鍵*/#define KEYMOVECURSOR 2/*光標移動鍵*/#define KEYINVALID 3/*無效鍵*/ /*定義符號常量: 真, 假 --- 真為1, 假為0 */#define TRUE 1#define FALSE 0 /**********************************************************//* 定義數據結構 */ /*棋盤交叉點坐標的數據結構*/struct point{int x,y;}; /**********************************************************//*自定義函數原型說明 */void Init(void);int GetKey(void);int CheckKey(int press);int ChangeOrder(void);int ChessGo(int Order,struct point Cursor);void DoError(void);void DoOK(void);void DoWin(int Order);void MoveCursor(int Order,int press);void DrawCross(int x,int y);void DrawMap(void);int JudgeWin(int Order,struct point Cursor);int JudgeWinLine(int Order,struct point Cursor,int direction);void ShowOrderMsg(int Order);void EndGame(void);/**********************************************************/ /**********************************************************//* 定義全局變量 */int gPlayOrder; /*指示當前行棋方 */struct point gCursor; /*光標在棋盤上的位置 */char gChessBoard[19][19];/*用于記錄棋盤上各點的狀態*//**********************************************************/ /**********************************************************//*主函數*/void main(){int press;int bOutWhile=FALSE;/*退出循環標志*/printf("Welcome [url]www.schoolhacker.com[/url]");Init();/*初始化圖象,數據*/ while(1){press=GetKey();/*獲取用戶的按鍵值*/switch(CheckKey(press))/*判斷按鍵類別*/{/*是退出鍵*/case KEYEXIT:clrscr();/*清屏*/bOutWhile = TRUE;break; /*是落子鍵*/case KEYFALLCHESS:if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/DoError();/*落子錯誤*/else{DoOK();/*落子正確*/ /*如果當前行棋方贏棋*/if(JudgeWin(gPlayOrder,gCursor)==TRUE){DoWin(gPlayOrder);bOutWhile = TRUE;/*退出循環標志置為真*/}/*否則*/else/*交換行棋方*/ChangeOrder();ShowOrderMsg(gPlayOrder);}break; /*是光標移動鍵*/case KEYMOVECURSOR:MoveCursor(gPlayOrder,press);break; /*是無效鍵*/case KEYINVALID:break;} if(bOutWhile==TRUE)break;} /*游戲結束*/EndGame();}/**********************************************************/ /*界面初始化,數據初始化*/void Init(void){int i,j;char *Msg[]={"Player1 key:"," UP----w"," DOWN--s"," LEFT--a"," RIGHT-d"," DO----space","","Player2 key:"," UP----up"," DOWN--down"," LEFT--left"," RIGHT-right"," DO----ENTER","","exit game:"," 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);} /*畫棋盤*/void DrawMap(void){int i,j; clrscr(); for(i=0;i<19;i++)for(j=0;j<19;j++)DrawCross(i,j); } /*畫棋盤上的交叉點*/void DrawCross(int x,int y){gotoxy(x+MAPXOFT,y+MAPYOFT);/*交叉點上是一號玩家的棋子*/if(gChessBoard[x][y]==CHESS1){textcolor(LIGHTBLUE);putch(CHESS1);return;}/*交叉點上是二號玩家的棋子*/if(gChessBoard[x][y]==CHESS2){textcolor(LIGHTBLUE);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);} /*交換行棋方*/int ChangeOrder(void){if(gPlayOrder==CHESS1)gPlayOrder=CHESS2;elsegPlayOrder=CHESS1; return(gPlayOrder);} /*獲取按鍵值*/int GetKey(void){char lowbyte;int press; while (bioskey(1) == 0);/*如果用戶沒有按鍵,空循環*/ press=bioskey(0);lowbyte=press&0xff;press=press&0xff00 + toupper(lowbyte);return(press);} /*落子錯誤處理*/void DoError(void){sound(1200);delay(50);nosound();} /*贏棋處理*/void DoWin(int Order){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("PLAYER1 WIN!");elsecputs("PLAYER2 WIN!");gotoxy(25,21);cputs(" \\<^+^>/");getch();} /*走棋*/int ChessGo(int Order,struct point Cursor){/*判斷交叉點上有無棋子*/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;return TRUE;}elsereturn FALSE;} /*判斷當前行棋方落子后是否贏棋*/int JudgeWin(int Order,struct point Cursor){int i;for(i=0;i<4;i++)/*判斷在指定方向上是否有連續5個行棋方的棋子*/if(JudgeWinLine(Order,Cursor,i))return TRUE;return FALSE;} /*判斷在指定方向上是否有連續5個行棋方的棋子*/int JudgeWinLine(int Order,struct point Cursor,int direction){int i;struct point pos,dpos;const int testnum = 5;int count; switch(direction){case 0:/*在水平方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y;dpos.x=1;dpos.y=0;break;case 1:/*在垂直方向*/pos.x=Cursor.x;pos.y=Cursor.y-(testnum-1);dpos.x=0;dpos.y=1;break;case 2:/*在左下至右上的斜方向*/pos.x=Cursor.x-(testnum-1);pos.y=Cursor.y+(testnum-1);dpos.x=1;dpos.y=-1;break;case 3:/*在左上至右下的斜方向*/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<testnum*2+1;i++)/*????????i<testnum*2-1*/{if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18){if(gChessBoard[pos.x][pos.y]==Order){count++;if(count>=testnum)return TRUE;}elsecount=0;}pos.x+=dpos.x;pos.y+=dpos.y;} return FALSE;} /*移動光標*/void MoveCursor(int Order,int press){switch(press){case PLAY1UP:if(Order==CHESS1&&gCursor.y>0)gCursor.y--;break;case PLAY1DOWN:if(Order==CHESS1&&gCursor.y<18)gCursor.y++;break;case PLAY1LEFT:if(Order==CHESS1&&gCursor.x>0)gCursor.x--;break;case PLAY1RIGHT:if(Order==CHESS1&&gCursor.x<18)gCursor.x++;break; case PLAY2UP:if(Order==CHESS2&&gCursor.y>0)gCursor.y--;break;case PLAY2DOWN:if(Order==CHESS2&&gCursor.y<18)gCursor.y++;break;case PLAY2LEFT:if(Order==CHESS2&&gCursor.x>0)gCursor.x--;break;case PLAY2RIGHT:if(Order==CHESS2&&gCursor.x<18)gCursor.x++;break;} gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);} /*游戲結束處理*/void EndGame(void){textmode(C80);} /*顯示當前行棋方*/void ShowOrderMsg(int Order){gotoxy(6,MAPYOFT+20);textcolor(LIGHTRED);if(Order==CHESS1)cputs("Player1 go!");elsecputs("Player2 go!"); gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);} /*落子正確處理*/void DoOK(void){sound(500);delay(70);sound(600);delay(50);sound(1000);delay(100);nosound();} /*檢查用戶的按鍵類別*/int CheckKey(int press){if(press==ESCAPE)return KEYEXIT;/*是退出鍵*/ elseif( ( press==PLAY1DO && gPlayOrder==CHESS1) ||( press==PLAY2DO && gPlayOrder==CHESS2))return KEYFALLCHESS;/*是落子鍵*/ elseif( press==PLAY1UP || press==PLAY1DOWN ||press==PLAY1LEFT || press==PLAY1RIGHT ||press==PLAY2UP || press==PLAY2DOWN ||press==PLAY2LEFT || press==PLAY2RIGHT)return KEYMOVECURSOR;/*是光標移動鍵*/ elsereturn KEYINVALID;/*按鍵無效*/}

到此,關于“怎么用C語言寫五子棋游戲”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜丰县| 富民县| 龙游县| 镇远县| 日照市| 敦化市| 沈阳市| 岳池县| 沾化县| 台北市| 松阳县| 都兰县| 武城县| 黄梅县| 云林县| 晋州市| 兖州市| 锦屏县| 类乌齐县| 左云县| 绩溪县| 三台县| 洛扎县| 彰化县| 都兰县| 巴塘县| 平利县| 纳雍县| 长兴县| 山西省| 扎赉特旗| 拜泉县| 金平| 黄梅县| 三江| 道孚县| 公主岭市| 共和县| 阿巴嘎旗| 淄博市| 武定县|