c++黑白棋小游戏

 

 

 

#include<iostream>
#include<queue>
#include <windows.h>
#include <conio.h>
#include <mmsystem.h>    

#pragma comment(lib,"winmm.lib")
using namespace std;
int wb;
typedef struct
{
	int x,y;
}nn;
nn node;
queue<nn>local_dir[8][9][9];

void qingkong()
{
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
			for(int k=0;k<8;k++)
				while(!local_dir[k][i][j].empty())
					local_dir[k][i][j].pop();

}
void chushihua(int map[][10])
{
	int i,j,bianjie='x';
	for(i=0;i<10;i++)
	{
		map[0][i]=bianjie;
		map[9][i]=bianjie;
		map[i][0]=bianjie;
		map[i][9]=bianjie;
	}
	for(i=1;i<9;i++)
		for(j=1;j<9;j++)
			map[i][j]=' ';
}

void shuchu(int map[][10])
{
	int i,j;
	printf("  ===双人博弈黑白棋 BY 青春微凉===\n         ☆为棋子位置提示\n");
	printf("    A");
	for(i=1;i<8;i++)
		printf("   %c",i+'A');
	putchar(10);
	printf(" ┌─┬─┬─┬─┬─┬─┬─┬─┐\n");

	for(i=1;i<8;i++)
	{
		printf("%d│",i);
		for(j=1;j<=8;j++)
		{
		if(map[i][j]=='○')
			printf("○│");
		else if(map[i][j]=='●')
			printf("●│");
		else if(map[i][j]=='☆')
			printf("☆│");
		else
			printf("  │");
		}
		putchar(10);
		printf(" ├─┼─┼─┼─┼─┼─┼─┼─┤\n");

	}
	printf("8│");
	for(j=1;j<=8;j++)
	{
		if(map[i][j]=='○')
			printf("○│");
		else if(map[i][j]=='●')
			printf("●│");
		else if(map[i][j]=='☆')
			printf("☆│");
		else
			printf("  │");
	}

	printf(" \n └─┴─┴─┴─┴─┴─┴─┴─┘\n");

}

bool kongge(int map[][10])
{
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
			if(map[i][j]==' ')
				return true;
			return false;
}

bool next_wb(int map[][10],int y,int x,int wb)
{
	if(map[y][x]==wb)
		return true;
	return false;

}
bool next_white_black(int map[][10])
{
	int dirx[]={0,1,1,1,0,-1,-1,-1};
	int diry[]={-1,-1,0,1,1,1,0,-1};
	int i,j,k;
	bool flag=0;
//loop:
	for(i=1;i<=8;i++)
	{
		for(j=1;j<=8;j++)
		{
			if(!(map[i][j]=='●'||map[i][j]=='○'))
			{
			for(k=0;k<8;k++)
			{
	//	goto loop;
	        	int y=i,x=j;
				while(next_wb(map,y+=diry[k],x+=dirx[k],wb=='●'?'○':'●'))
				{
					node.x=x;  
					node.y=y;
					local_dir[k][i][j].push(node);					
				}
				if(map[y][x]==(wb=='●'?'●':'○')&&!local_dir[k][i][j].empty())
				{
					flag=1;
					map[i][j]='☆';
				}
				else
				{				
					while(!local_dir[k][i][j].empty())
                         local_dir[k][i][j].pop();
				}
			}
			}
		}
	}
return flag;
}
void jieshu(int map[][10])
{

	shuchu(map);

	int b=0,w=0;
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
		{
			if(map[i][j]=='●')
				b++;
			if(map[i][j]=='○')
				w++;
		}

	if(b>w)
		printf("     ●方赢○方%d枚棋子\n",b-w);
	if(b<w)
		printf("     ○方赢●方%d枚棋子\n",w-b);
   	if(b==w)
		printf("     和局\n");
	system("pause");
	system("cls");
}

void fanzhuan(int map[][10],int y,int x)
{
     HANDLE hOut;
     COORD pos= {0, 0};

     hOut = GetStdHandle(STD_OUTPUT_HANDLE);
   	pos.X=x*4-1;
     pos.Y=y*2+2;
     SetConsoleCursorPosition(hOut, pos);
	if(wb=='●')
          printf("●",pos.X,pos.Y); 
	else
         printf("○",pos.X,pos.Y);
	Sleep(500);
	int i;
	for(i=0;i<8;i++)
	{
	    while(!local_dir[i][y][x].empty())
		{
			node=local_dir[i][y][x].front ();
			map[node.y][node.x]=wb=='●'?'●':'○';	
			local_dir[i][y][x].pop();
  
			pos.X=node.x*4-1;
            pos.Y=node.y*2+2;
			SetConsoleCursorPosition(hOut, pos);
			if(wb=='●')
              printf("●",pos.X,pos.Y); 
			else
              printf("○",pos.X,pos.Y);
			Sleep(500);
		}
	}

}
void fuyuan(int map[][10])
{
	for(int i=1;i<9;i++)
		for(int j=1;j<9;j++)
			if(map[i][j]=='☆')
				map[i][j]=' ';
}


int main()
{
    
	int step=1;
	int map[10][10];
	int yy,xx;
//	char xx[2];
//	char local[20];
	char ch1,ch2;
	system("color 30");
	printf("==========使用说明=========\n\n1.每次出棋前会用☆提示位置,\n只需输入行列坐标即可,坐标用\n大写,中间不能有空格。\n\n\n2.若一方没棋子可下,则对方出\n棋,若都没棋子可出或棋盘已满,\n则游戏结束\n了解更多,欢迎关注官方博客 \n http://blog.csdn.net/qq909157370\n\n");
	system("pause");
	system("CLS");

	while(1)
	{	
		PlaySound("sou.wav",NULL,SND_FILENAME|SND_ASYNC);  
		step=1;
		chushihua(map);

	map[4][4]=map[5][5]='○';
	map[4][5]=map[5][4]='●';
	int flag=0;

	while(kongge(map)&&flag<2)//(cunzai_black_white(map,'●')&&cunzai_black_white(map,'○'))
	{
		flag++;
		qingkong();
		if(step%2==0)
			wb='○';
		else
			wb='●';
		if(next_white_black(map))
		{	
			flag=0;
        	shuchu(map);
			wb=='○'?printf("  请○方输入行列坐标(如5E) "):printf("  请●方输入行列坐标(如5E) ");

			while(putchar(ch1=getch()),putchar(ch2=getch()),ch1<'1'||ch1>'8'||ch2<'A'||ch2>'H'||(ch1>'0'&&ch1<'9'&&ch2>='A'&&ch2<='H'&&map[ch1-'0'][ch2-'A'+1]!='☆'))
			{	printf(" \n 输入错误!请重新输入:");
			}
			fuyuan(map);
			yy=ch1-'0';
			xx=ch2-'A'+1;
			map[yy][xx]=wb=='●'?'●':'○';
			fanzhuan(map,yy,xx);

			system("CLS");
		}
		step++;
	}
	jieshu(map);
	}
}


 

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值