C++双人五子棋游戏
SUN_NZ 人气:0设计思路
定义一个Chess类,用16*16的二维数组的来表示一方棋手在棋局上的落子状态。
通过控制键盘←↑→↓来选择落点,getch()函数可获得用户的键盘输入,用coord控制台屏幕上的坐标。
胜利条件:Chess类的成员函数win(),每落一个棋子进行win()的判断,当横向、竖向或斜向存在同一颜色的连续五个棋子时,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) {/*指定移动光标*/ 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) {/*下棋(移动+确认)*/ 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) {/*上下左右移动*/ 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对象A、B c.X=28;c.Y=14; gotoxy(c.X,c.Y); //光标居中 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<<"操作说明:"; gotoxy(60,11); cout<<"选择落点:←↑→↓"; 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<<"蓝方胜!!"; } 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 "; } }
运行结果
加载全部内容