DEVC++实现五子棋交互及ai

可以通过鼠标操控界面 采用的是对鼠标坐标的解析

五子棋AI算法是用的别人的 找不到出处了

#include<bits/stdc++.h>
#include<windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
 
int ch[20][20],Score[20][20];
int fang_a[4]={-1,-1,-1,0};
int fang_b[4]={-1,0,1,-1};
 
struct Sdian
{
    int a,b;
    Sdian(int a=0,int b=0):a(a),b(b){}
};
 
Sdian buzhou[301];
int sign_buzhou_num;
Sdian dian[301];
 
void 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 (ch[x][y] == 0)
				for(int i=0;i<4;i++)  ///4个方向撇竖捺横
						{
						    int a[3]={0},sign_a=1;
						    int b[4]={0},sign_b=2;
						    a[1]=1;
						    int sign_qian=5,sign_hou=-5;
							///对玩家落点评分
							for (k = 1; k <= 4; k++)
							{
							    int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];
								if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )
                                    if(ch[sign_x][sign_y] == 2)a[sign_a]++;     ///自己
                                    else if (ch[sign_x][sign_y] == 0){++sign_a;b[sign_b++]=0;if(sign_b==4)break;}   ///空位
                                    else {b[sign_b]=2;sign_qian=k;break;}     ///敌方
                                else {b[sign_b]=2;sign_qian=k;break;}        ///越界
 
							}
 
							sign_a=1;sign_b=1;
							for (k = -1; k >= -4; k--)
							{
                                int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];
								if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )
                                    if(ch[sign_x][sign_y] == 2)a[sign_a]++;     ///自己
                                    else if (ch[sign_x][sign_y] == 0){--sign_a;b[sign_b--]=0;if(sign_b==-1)break;}   ///空位
                                    else {b[sign_b]=2;sign_hou=k;break;}     ///敌方
                                else {b[sign_b]=2;sign_hou=k;break;}        ///越界
							}
 
							if(sign_qian-sign_hou>5)
                            {
                                if(a[1]>=5)Score[x][y]+=100000;
                                else if(a[1]==4)
                                {
                                    if(b[1]==2||b[2]==2)Score[x][y]+=1100;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=5000;
                                    else Score[x][y]+=10000;
                                }
                                else if(a[1]==3)
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=100;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=500;
                                    else Score[x][y]+=1000;
                                }
                                else if(a[1]==2)
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;
                                    else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=800;
                                    else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=80;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=10;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=50;
                                    else Score[x][y]+=100;
                                }
                                else
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;
                                    else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=800;
                                    else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=80;
                                    else if((a[0]+a[1]==2&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==2&&b[1]!=2&&b[4]!=2))Score[x][y]+=80;
                                    else if(a[0]+a[1]==2||a[1]+a[2]==2)Score[x][y]+=8;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=1;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=5;
                                    else Score[x][y]+=10;
                                }
                            }
 
							///对电脑落点评分
 
							a[0]=a[1]=a[2]=0;sign_a=1;
						    b[0]=b[1]=b[2]=b[3]=0;sign_b=2;
						    a[1]=1;
						    sign_qian=5,sign_hou=-5;
							for (k = 1; k <= 4; k++)
							{
							    int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];
								if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )
                                    if(ch[sign_x][sign_y] == 1)a[sign_a]++;     ///自己
                                    else if (ch[sign_x][sign_y] == 0){++sign_a;b[sign_b++]=0;if(sign_b==4)break;}   ///空位
                                    else {b[sign_b]=2;sign_qian=k;break;}     ///敌方
                                else {b[sign_b]=2;sign_qian=k;break;}        ///越界
 
							}
 
							sign_a=1;sign_b=1;
							for (k = -1; k >= -4; k--)
							{
                                int sign_x=x + k*fang_a[i],sign_y=y + k*fang_b[i];
								if (sign_x >= 0 && sign_x <= 14 &&sign_y >= 0 && sign_y <= 14 )
                                    if(ch[sign_x][sign_y] == 1)a[sign_a]++;     ///自己
                                    else if (ch[sign_x][sign_y] == 0){--sign_a;b[sign_b--]=0;if(sign_b==-1)break;}   ///空位
                                    else {b[sign_b]=2;sign_hou=k;break;}     ///敌方
                                else {b[sign_b]=2;sign_hou=k;break;}        ///越界
							}
 
							if(sign_qian-sign_hou>5)
                            {
                                if(a[1]>=5)Score[x][y]+=1000000;
                                else if(a[1]==4)
                                {
                                    if(b[1]==2||b[2]==2)Score[x][y]+=1200;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=5000;
                                    else Score[x][y]+=50001;
                                }
                                else if(a[1]==3)
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1100;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=100;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=500;
                                    else Score[x][y]+=1001;
                                }
                                else if(a[1]==2)
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1160;
                                    else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=900;
                                    else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=90;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=10;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=50;
                                    else Score[x][y]+=101;
                                }
                                else
                                {
                                    if(a[0]+a[1]>=4||a[2]+a[1]>=4)Score[x][y]+=1196;
                                    else if((a[0]+a[1]==3&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==3&&b[1]!=2&&b[4]!=2))Score[x][y]+=900;
                                    else if(a[0]+a[1]==3||a[1]+a[2]==3)Score[x][y]+=90;
                                    else if((a[0]+a[1]==2&&b[0]!=2&&b[3]!=2)||(a[1]+a[2]==2&&b[1]!=2&&b[4]!=2))Score[x][y]+=90;
                                    else if(a[0]+a[1]==2||a[1]+a[2]==2)Score[x][y]+=9;
                                    else if(b[1]==2||b[2]==2)Score[x][y]+=1;
                                    else if(b[0]==2||b[3]==2)Score[x][y]+=5;
                                    else Score[x][y]+=11;
                                }
                            }
						}
 
}
 
