溫馨提示×

溫馨提示×

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

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

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

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

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

#include <stdio.h>#include <bios.h>#include <ctype.h>#include <conio.h>#include <dos.h>#define CROSSRU 0xbf /*右上角點(diǎn)*/#define CROSSLU 0xda /*左上角點(diǎn)*/#define CROSSLD 0xc0 /*左下角點(diǎn)*/#define CROSSRD 0xd9 /*右下角點(diǎn)*/#define CROSSL 0xc3 /*左邊*/#define CROSSR 0xb4 /*右邊*/#define CROSSU 0xc2 /*上邊*/#define CROSSD 0xc1 /*下邊*/#define CROSS 0xc5 /*十字交叉點(diǎn)*/ /*定義棋盤左上角點(diǎn)在屏幕上的位置*/#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 /*定義棋盤上交叉點(diǎn)的狀態(tài), 即該點(diǎn)有無棋子 *//*若有棋子, 還應(yīng)能指出是哪個(gè)玩家的棋子 */#define CHESSNULL 0 /*沒有棋子*/#define CHESS1 'O'/*一號玩家的棋子*/#define CHESS2 'X'/*二號玩家的棋子*/ /*定義按鍵類別*/#define KEYEXIT 0/*退出鍵*/#define KEYFALLCHESS 1/*落子鍵*/#define KEYMOVECURSOR 2/*光標(biāo)移動鍵*/#define KEYINVALID 3/*無效鍵*/ /*定義符號常量: 真, 假 --- 真為1, 假為0 */#define TRUE 1#define FALSE 0 /**********************************************************//* 定義數(shù)據(jù)結(jié)構(gòu) */ /*棋盤交叉點(diǎn)坐標(biāo)的數(shù)據(jù)結(jié)構(gòu)*/struct point{int x,y;}; /**********************************************************//*自定義函數(shù)原型說明 */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; /*指示當(dāng)前行棋方 */struct point gCursor; /*光標(biāo)在棋盤上的位置 */char gChessBoard[19][19];/*用于記錄棋盤上各點(diǎn)的狀態(tài)*//**********************************************************/ /**********************************************************//*主函數(shù)*/void main(){int press;int bOutWhile=FALSE;/*退出循環(huán)標(biāo)志*/printf("Welcome [url]www.schoolhacker.com[/url]");Init();/*初始化圖象,數(shù)據(jù)*/ while(1){press=GetKey();/*獲取用戶的按鍵值*/switch(CheckKey(press))/*判斷按鍵類別*/{/*是退出鍵*/case KEYEXIT:clrscr();/*清屏*/bOutWhile = TRUE;break; /*是落子鍵*/case KEYFALLCHESS:if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/DoError();/*落子錯(cuò)誤*/else{DoOK();/*落子正確*/ /*如果當(dāng)前行棋方贏棋*/if(JudgeWin(gPlayOrder,gCursor)==TRUE){DoWin(gPlayOrder);bOutWhile = TRUE;/*退出循環(huán)標(biāo)志置為真*/}/*否則*/else/*交換行棋方*/ChangeOrder();ShowOrderMsg(gPlayOrder);}break; /*是光標(biāo)移動鍵*/case KEYMOVECURSOR:MoveCursor(gPlayOrder,press);break; /*是無效鍵*/case KEYINVALID:break;} if(bOutWhile==TRUE)break;} /*游戲結(jié)束*/EndGame();}/**********************************************************/ /*界面初始化,數(shù)據(jù)初始化*/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;/* 棋盤數(shù)據(jù)清零, 即棋盤上各點(diǎn)開始的時(shí)候都沒有棋子 */for(i=0;i<19;i++)for(j=0;j<19;j++)gChessBoard[i][j]=CHESSNULL;/*光標(biāo)初始位置*/gCursor.x=gCursor.y=0; /*畫棋盤*/textmode(C40);DrawMap(); /*顯示操作鍵說明*/i=0;textcolor(BROWN);while(Msg[i]!=NULL){gotoxy(25,3+i); cputs(Msg[i]);i++;} /*顯示當(dāng)前行棋方*/ShowOrderMsg(gPlayOrder);/*光標(biāo)移至棋盤的左上角點(diǎn)處*/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); } /*畫棋盤上的交叉點(diǎn)*/void DrawCross(int x,int y){gotoxy(x+MAPXOFT,y+MAPYOFT);/*交叉點(diǎn)上是一號玩家的棋子*/if(gChessBoard[x][y]==CHESS1){textcolor(LIGHTBLUE);putch(CHESS1);return;}/*交叉點(diǎn)上是二號玩家的棋子*/if(gChessBoard[x][y]==CHESS2){textcolor(LIGHTBLUE);putch(CHESS2);return;} textcolor(GREEN); /*左上角交叉點(diǎn)*/if(x==0&&y==0){putch(CROSSLU);return;} /*左下角交叉點(diǎn)*/if(x==0&&y==18){putch(CROSSLD);return;} /*右上角交叉點(diǎn)*/if(x==18&&y==0){putch(CROSSRU);return;} /*右下角交叉點(diǎn)*/if(x==18&&y==18){putch(CROSSRD);return;} /*左邊界交叉點(diǎn)*/if(x==0){putch(CROSSL);return;} /*右邊界交叉點(diǎn)*/if(x==18){putch(CROSSR);return;} /*上邊界交叉點(diǎn)*/if(y==0){putch(CROSSU);return;} /*下邊界交叉點(diǎn)*/if(y==18){putch(CROSSD);return;} /*棋盤中間的交叉點(diǎn)*/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);/*如果用戶沒有按鍵,空循環(huán)*/ press=bioskey(0);lowbyte=press&0xff;press=press&0xff00 + toupper(lowbyte);return(press);} /*落子錯(cuò)誤處理*/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){/*判斷交叉點(diǎn)上有無棋子*/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;} /*判斷當(dāng)前行棋方落子后是否贏棋*/int JudgeWin(int Order,struct point Cursor){int i;for(i=0;i<4;i++)/*判斷在指定方向上是否有連續(xù)5個(gè)行棋方的棋子*/if(JudgeWinLine(Order,Cursor,i))return TRUE;return FALSE;} /*判斷在指定方向上是否有連續(xù)5個(gè)行棋方的棋子*/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;} /*移動光標(biāo)*/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);} /*游戲結(jié)束處理*/void EndGame(void){textmode(C80);} /*顯示當(dāng)前行棋方*/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;/*是光標(biāo)移動鍵*/ elsereturn KEYINVALID;/*按鍵無效*/}

到此,關(guān)于“怎么用C語言寫五子棋游戲”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI