Discuz! Board

 找回密码
 立即注册
查看: 765|回复: 0

黑白棋

[复制链接]

27

主题

29

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
14147
发表于 2023-11-19 10:59:24 | 显示全部楼层 |阅读模式
[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;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-2-13 05:35 , Processed in 0.052813 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表