void print()
{
    system("cls");
    printf("悔");
    for(int i=0;i<=14;i++)
        printf("%2d",i);
    cout<<endl;
    for(int i=0;i<=14;i++){
        printf("%2d",i);
        for(int j=0;j<=14;j++)
            printf(" %c",ch[i][j]==0?'.':(ch[i][j]==1?'O':'X'));
        putchar('\n');
    }
}
 
void kaiju(int a,int b,int &aa,int &bb)
{
    if((a==6&&b==6)||(a==6&&b==7)){ch[5][6]=1;buzhou[++sign_buzhou_num]=Sdian(5,6);aa=5;bb=6;}
    else if((a==6&&b==8)||(a==7&&b==8)){ch[6][9]=1;buzhou[++sign_buzhou_num]=Sdian(6,9);aa=6;bb=9;}
    else if((a==8&&b==8)||(a==8&&b==7)){ch[9][8]=1;buzhou[++sign_buzhou_num]=Sdian(9,8);aa=9;bb=8;}
    else if((a==8&&b==6)||(a==7&&b==6)){ch[8][5]=1;buzhou[++sign_buzhou_num]=Sdian(8,5);aa=8;bb=5;}
    else{
        ChessScore();
        srand(time(NULL));
        int sign_max=Score[0][0],sign_num=0;
        for(int i=0;i<15;i++)
        for(int j=0;j<15;j++)
            sign_max=max(sign_max,Score[i][j]);
        for(int i=0;i<15;i++)
        for(int j=0;j<15;j++)
        {
            if(Score[i][j]==sign_max){dian[sign_num++]=Sdian(i,j);/*cout<<"###"<<endl;int aaa;cin>>aaa;*/}
        }
            Sdian sign_rand=dian[rand()%sign_num];
            aa=sign_rand.a;
            bb=sign_rand.b;
            ch[aa][bb]=1;
            buzhou[++sign_buzhou_num]=Sdian(aa,bb);
    }
}
 
int panduan(int a,int b)
{
    for(int i=0;i<4;i++){
        int num=1;
        for(int k=1;k<=4;k++){
            int sign=ch[a+k*fang_a[i]][b+k*fang_b[i]];
            if(sign==ch[a][b])num++;
            else break;
        }
        for(int k=-1;k>=-4;k--){
            int sign=ch[a+k*fang_a[i]][b+k*fang_b[i]];
            if(sign==ch[a][b])num++;
            else break;
        }
        if(num>=5)return ch[a][b];
    }
    return -1;
}
 
