C++實(shí)現(xiàn)圖形界面雙人五子棋游戲
本文實(shí)例為大家分享了C++實(shí)現(xiàn)圖形界面雙人五子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
設(shè)計(jì)思路
定義一個(gè)Chess類,用16*16的二維數(shù)組的來(lái)表示一方棋手在棋局上的落子狀態(tài)。
通過(guò)控制鍵盤←↑→↓來(lái)選擇落點(diǎn),getch()函數(shù)可獲得用戶的鍵盤輸入,用coord控制臺(tái)屏幕上的坐標(biāo)。
勝利條件:Chess類的成員函數(shù)win(),每落一個(gè)棋子進(jìn)行win()的判斷,當(dāng)橫向、豎向或斜向存在同一顏色的連續(xù)五個(gè)棋子時(shí),win()返回值1。
代碼如下
#include <windows.h> ? #include <iostream> ? #include<conio.h> #include<cstring> using namespace std; ? COORD c; class Chess {/*一方棋局*/ private: ?? ?int p[15][15]; ? ?/*落子情況*/ public: ?? ?void newchess() ?? ?{/*空棋盤*/ ?? ? ? ?for(int i=0;i<16;i++) ?? ??? ??? ?for(int j=0;j<16;j++) ?? ??? ??? ??? ?p[i][j]=0; ?? ?} ?? ?int win() ?? ?{/*判斷勝利*/ ?? ? ? ?int i,j,f; ?? ??? ?for(i=0;i<16;i++) ?? ??? ?{/*橫向*/ ?? ??? ??? ?j=f=0; ?? ??? ??? ?while(f<5&&j<16) ?? ??? ??? ?{ ?? ??? ??? ??? ?if(p[i][j]) f++; ?? ??? ??? ??? ?else f=0; ?? ??? ??? ??? ?j++; ?? ??? ??? ?} ?? ??? ??? ?if(f==5) return 1; ?? ??? ?} ?? ??? ?for(j=0;j<16;j++) ?? ??? ?{/*豎向*/ ?? ??? ??? ?i=f=0; ?? ??? ??? ?while(f<5&&i<16) ?? ??? ??? ?{ ?? ??? ??? ??? ?if(p[i][j]) f++; ?? ??? ??? ??? ?else f=0; ?? ??? ??? ??? ?i++; ?? ??? ??? ?} ?? ??? ??? ?if(f==5) return 1; ?? ??? ?} ?? ??? ?for(i=0;i<12;i++) ?? ??? ?{/*下斜*/ ?? ??? ??? ?j=f=0; ?? ??? ??? ?while(f<5&&j<12) ?? ??? ??? ?{ ?? ??? ??? ??? ?if(p[i+f][j+f]) f++; ?? ??? ??? ??? ?else {f=0;j++;} ?? ??? ??? ?} ?? ??? ??? ?if(f==5) return 1; ?? ??? ?} ?? ??? ?for(i=4;i<16;i++) ?? ??? ?{/*上斜*/ ?? ??? ??? ?j=f=0; ?? ??? ??? ?while(f<5&&j<12) ?? ??? ??? ?{ ?? ??? ??? ??? ?if(p[i-f][j+f]) f++; ?? ??? ??? ??? ?else {f=0;j++;} ?? ??? ??? ?} ?? ??? ??? ?if(f==5) return 1; ?? ??? ?} ?? ??? ?return 0; ?? ?} ?? ?void go(int x,int y) ?? ?{/*落子*/ ?? ? ? ?p[y][x]=1; ?? ?} ?? ?friend int gochess(int); }A,B;/**/ void gotoxy(int x, int y)? {/*指定移動(dòng)光標(biāo)*/ ? ? COORD coord;? ? ? coord.X=x;? ? ? coord.Y=y;? ? ? SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coord);? } void chessboard() {/*畫棋盤格*/ ?? ?gotoxy(0,0); ?? ?cout<<"┏━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┯━━━┓\n"; ?? ?for(int i=0;i<13;i++) ?? ?{ ?? ??? ?cout<<"┃ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? ┃\n"; ?? ? ? ?cout<<"┠───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┨\n"; ?? ?} ?? ?cout<<"┃ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? │ ? ┃\n"; ?? ?cout<<"┗━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┷━━━┛\n"; } void put(int n) { ?? ?if(n==1) ?? ?{ ?? ? ? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); ?? ? ? ?cout<<"●\b"; ?? ?} ?? ?else? ?? ?{ ?? ??? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); ?? ??? ?cout<<"◆\b"; ?? ?} } int gochess(int n) {/*下棋(移動(dòng)+確認(rèn))*/ ?? ?int i,k,w; ?? ?while(k=_getch()) ?? ?{ ?? ??? ?switch(k) ?? ??? ?{ ?? ??? ?case 13:/*按回車鍵下子*/ ?? ??? ??? ?if(n==1)? ?? ??? ??? ?{ ?? ??? ??? ??? ?put(n); ?? ??? ??? ??? ?A.p[c.X/4][c.Y/2]=1; ?? ??? ??? ??? ?return 1; ?? ??? ??? ?} ?? ??? ??? ?else? ?? ??? ??? ?{ ?? ??? ??? ??? ?put(n); ?? ??? ??? ??? ?B.p[c.X/4][c.Y/2]=1; ?? ??? ??? ? ? ?return 1; ?? ??? ??? ?} ?? ? ? ?case 224: ?? ??? ? ? ?w=_getch(); ?? ??? ??? ?switch(w) ?? ??? ??? ?{/*上下左右移動(dòng)*/ ?? ??? ??? ?case 72:? ?? ??? ??? ??? ?for(i=1;c.Y-2*i>=0;i++) ?? ??? ??? ??? ??? ?if(!A.p[c.X/4][(c.Y-2*i)/2]&&!B.p[c.X/4][(c.Y-2*i)/2]) ?? ??? ??? ??? ??? ? ? ?{c.Y-=2*i;break;} ?? ??? ??? ??? ?break; ?? ??? ??? ?case 80: ?? ??? ??? ??? ?for(i=1;c.Y+2*i<=28;i++) ?? ??? ??? ??? ??? ?if(!A.p[c.X/4][(c.Y+2*i)/2]&&!B.p[c.X/4][(c.Y+2*i)/2]) ?? ??? ??? ??? ??? ? ? ?{c.Y+=2*i;break;} ?? ??? ??? ??? ?break; ?? ??? ??? ?case 75: ?? ??? ??? ??? ?for(i=1;c.X-4*i>=0;i++) ?? ??? ??? ??? ??? ?if(!A.p[(c.X-4*i)/4][c.Y/2]&&!B.p[(c.X-4*i)/4][c.Y/2]) ?? ??? ??? ??? ??? ? ? ?{c.X-=4*i;break;} ?? ??? ??? ??? ?break; ?? ??? ??? ?case 77: ?? ??? ??? ??? ?for(i=1;c.X+4*i<=56;i++) ?? ??? ??? ??? ??? ?if(!A.p[(c.X+4*i)/4][c.Y/2]&&!B.p[(c.X+4*i)/4][c.Y/2]) ?? ??? ??? ??? ??? ? ? ?{c.X+=4*i;break;} ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ??? ?gotoxy(c.X,c.Y); ?? ??? ?} ?? ?} } int game() {/*游戲開始*/ ?? ?chessboard(); ? ? ? ? ? ? ? ? //畫棋盤 ?? ?A.newchess();B.newchess(); ? ?//定義Chess對(duì)象A、B ?? ?c.X=28;c.Y=14; ?? ?gotoxy(c.X,c.Y); ? ? ? ? ? ? ?//光標(biāo)居中 ?? ?while(1) ?? ?{ ?? ? ? ?gochess(1); ?? ??? ?if(A.win())? ?? ??? ? ? ?return 1; ?? ??? ?gochess(2); ?? ??? ?if(B.win())? ? ? ? ? ? ? return 2; ?? ?} } int main() ? { ? ?? ?gotoxy(70,5); ?? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN); ?? ?cout<<"五子棋游戲"; ?? ?gotoxy(60,9); ?? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED); ?? ?cout<<"操作說(shuō)明:"; ?? ?gotoxy(60,11); ?? ?cout<<"選擇落點(diǎn):←↑→↓"; ?? ?gotoxy(60,12); ?? ?cout<<"落子:回車鍵(←┘)"; ?? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED); ?? ?int f; ?? ?while(f=game()) ?? ?{ ?? ??? ?gotoxy(60,16); ?? ??? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED); ?? ? ? ?if(f==1) ?? ??? ?{ ?? ??? ??? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); ?? ??? ??? ?cout<<"紅方勝!!"; ?? ??? ?} ?? ??? ?else? ?? ??? ?{ ?? ??? ??? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE); ?? ??? ??? ?cout<<"藍(lán)方勝?。?; ?? ??? ?} ?? ??? ?gotoxy(60,18); ?? ??? ?SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED); ?? ??? ?cout<<"按任意鍵開始新游戲"; ?? ??? ?f=_getch(); ?? ??? ?cout<<"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b ? ? ? ? ? ? ? ? ? ? "; ?? ??? ?gotoxy(60,16); ?? ??? ?cout<<"\b\b\b\b\b\b\b\b\b ? ? ? ? ? ? ? ? ? ? "; ?? ?} } ?
運(yùn)行結(jié)果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言中6組指針和自增運(yùn)算符結(jié)合方式的運(yùn)算順序問(wèn)題
本文通過(guò)代碼實(shí)現(xiàn)分析了6種組合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以參考下2015-07-07C++中基類和派生類之間的轉(zhuǎn)換實(shí)例教程
這篇文章主要介紹了C++中基類和派生類之間的轉(zhuǎn)換,有助于深入理解C++面向?qū)ο蟪绦蛟O(shè)計(jì),需要的朋友可以參考下2014-08-08C++有限狀態(tài)機(jī)實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了C++有限狀態(tài)機(jī)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10