本文实例为大家分享了C++实现图形界面双人五子棋游戏的具体代码,供大家参考,具体内容如下
设计思路定义一个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 ";
}
}
运行结果