int main()
{
    int sign_start=1,zsx=53,zsy=74,yxx=278,yxy=308;//53 74   278 308

    double sxyg=0,zyyg=0;
    while(sign_start==1)
	{
        sign_buzhou_num=-1;
        int a,b,sheng,sign_bushu=1;
        memset(ch,0,sizeof(ch));
        cout<<"你先还是电脑先?电脑先输入1,否则输入其他的数字"<<endl;
		int ppp;
		cin>>ppp; 
		
		
		if(ppp==1)
		{
	        ch[7][7]=1;
		    buzhou[++sign_buzhou_num]=Sdian(7,7);
		    
		    
		    cout<<"电脑下子的位置:"<<7<<","<<7<<endl;
		}
		print();
        SetConsoleTitle("五子棋");
		
		POINT p;
		int k=0;
		cout<<"请点击棋盘左上角和右下角"<<endl; 
		while(k<2)
		{
			if (GetCursorPos(&p)&&KEY_DOWN(VK_LBUTTON))   
			{
				k++;
				if(k==1)
					zsx=p.x,zsy=p.y;
				if(k==2)
					yxx=p.x,yxy=p.y;
				while(KEY_DOWN(VK_LBUTTON))
				{
				}				
					
			}
			
		}
		keybd_event(13,0,0,0);
		keybd_event(13,0,KEYEVENTF_KEYUP,0);
		sxyg=yxy-zsy;
		sxyg/=14;
		zyyg=yxx-zsx;
		zyyg/=14;
        while(1){
            if(sign_bushu%2==1)
                while(1){
                if(sign_buzhou_num==0)cout<<"请输入您下子的位置:"<<endl;
                else cout<<"悔棋的话点左上角"<<endl;
                while(1)
				{
					if (GetCursorPos(&p)&&KEY_DOWN(VK_LBUTTON))   
					{
						
						int a1=p.x,b1=p.y;
						
						a=b1-zsy;
						a/=sxyg;
						b=a1-zsx;
						b/=zyyg;
						while(KEY_DOWN(VK_LBUTTON))
						{
						}			
						break;	
					}
					
				}
				keybd_event(13,0,0,0);
				keybd_event(13,0,KEYEVENTF_KEYUP,0);
				cout<<a<<" "<<b;
                if(a!=-1||b!=-1)
                    if(a>=0&&a<=14&&b>=0&&b<=14)
                        if(ch[a][b]!=0) cout<<"该地方已经有子,请重新下子"<<endl;
                        else {ch[a][b]=2;buzhou[++sign_buzhou_num]=Sdian(a,b);break;}
                    else cout<<"该地方已越界,请重新下子"<<endl;
                else
                    if(sign_buzhou_num==0)cout<<"悔棋失败"<<endl;
                    else
                    {
                        Sdian dian1=buzhou[sign_buzhou_num--];
                        Sdian dian2=buzhou[sign_buzhou_num--];
                        Sdian dian3=buzhou[sign_buzhou_num];
                        ch[dian1.a][dian1.b]=ch[dian2.a][dian2.b]=0;
                        print();
                        cout<<"电脑下子的位置:"<<dian3.a<<","<<dian3.b<<endl;
                        sign_bushu-=2;
                    }
                }
            else{
                if(sign_bushu!=2)
                {
                    ChessScore();
                    srand(time(NULL));
                    int sign_max=Score[0][0],sign_num=0;
                    for(int i=0;i<15;i++)
                        for(int j=0;j<15;j++)
                        sign_max=max(sign_max,Score[i][j]);
                    for(int i=0;i<15;i++)
                        for(int j=0;j<15;j++)
                        {
                            if(Score[i][j]==sign_max){dian[sign_num++]=Sdian(i,j);/*cout<<"###"<<endl;int aaa;cin>>aaa;*/}
                        }
                    Sdian sign_rand=dian[rand()%sign_num];
                    a=sign_rand.a;
                    b=sign_rand.b;
                    ch[a][b]=1;
                    buzhou[++sign_buzhou_num]=Sdian(a,b);
                    ///Sleep(2000);
                }
                else kaiju(buzhou[sign_buzhou_num].a,buzhou[sign_buzhou_num].b,a,b);
            }
            print();
            if(sign_bushu%2==0)cout<<"电脑下子的位置:"<<a<<","<<b<<endl;
            int jieguo=panduan(a,b);
            if(jieguo!=-1){sheng=jieguo;break;}
            sign_bushu+=1;
        }
        if(sheng==2)cout<<"恭喜您战胜了电脑!"<<endl;
        else cout<<"很遗憾您被电脑击败了,再接再厉!"<<endl;
        cout<<"输入1重新开始游戏,输入2退出:"<<endl;
        cin>>sign_start;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工藤李源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值