33,311
社区成员
发帖
与我相关
我的任务
分享
#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;
}
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 );
}
遍历棋盘上所有可以落字的点,假设己方把棋子放到某点,递归计算自己和对方的最高利益,用己方的利益减去对方的利益,得到该点的利益。找出利益最高的点。落字。