新人提问,怎么用C++做一个五子棋?

11105 2016-10-10 01:32:35
先谢谢解答的各位了!
...全文
1714 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
YXTS122 2016-11-14
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
#include<conio.h>
#include<cstdlib>
static int Record[15][15]={0};
static int Score[15][15]={0};
static int sum=0;
static int renum=0;
static const char ch[11][4]={"┌","┬","┐","├","┼","┤","└","┴","┘","○","●"};
class FiveChess
{
public:
    void PrintBord(int *x,int *y,int value[][15],int player);
    void Empty(int value[][15],int Default[][15]);
    void StartGame(int value[][15],int Default[][15]);
    void Single(int value[][15]);
    int Win(int *x,int *y,int ChessNum,int value[][15]);
    void Double(int value[][15]);
    int Position(int *x,int *y,int value[][15]);
    void Robot(int *x,int *y,int *sum,int value[][15]);
    void ChessOne(int &x,int &y,int value[][15]);
    void ChessScore();
    void Findscore(int &x,int &y);
};
void FiveChess::Empty(int value[][15],int Default[][15])
{
	for (int i=0;i<15;i++)
	    for (int j=0;j<15;j++)
	        value[i][j]=Default[i][j];
}
void FiveChess::StartGame(int value[][15],int Default[][15])
{
	Empty(value,Default);
	int choice;
	while (1)
	{
		cin>>choice;
		switch (choice)
		{
		case 1:Single(value); break;
		case 2:Double(value); break;
		}
	}
}
void FiveChess::ChessOne(int &x,int &y,int value[][15])
{
	int i,j;
	srand((unsigned )time(NULL));
	for (i=0;i<15;i++)
	{
		for (j=0;j<15;j++)
		{
			if (value[i][j]==9)
			{
				int g=rand()%7;
				if (g==0)
				{
					x=i+1;
					y=j+1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==1)
				{
					x=i+1;
					y=j-1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==2)
				{
					x=i-1;
					y=j-1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==3)
				{
					x=i-1;
					y=j+1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==4)
				{
					x=i-1;
					y=j;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==5)
				{
					x=i;
					y=j-1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else if (g==6)
				{
					x=i;
					y=j+1;
					if (Position(&x,&y,value)==0)
					   break;
				}
				else
				{
					x=i+1;
					y=j;
					if (Position(&x,&y,value)==0)
					   break;
				}
			}
		}
	}
}

void FiveChess::Findscore(int &x,int &y)
{
	srand((unsigned )time(NULL));
	int i,j,x1,x2,y1,y2,t;
	int Max=0;
	ChessScore();
	for (i=0;i<15;i++)
	{
		for (j=0;j<15;j++)
		{
			if (Score[i][j]>Max)
			{
				Max=Score[i][j];
				x1=i;
				y1=j;
			}
		}
	}
	x2=x1;
	y2=y1;
	for (i=0;i<15;i++)
	{
		for (j=0;j<15;j++)
		{
			if (Score[i][j]==Max&&i!=x2&&j!=y2)
			{
				t=rand()%10;
				if (t<5)
				{
					x2=i;
					y2=j;
					break;
				}
			}
		}
	}
	if (x2!=x1||y2!=y1)
	{
		t=rand()%10;
		if (t>6)
		{
			x=x1;
			y=y1;
		}
		else
		{
			x=x2;
			y=y2;
		}
	}
	else
	{
		x=x1;
		y=y1;
	}
	Max=0;
	Record[x][y]=2;
}
			

void FiveChess::ChessScore()
{
	int x,y,i,j,k;
	int number1=0,number2=0;
	int empty=0;
	memset(Score,0,sizeof (Score));
	for (x=0;x<15;x++)
	{
		for (y=0;y<15;y++)
		{
			if (Record[x][y]==0)
			{
				for (i=-1;i<=1;i++)
				{
					for (j=-1;j<=1;j++)
					{
						if (i!=0||j!=0)
						{
							for (k=1;k<=4;k++)
							{
								if (x+k*i>=0&&x+k*i<=14&&y+k*j>=0&&y+k*j<=14&&Record[x+k*i][y+k*j]==1)
								    number1++;
								else if (Record[x+k*i][y+k*j]==0)
								{
									empty++;
									break;
								}
								else
								    break;
							}
						for (k=-1;k>=-4;k--)
							{
								if (x+k*i>=0&&x+k*i<=14&&y+k*j>=0&&y+k*j<=14&&Record[x+k*i][y+k*j]==1)
								    number1++;
								else if (Record[x+k*i][y+k*j]==0)
								{
									empty++;
									break;
								}
								else
								    break;
							}
					  if (number1==1)
					        Score[x][y]+=1;
					  else if (number1==2)
					  {
					  	if (empty==1)
					  	   Score[x][y]+=5;
					  	else if (empty==2)
					  	   Score[x][y]+=10;
					  }
					  else if (number1==3)
					  {
					  	if (empty==1)
					  	   Score[x][y]+=20;
					  	else if (empty==2)
					         Score[x][y]+=100;
					  }
					  else if (number1>=4)
					      Score[x][y]+=1000;
					 empty=0;
					 
					 	for (k=1;k<=4;k++)
							{
								if (x+k*i>=0&&x+k*i<=14&&y+k*j>=0&&y+k*j<=14&&Record[x+k*i][y+k*j]==2)
								    number2++;
								else if (Record[x+k*i][y+k*j]==0)
								{
									empty++;
									break;
								}
								else
								    break;
							}
						for (k=-1;k>=-4;k--)
							{
								if (x+k*i>=0&&x+k*i<=14&&y+k*j>=0&&y+k*j<=14&&Record[x+k*i][y+k*j]==2)
								    number2++;
								else if (Record[x+k*i][y+k*j]==0)
								{
									empty++;
									break;
								}
								else
								    break;
							}
					  if (number2==0)
					        Score[x][y]+=1;
					else if (number2==1)
					       Score[x][y]+=2;
					  else if (number2==2)
					  {
					  	if (empty==1)
					  	   Score[x][y]+=8;
					  	else if (empty==2)
					  	   Score[x][y]+=30;
					  }
					  else if (number2==3)
					  {
					  	if (empty==1)
					  	   Score[x][y]+=50;
					  	else if (empty==2)
					         Score[x][y]+=200;
					  }
					  else if (number2>=4)
					      Score[x][y]+=10000;
					number1=0;
					number2=0;
					  empty=0;
						}
					}
				}
			}
		}
	}
}
					 
							
				
void FiveChess::Double(int value[][15])
{
}
void FiveChess::Single(int value[][15])
{
	int x,y;
	clrscr();
	PrintBord(&x,&y,value,-1);
	sum=0;
	renum=0;
	memset(Record,0,sizeof (Record));
	int x1=-1,y1=-1,x2=-1,y2=-1,t=1;
    int check;
    while (t)
    {
    	t=1;
    	cout<<"请输入坐标[双(-1)为悔棋]";
    	cin>>x>>y;
    	check=Position(&x,&y,value);
    	if ((x==-1)&&(y==-1))
    	{
    		PrintBord(&x,&y,value,-1);
    		t=1;
    	}
    	else if (check==0)
    	{
    		value[x][y]=9;
    		Record[x][y]=1;
    		x1=x;
    		y1=y;
    		sum++;
    		if (Win(&x,&y,1,Record)==0)
    		{
    			Robot(&x,&y,&sum,value);
    			PrintBord(&x,&y,value,2);
    			x2=x;
    			y2=y;
    			cout<<"玩家棋子数:"<<sum<<"电脑的棋子落在了[X:"<<x<<"][Y:"<<y<<"]\n";
    			cout<<"玩家坐标:"<<x1<<" "<<y1<<"电脑坐标:"<<x2<<" "<<y2<<endl;
    			if (Win(&x,&y,2,Record)==1)
    			{
    				cout<<"你输了\n按任意键继续";
    				t=0;
    			}
    			else if (Win(&x,&y,2,Record)==-1)
    			{
    				cout<<"没分出胜负\n按任意键继续";
    				t=0;
    			}
    			else
    			    t=1;
    		}
    		else if (Win(&x,&y,1,Record)==1)
    		{
    			PrintBord(&x,&y,value,-1);
    			cout<<"你胜利了\n按任意键继续";
    			t=0;
    		}
    		else if (Win(&x,&y,1,Record)==-1)
    		{
    			PrintBord(&x,&y,value,-1);
    			cout<<"没分出胜负\n按任意键继续";
    			t=0;
    		}
    	}
    	else if (check==1)
    	      cout<<"输入范围错误\n";
    	else
    	     cout<<"输入的坐标已存在\n";
    }
}
void FiveChess::Robot(int *x,int *y,int *sum,int value[][15])
{
	int t=1;
	if (*sum==1)
	{
		while (t)
		{
			ChessOne(*x,*y,value);
			if (Position(x,y,value)==0)
			     t=0;
		}
		Record[*x][*y]=2;
	}
	else
	       Findscore(*x,*y);
}
void FiveChess::PrintBord(int *x,int *y,int value[][15],int player)
{
	int i,j;
	if (player==1)
	   value[*x][*y]=9;
	else if (player==2)
	   value[*x][*y]=10;
	cout<<"   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4\n";
	for (i=0;i<15;i++)
	{
		if (i!=0)
		   cout<<"  "<<i%10;
		else
		   cout<<"  0";
		for (j=0;j<15;j++)
		    cout<<ch[value[i][j]]<<" ";
		cout<<endl;
	}
}
int FiveChess::Position(int *x,int *y,int value[][15])
{
	if (cin.fail()||*x<0||*x>=15||*y<0||*y>=15)
	{
		cin.clear();
		cin.sync();
		return 1;
	}
	else if (value[*x][*y]==9||value[*x][*y]==10)
	
	     return 2;
	else
	     return 0;
}
int FiveChess::Win(int *x,int *y,int ChessNum,int value[][15])
{
	int i,j,k;
	int number=0;
	int Sumchess=0;
	for (i=-1;i<=1;i++)
	{
		for (j=-1;j<=1;j++)
		{
			if (i!=0||j!=0)
			{
				for (k=1;k<5;k++)
				{
					if (*x+k*i>=0&&*x+k*i<=14&&*y+k*j>=0&&*y+k*j<=14&&value[*x+k*i][*y+k*j]==ChessNum)
					      number++;
					else
					       break;
				}
				
				for (k=-1;k>-5;k--)
				{
					if (*x+k*i>=0&&*x+k*i<=14&&*y+k*j>=0&&*y+k*j<=14&&value[*x+k*i][*y+k*j]==ChessNum)
					      number++;
					else
					       break;
				}
				if (number>=4)
				      return 1;
				else
				       number=0;
			}
		}
	}
	for (i=0;i<15;i++)
	   for (j=0;j<15;j++)
	       if (value[i][j]==9||value[i][j]==10)
	             Sumchess++;
	if (Sumchess>=225)
	     return -1;//没分出胜负
	else
	     return 0;
}
int main()
{
	int Default[15][15]={
   0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
   6,7,7,7,7,7,7,7,7,7,7,7,7,7,8};
   int value[15][15]={0};
   FiveChess Start;
   do
   {
   	Start.StartGame(value,Default);
   }
   while (1);
   return 0;
}
     
赵4老师 2016-11-14
  • 打赏
  • 举报
回复
《Visual C++ 游戏开发经典案例详解》
luo3stone 2016-10-22
  • 打赏
  • 举报
回复
为啥我看不到评论,我就想看看回答怎么啦
luo3stone 2016-10-22
  • 打赏
  • 举报
回复
这个比较叼啊66666
示申○言舌 2016-10-14
  • 打赏
  • 举报
回复
价值算法: 写一个价值函数:

int GetPositionValue( 棋子方(黑/白),落子点 )
{
      /* 假设将己方棋子落在此处
          判断落字后得到的价值:如果能赢,就返回一个很大的数如9999,如果能形成双冲四,就返回一个比较大的数,如999,
         冲四活三,返回888,.....双活三  555, 仅冲四  10.....
      */
}
int GetMaxValueAndBestPosition( 棋子方(黑/白),层级 )
{
     if( 层级 == 0 )
            return 0;
      else {
           int maxValue = 0;
           position pos;
            foreach( 枚举所有可以的落子点) {
                   int value = CalcPositionValue( 己方, 落子点 );
                   value = value - GetMaxValueAndBestPosition( !棋子方(翻转为对方),  层级 - 1 );     // 递归调用
                   if( maxValue < value ) {
                        pos = 当前落子点;
                        maxValue = value;
                   }
            }
         return maxValue AND pos;
      }
}
int GetFinllayPos( )
{
      pos = GetMaxValueAndBestPosition( 己方, 5 );
}
遍历棋盘上所有可以落字的点,假设己方把棋子放到某点,递归计算自己和对方的最高利益,用己方的利益减去对方的利益,得到该点的利益。找出利益最高的点。落字。
YXTS122 2016-10-14
  • 打赏
  • 举报
回复
这五子棋的代码有空来学习一下。。。。。。
starytx 2016-10-11
  • 打赏
  • 举报
回复
首先你要考虑界面,其次就是游戏算法
Wuli?? 2016-10-10
  • 打赏
  • 举报
回复
感觉好难呢~~
小灸舞 2016-10-10
  • 打赏
  • 举报
回复
ooolinux 2016-10-10
  • 打赏
  • 举报
回复
参考: PC游戏编程_人机博弈 算法的乐趣 王晓华著
paschen 2016-10-10
  • 打赏
  • 举报
回复
http://wenku.baidu.com/link?url=yHLlvkbTIwPpnGx5Gdjc9N7EAHpCYsXaAfZwvLt4xFKlnZQVu6iCNJttVXYWeW0gbs6REqOz22Uq4fNQZDFjs_0Sm7TZ0IY4h1BBL9eBNfm

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