admin管理员组文章数量:1621891
第一次写这么长,参考了别人的代码,也还不完善
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<memory>
#include<string.h>
#define maxn 10
using namespace std;
int Bwin(char a[][maxn]); //该函数判断o子是否胜利
int Wwin(char a[][maxn]); //该函数判断x子是否胜利
int Draw(char a[][maxn]); //该函数判断是否平局
/*void qipan(char a[maxn][maxn])
{
for(int i=0;i<maxn;i++)
{
for(int j=0;j<maxn;j++)
printf("%c",a[i][j]);
printf("\n");
}
}
*/
char data[12][12];
bool istaked[12][12];
void initthearray()
{
memset(data,' ',sizeof(data));
memset(istaked,false,sizeof(istaked));
}
void output() // 打印棋盘
{
int row,column,count1;
printf(" 1 2 3 4 5 6 7 8 9 10\n");
for(row=0;row<21;row++)
{
if(row%2==0)
{
printf(" ");
for(count1=0;count1<10;count1++)
printf("--- ");
printf("\n");
}
else{
if(row==19)
printf("10 |");
else
printf("%d |",(row+1)/2);
for (column=1;column<11;column++)
printf("%c |",data[(row+1)/2][column]);
printf("\n");
}
}
}
void people()
{
int x,y,i,j; char a[maxn][maxn];
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
a[i][j]=' ';
//qipan(a);
output();
while(1)
{
int a1=1;
while(1)
{
for(;a1;)
{
printf("请输入所下o的位置:");
scanf("%d%d",&x,&y);
if(data[x][y]=='o'||data[x][y]=='x')
{
printf("已有棋子请重新输入\n");
continue;
}
else if(x>=maxn||y>=maxn)
{
printf("下在了错误的位置请重新输入\n");
continue;
}
else
{
data[x][y]='o';
a1=0;
}
}
break;
}
//qipan(a);
output();
if(Bwin(a))
{
printf("o子胜利\n");
break;
}
int a2=1;
while(1)
{
for(;a2;)
{
printf("请输入所下x的位置:");
scanf("%d%d",&x,&y);
if(data[x][y]=='o'||data[x][y]=='x')
{
printf("已有棋子请重新输入\n");
continue;
}
else if(x>=maxn||y>=maxn)
{
printf("下在了错误的位置请重新输入\n");
continue;
}
else
{
data[x][y]='x';
a2=0;
}
}
break;
}
//qipan(a);
output();
if(Wwin(a))
{
printf("x子胜利\n");
break;
}
if(Draw(a))
{
printf("平局\n");
break;
}
}
// return 0;
}
int Bwin(char a[][maxn])
{
int i,j;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
if(a[i][j]=='o'&&a[i][j+1]=='o'&&a[i][j+2]=='o'&&a[i][j+3]=='o'&&a[i][j+4]=='o')
return 1;
for(j=0;j<maxn;j++)
for(i=0;i<maxn;i++)
if(a[i][j]=='o'&&a[i+1][j]=='o'&&a[i+2][j]=='o'&&a[i+3][j]=='o'&&a[i+4][j]=='o')
return 1;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
if(a[i][j]=='o'&&a[i+1][j+1]=='o'&&a[i+2][j+2]=='o'&&a[i+3][j+3]=='o'&&a[i+4][j+4]=='o')
return 1;
for(i=0;i<maxn;i++)
for(j=maxn-1;j>3;j--)
if(a[i][j]=='o'&&a[i-1][j+1]=='o'&&a[i-2][j+2]=='o'&&a[i-3][j+3]=='o'&&a[i-4][j+4]=='o')
return 1;
return 0;
}
int Wwin(char a[][maxn])
{
int i,j;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
if(a[i][j]=='x'&&a[i][j+1]=='x'&&a[i][j+2]=='x'&&a[i][j+3]=='x'&&a[i][j+4]=='x')
return 1;
for(j=0;j<maxn;j++)
for(i=0;i<maxn;i++)
if(a[i][j]=='x'&&a[i+1][j]=='x'&&a[i+2][j]=='x'&&a[i+3][j]=='x'&&a[i+4][j]=='x')
return 1;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
if(a[i][j]=='x'&&a[i+1][j+1]=='x'&&a[i+2][j+2]=='x'&&a[i+3][j+3]=='x'&&a[i+4][j+4]=='x')
return 1;
for(i=0;i<maxn;i++)
for(j=maxn-1;j>3;j--)
if(a[i][j]=='x'&&a[i-1][j+1]=='x'&&a[i-2][j+2]=='x'&&a[i-3][j+3]=='x'&&a[i-4][j+4]=='x')
return 1;
return 0;
}
int Draw(char a[][maxn])
{
int i,j;
for(i=0;i<maxn;i++)
for(j=0;j<maxn;j++)
{
if(a[i][j]==' ')
return 0;
}
return 1;
}
int isover() // 判断是否结束
{
int row,column,key,flag=0;
char station;
for(row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
if(istaked[row][column]==false)
flag=1;
}
}
if (flag==0)
{
return(-1);
}
for(row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
station=data[row][column];
if(station==' ')
continue;
if(station=='*')
key=1;
if(station=='o')
key=2;
if(data[row][column+1]==station&&data[row][column+2]==station&&data[row][column+3]==station&&data[row][column+4]==station)
return(key);
if(data[row+1][column]==station&&data[row+2][column]==station&&data[row+3][column]==station&&data[row+4][column]==station)
return(key);
if(data[row+1][column+1]==station&&data[row+2][column+2]==station&&data[row+3][column+3]==station&&data[row+4][column+4]==station)
return(key);
if(data[row+1][column-1]==station&&data[row+2][column-2]==station&&data[row+3][column-3]==station&&data[row+4][column-4]==station)
return(key);
}
}
return(0);
}
void getposition() // 判断此处是否可落子
{
int row,column;
scanf("%d%d",&row,&column);
while(istaked[row][column]==true)
{
printf("这个位置已经放置了棋子,请重新放置!");
scanf("%d%d",&row,&column);
}
while (row<1||row>10||column<1||column>10)
{
printf("对不起!不能在棋盘外放置棋子!");
scanf("%d%d",&row,&column);
}
data[row][column]='*';
istaked[row][column]=true;
}
void AIsolve() // 一个简单的算法
{
int row,column;
char pict;
for (row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
pict=data[row][column];
if(pict==' '||pict=='*')
continue;
// 看有没有成四,选择第五子的位置
if (data[row][column+1]==pict&&data[row][column+2]==pict&&data[row][column+3]==pict) //横向成四,选择放在首或尾
{
if (istaked[row][column-1]==false&&column>1)
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (istaked[row][column+4]==false&&column<7)
{
data[row][column+4]='o';
istaked[row][column+4]=true;
printf("电脑放置棋子的位置是: \n",row,column+4);
return;
}
}
if (data[row+1][column]==pict&&data[row+2][column]==pict&&data[row+3][column]==pict) // 竖向成三四
{
if (istaked[row-1][column]==false&&row>1) // 注意,也许有点问题
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (istaked[row+4][column]==false&&row<7)
{
data[row+4][column]='o';
istaked[row+4][column]=true;
printf("电脑放置棋子的位置是: \n",row+4,column);
return;
}
}
if (data[row+1][column+1]==pict&&data[row+2][column+2]==pict&&data[row+3][column+3]==pict)
{ // 斜向右成三四
if (istaked[row-1][column-1]==false&&column>1&&row>1)
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (istaked[row+4][column+4]==false&&column<7&&row<7)
{
data[row+4][column+4]='o';
istaked[row+4][column+4]=true;
printf("电脑放置棋子的位置是: \n",row+4,column+4);
return;
}
}
if (data[row+1][column-1]==pict&&data[row+2][column-2]==pict&&data[row+3][column-3]==pict)
{ //斜向左成三四
if (istaked[row-1][column+1]==false&&column<10&&row>1)
{
data[row-1][column+1]='o';
istaked[row-1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column+1);
return;
}
if (istaked[row+4][column-4]==false&&column>4&&row<7)
{
data[row+4][column-4]='o';
istaked[row+4][column-4]=true;
printf("电脑放置棋子的位置是: \n",row+4,column-4);
return;
}
}
}
}
//The second step to find if there is any continuous three
//first for the computer itself
for (row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
pict=data[row][column];
if(pict==' '||pict=='*')
continue;
//判断有没有三个相连,选择第四子的位置
if (data[row][column+1]==pict&&data[row][column+2]==pict) // 横向两三
{
if (istaked[row][column-1]==false&&column>2&&data[row][column-2]==pict)
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (istaked[row][column+3]==false&&column<7&&data[row][column+4]==pict)
{
data[row][column+3]='o';
istaked[row][column+3]=true;
printf("电脑放置棋子的位置是: \n",row,column+3);
return;
}
}
if (data[row+1][column]==pict&&data[row+2][column]==pict) //竖向两三
{
if (istaked[row-1][column]==false&&row>2&&data[row-2][column]==pict)
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (istaked[row+3][column]==false&&row<7&&data[row+4][column]==pict)
{
data[row+3][column]='o';
istaked[row+3][column]=true;
cout<<"电脑放置棋子的位置是:"<<row+3<<' '<<column<<endl;
printf("电脑放置棋子的位置是: \n",row+3,column);
return;
}
}
if (data[row+1][column+1]==pict&&data[row+2][column+2]==pict) // 斜向右三子
{
if (istaked[row-1][column-1]==false&&column>2&&row>2&&data[row-2][column-2]==pict)
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (istaked[row+3][column+3]==false&&column<7&&row<7&&data[row+4][column+4]==pict)
{
data[row+3][column+3]='o';
istaked[row+3][column+3]=true;
printf("电脑放置棋子的位置是: \n",row+3,column+3);
return;
}
}
if (data[row+1][column-1]==pict&&data[row+2][column-2]==pict) //斜向左三子
{
if (istaked[row-1][column+1]==false&&column<9&&row>2&&data[row-2][column+2]==pict)
{
data[row-1][column+1]='o';
istaked[row-1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column+1);
return;
}
if (istaked[row+3][column-3]==false&&column>4&&row<7&&data[row+4][column-4]==pict)
{
data[row+3][column-3]='o';
istaked[row+3][column-3]=true;
printf("电脑放置棋子的位置是: \n",row+3,column-3);
return;
}
}
//now only three continuous
if (data[row][column+1]==pict&&data[row][column+2]==pict) //看一下这四个if 和上面的不同
{
if (istaked[row][column-1]==false&&column>1)
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (istaked[row][column+3]==false&&column<8)
{
data[row][column+3]='o';
istaked[row][column+3]=true;
printf("电脑放置棋子的位置是: \n",row,column+3);
return;
}
}
//to detect if there is only three in a column continuous
if (data[row+1][column]==pict&&data[row+2][column]==pict)
{
if (istaked[row-1][column]==false&&row>1)
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (istaked[row+3][column]==false&&row<8)
{
data[row+3][column]='o';
istaked[row+3][column]=true;
printf("电脑放置棋子的位置是: \n",row+3,column);
return;
}
}
if (data[row+1][column+1]==pict&&data[row+2][column+2]==pict)
{
if (istaked[row-1][column-1]==false&&column>1&&row>1)
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (istaked[row+3][column+3]==false&&column<8&&row<8)
{
data[row+3][column+3]='o';
istaked[row+3][column+3]=true;
printf("电脑放置棋子的位置是: \n",row+3,column+3);
return;
}
}
if (data[row+1][column-1]==pict&&data[row+2][column-2]==pict)
{
if (istaked[row-1][column+1]==false&&column<10&&row>1)
{
data[row-1][column+1]='o';
istaked[row-1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column+1);
return;
}
if (istaked[row+3][column-3]==false&&column>3&&row<8)
{
data[row+3][column-3]='o';
istaked[row+3][column-3]=true;
printf("电脑放置棋子的位置是: \n",row+3,column-3);
return;
}
}
}
}
//The third stage is to detect if there is any two continuous
//the first is for the computer
for (row=1;row<11;row++) //判断两个子 选择第三子的位置
{
for (column=1;column<11;column++)
{
pict=data[row][column];
if(pict==' '||pict=='*')
continue;
if (data[row][column+1]==pict) //横
{
if (istaked[row][column-1]==false&&column>2&&data[row][column-2]==pict)
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (istaked[row][column+2]==false&&column<8&&data[row][column+3]==pict)
{
data[row][column+2]='o';
istaked[row][column+2]=true;
printf("电脑放置棋子的位置是: \n",row,column+2);
return;
}
}
if (data[row+1][column]==pict) //竖
{
if (istaked[row-1][column]==false&&row>2&&data[row-2][column]==pict)
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (istaked[row+2][column]==false&&row<8&&data[row+3][column]==pict)
{
data[row+2][column]='o';
istaked[row+2][column]=true;
printf("电脑放置棋子的位置是: \n",row+2,column);
return;
}
}
if (data[row+1][column+1]==pict) //斜右
{
if (istaked[row-1][column-1]==false&&column>2&&row>2&&data[row-2][column-2]==pict)
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (istaked[row+2][column+2]==false&&column<8&&row<8&&data[row+3][column+3]==pict)
{
data[row+2][column+2]='o';
istaked[row+2][column+2]=true;
printf("电脑放置棋子的位置是: \n",row+2,column+2);
return;
}
}
if (data[row+1][column-1]==pict) //斜左
{
if (istaked[row-1][column+1]==false&&column<9&&row>2&&data[row-2][column+2]==pict)
{
data[row-1][column+1]='o';
istaked[row-1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column+1);
return;
}
if (istaked[row+2][column-2]==false&&column>3&&row<8&&data[row+3][column-3]==pict)
{
data[row+2][column-2]='o';
istaked[row+2][column-2]=true;
printf("电脑放置棋子的位置是: \n",row+2,column-2);
return;
}
}
//再看这四个,着实不明白,为什么判断条件不同,要重复两次
if (data[row][column+1]==pict) //横
{
if (istaked[row][column-1]==false&&column>1)
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (istaked[row][column+2]==false&&column<9)
{
data[row][column+2]='o';
istaked[row][column+2]=true;
printf("电脑放置棋子的位置是: \n",row,column+2);
return;
}
}
if (data[row+1][column]==pict) //竖
{
if (istaked[row-1][column]==false&&row>1)
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (istaked[row+2][column]==false&&row<9)
{
data[row+2][column]='o';
istaked[row+2][column]=true;
printf("电脑放置棋子的位置是: \n",row+2,column);
return;
}
}
if (data[row+1][column+1]==pict) //斜右
{
if (istaked[row-1][column-1]==false&&column>1&&row>1)
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (istaked[row+2][column+2]==false&&column<9&&row<9)
{
data[row+2][column+2]='o';
istaked[row+2][column+2]=true;
printf("电脑放置棋子的位置是: \n",row+2,column+2);
return;
}
}
if (data[row+1][column-1]==pict) //斜左
{
if (istaked[row-1][column+1]==false&&column<10&&row>1)
{
data[row-1][column+1]='o';
istaked[row-1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column+1);
return;
}
if (istaked[row+2][column-2]==false&&column>2&&row<9)
{
data[row+2][column-2]='o';
istaked[row+2][column-2]=true;
printf("电脑放置棋子的位置是: \n",row+2,column-2);
return;
}
}
}
}
// 单独一个子
for (row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
pict=data[row][column];
if(pict==' '||pict=='o')
continue;
if (data[row][column-2]==pict&&column>2&&istaked[row][column-1]==false) //横左
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (data[row][column+2]==pict&&column<9&&istaked[row][column+1]==false) //横右
{
data[row][column+1]='o';
istaked[row][column+1]=true;
printf("电脑放置棋子的位置是: \n",row,column+1);
return;
}
if (data[row-2][column]==pict&&row>2&&istaked[row-1][column]==false) //竖上
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (data[row+2][column]==pict&&row<9&&istaked[row+1][column]==false) //竖下
{
data[row+1][column]='o';
istaked[row+1][column]=true;
printf("电脑放置棋子的位置是: \n",row+1,column);
return;
}
if (data[row-2][column-2]==pict&&row>2&&column>2&&istaked[row-1][column-1]==false) // 斜左上
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (data[row+2][column+2]==pict&&row<9&&column<9&&istaked[row+1][column+1]==false) //斜右下
{
data[row+1][column+1]='o';
istaked[row+1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row+1,column+1);
return;
}
if (column>1&&istaked[row][column-1]==false) //横左
{
data[row][column-1]='o';
istaked[row][column-1]=true;
printf("电脑放置棋子的位置是: \n",row,column-1);
return;
}
if (column<10&&istaked[row][column+1]==false) //横右
{
data[row][column+1]='o';
istaked[row][column+1]=true;
printf("电脑放置棋子的位置是: \n",row,column+1);
return;
}
if (row>1&&istaked[row-1][column]==false) //竖上
{
data[row-1][column]='o';
istaked[row-1][column]=true;
printf("电脑放置棋子的位置是: \n",row-1,column);
return;
}
if (row<10&&istaked[row+1][column]==false) //竖下
{
data[row+1][column]='o';
istaked[row+1][column]=true;
printf("电脑放置棋子的位置是: \n",row+1,column);
return;
}
if (row>1&&column>1&&istaked[row-1][column-1]==false) // 斜左上
{
data[row-1][column-1]='o';
istaked[row-1][column-1]=true;
printf("电脑放置棋子的位置是: \n",row-1,column-1);
return;
}
if (row<10&&column<10&&istaked[row+1][column+1]==false) //斜右下
{
data[row+1][column+1]='o';
istaked[row+1][column+1]=true;
printf("电脑放置棋子的位置是: \n",row+1,column+1);
return;
}
}
}
//最后一个没有子的位置
for (row=1;row<11;row++)
{
for (column=1;column<11;column++)
{
if (istaked[row][column]==false)
{
data[row][column]='o';
istaked[row][column]=true;
printf("电脑放置棋子的位置是: \n",row,column);
return;
}
}
}
}
int main()
{
int decide; int a;
initthearray();
output();
printf("人人对弈请按1,人机对弈请按2\n");
scanf("%d",&a);
if(a==1)
{
people();
}
else{
while (1)
{
cout<<"请按(横 竖)坐标放置棋子:";
getposition();
decide=isover();
switch (decide)
{
case -1: // -1时棋盘全部占满
output();
printf("游戏结束 平局.\n");
return 0;
case 0:
break;
case 1:
output();
printf("恭喜你!你赢了!\n");
return 0;
case 2:
output();
printf("笨蛋!你输了!.\n");
return 0;
default:break;
}
AIsolve();
// 调用算法,选择下一步的位置
output();
}
getchar();
system("pause");
}
return 0;
}
版权声明:本文标题:五子棋人人加人机对弈 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728852185a1176809.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论