[C++] 纯文本查看 复制代码
#include <graphics.h>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
#define Size 8
int board[Size][Size]; //棋盘
int player=1; //当前玩家 1黑棋 0白旗 2空白
int h_cnt,b_cnt,t; //黑白棋数量
PIMAGE pimgs[3]; //棋盘图片
mouse_msg msg; //鼠标
void loadImage()//图片载入
{
char path[100]; //加载图片路径
for(int i=0;i<3;i++)
{
pimgs[i]=newimage(); //向计算机申请一个图片空间
sprintf(path,"image/%d.jpg",i);//拼接图片相对路径
getimage(pimgs[i],path);//将系统中的图片数据存入pimgs
}
}
void draw()//图形绘制
{
for(int i=0;i<Size;i++)
for(int j=0;j<Size;j++)
putimage(j*50,i*50,pimgs[board[i][j]]);
xyprintf(410,5,"黑棋");
xyprintf(455,30,"%d",h_cnt);
xyprintf(410,55,"白棋");
xyprintf(455,80,"%d",b_cnt);
if(player==1)
{
xyprintf(415,125,"黑方");
xyprintf(415,150,"执子");
}
else
{
xyprintf(415,125,"白方");
xyprintf(415,150,"执子");
}
}
bool IsFull()
{
for (int i = 0; i < Size; i++)
for (int j = 0; j < Size; j++)
{
if (board[i][j] == 0)
{
return false;
}
}
//棋盘没有空位置了还没有判断出输赢,则平局
return true;
}
void check_xy(int x,int y)//x行 y列位置 player号玩家是否能够落子
{
int i,j;
int flag=0;//换手标记
//向上翻转棋子
if((board[x-1][y]==!player)&&(x>=2))
{
for(i=2;i<Size;i++)
{
if((board[x-i][y]==2)||(x-i<0)) break;
else if(board[x-i][y]==!player) continue;
else
{
for(j=0;j<=i;j++) board[x-j][y]=player;
flag=1;
}
}
}
//向下翻转
if((board[x+1][y]==!player)&&(x<=5))
{
for(i=2;i<Size;i++)
{
if((board[x+i][y]==2)||(x+i>7)) break;
else if(board[x+i][y]==!player) continue;
else
{
for(j=0;j<=i;j++) board[x+j][y]=player;
flag=1;
}
}
}
//向左翻转
if((board[x][y-1]==!player)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x][y-i]==2)||(y-i<0)) break;
else if(board[x][y-i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x][y-j]=player;
flag=1;
}
}
}
//向右翻转
if((board[x][y+1]==!player)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x][y+i]==2)||(y+i>7)) break;
else if(board[x][y+i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x][y+j]=player;
flag=1;
}
}
}
//向左上翻转
if((board[x-1][y-1]==!player)&&(x>=2)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x-i][y-i]==2)||(x-i<0)||(y-i<0)) break;
else if(board[x-i][y-i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x-j][y-j]=player;
flag=1;
}
}
}
//向右上翻转
if((board[x-1][y+1]==!player)&&(x>=2)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x-i][y+i]==2)||(x-i<0)||(y+i>7)) break;
else if(board[x-i][y+i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x-j][y+j]=player;
flag=1;
}
}
}
//向左下翻转
if((board[x+1][y-1]==!player)&&(x<=5)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x+i][y-i]==2)||(x+i>7)||(y-i<0)) break;
else if(board[x+i][y-i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x+j][y-j]=player;
flag=1;
}
}
}
//向右下翻转
if((board[x+1][y+1]==!player)&&(x<=5)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x+i][y+i]==2)||(x+i>7)||(y+i>7)) break;
else if(board[x+i][y+i]==!player) continue;
else
{
for( j=0;j<=i;j++) board[x+j][y+j]=player;
flag=1;
}
}
}
if(flag==1)
{
player=!player;
}
}
bool check_xy1(int x,int y,int player)//x行 y列位置 player号玩家是否能够落子
{
int i,j;
//向上翻转棋子
if((board[x-1][y]==!player)&&(x>=2))
{
for(i=2;i<Size;i--)
{
if((board[x-i][y]==2)||(x-i<0)) break;
else if(board[x-i][y]==!player) continue;
else return true;
}
}
//向下翻转
if((board[x+1][y]==!player)&&(x<=5))
{
for(i=2;i<Size;i++)
{
if((board[x+i][y]==2)||(x+i>7)) break;
else if(board[x+i][y]==!player) continue;
else return true;
}
}
//向左翻转
if((board[x][y-1]==!player)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x][y-i]==2)||(y-i<0)) break;
else if(board[x][y-i]==!player) continue;
else return true;
}
}
//向右翻转
if((board[x][y+1]==!player)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x][y+i]==2)||(y+i>7)) break;
else if(board[x][y+i]==!player) continue;
else return true;
}
}
//向左上翻转
if((board[x-1][y-1]==!player)&&(x>=2)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x-i][y-i]==2)||(x-i<0)||(y-i<0)) break;
else if(board[x-i][y-i]==!player) continue;
else return true;
}
}
//向右上翻转
if((board[x-1][y+1]==!player)&&(x>=2)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x-i][y+i]==2)||(x-i<0)||(y+i>7)) break;
else if(board[x-i][y+i]==!player) continue;
else return true;
}
}
//向左下翻转
if((board[x+1][y-1]==!player)&&(x<=5)&&(y>=2))
{
for( i=2;i<Size;i++)
{
if((board[x+i][y-i]==2)||(x+i>7)||(y-i<0)) break;
else if(board[x+i][y-i]==!player) continue;
else return true;
}
}
//向右下翻转
if((board[x+1][y+1]==!player)&&(x<=5)&&(y<=5))
{
for( i=2;i<Size;i++)
{
if((board[x+i][y+i]==2)||(x+i>7)||(y+i>7)) break;
else if(board[x+i][y+i]==!player) continue;
else return true;
}
}
}
bool check_player(int player)//判断player玩家有无可走位置
{
for(int i=0;i<=7;i++)
for(int j=0;j<=7;j++)
{
if(board[i][j]==2)
{
if(check_xy1(i,j,player))
{
return true;
}
}
}
return false;
}
int check_board()
{
h_cnt=0;
b_cnt=0;
for(int i=0;i<=7;i++)
for(int j=0;j<=7;j++)
{
if(board[i][j]==1)
{
h_cnt++;
}
else if(board[i][j]==0)
{
b_cnt++;
}
}
if(!check_player(1)&&!check_player(0))
{
if(h_cnt>b_cnt)
{
return 1;
}
else if(b_cnt>h_cnt)
{
return 0;
}
else
{
return 2;
}
}
else
{
return 3;
}
}
void start()//初始化
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
// setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
for(int i=0;i<Size;i++)
for(int j=0;j<Size;j++)
board[i][j]=2;
board[3][3]=board[4][4]=1;
board[3][4]=board[4][3]=0;
h_cnt=2;
b_cnt=2;
t=4;
initgraph(Size*50+100,Size*50);//图形初始化
setcaption("黑白棋"); //设置程序标题
setbkcolor(WHITE);
loadImage();//图片载入
setcolor(BLACK);
setfont(20,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为50,幼圆字体
setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}
int main()
{
start();
while(1)
{
while(mousemsg())
{
msg=getmouse();
int y=msg.x/50,x=msg.y/50;
if(msg.is_down()&&y<8&&x<8)//限制落子位置
{
if(board[x][y]==2) check_xy(x,y);//xy可否落子
if(!check_player(player)) player=!player;//当前player是否有地方可走
t=check_board();
}
}
cleardevice();
draw(); //更新棋盘
if(t==0) {xyprintf(150,150,"白方获胜"); break;}
else if(t==1) {xyprintf(150,150,"黑方获胜"); break;}
else if(t==2) {xyprintf(150,150,"平局"); break;}
else ;
delay_fps(60);
}
getch();
return 0;
}