C语言五子棋--人机对弈--人人对弈

news/2024/10/30 21:24:00/

C语言五子棋:

注:直接可以运行使用的代码,家人们的点赞在哪里
第一次实现可以进行人机对战的五子棋,分享下,难度不大。都是按照模块来写的,封装成了很多个函数,比较细致,新手还是可以看懂的。主要可以实现人人对战(包含提示),和人机对战。人机
对战的算法也不难。
对应的模块都写成了函数,总体来说逻辑还是比较简单的,如果是想要知道人机对战是怎么实现的伙伴可以移步最后。其实还是蛮简单的,只是根据一定的计算公式去计算该位置的权(即价值),权高者即为当前认为的最优位置。
还有伙伴反应,这个程序跑起来不对,甚至界面都不完整。那是因为使用了新版的命令窗口。切换到旧版的就是正确的了。

切换到旧版的win命令窗口

没有切换之前
在这里插入图片描述

切换过程
在这里插入图片描述
点击属性
在这里插入图片描述
在这里插入图片描述
点击确定,重新启动,就正常了。
在这里插入图片描述

对应操作

空格为下子。
F1为提示,电脑下子
按上下左右移动位置。

//仅供参考,可能有为完善的bug,概不负责
/*头文件*/    
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include<windows.h>			//控制dos界面
#include <time.h>
#include<math.h>
/*宏定义*/ #define MAXIMUS 15 //定义棋盘大小
/*函数声明*/ 
typedef struct{int x,y;
}place;int p[MAXIMUS][MAXIMUS];//存储对局信息char buff[MAXIMUS*2+1][MAXIMUS*4+3];//输出缓冲器int Cx,Cy;//当前光标位置int Now;//当前走子的玩家,1代表黑,2代表白int wl,wp;//当前写入缓冲器的列数和行数位置char* showText;//在棋盘中央显示的文字信息int count;//回合数void explation();void gotoxy(int x,int y);int color(int c);int	RunGame();int RunRobotGame();place robot(){place xy;int power[MAXIMUS][MAXIMUS]={0}; for(int x =0;x <MAXIMUS;x++){for(int y =0;y<MAXIMUS;y++){int i=0;int ix=1,iy=1,ir=1,ic=1;int qx=0,qy=0,qr=0,qc=0;if(p[x][y]==0){for(i=1;i<5;i++)if(y+i<MAXIMUS&&p[x][y+i]==Now)iy++;else{if(y+i<MAXIMUS&&p[x][y+i]==0){qy++;} break;} //向下检查for(i=1;i<5;i++)if(y-i>0&&p[x][y-i]==Now)iy++;else{if(y+i<MAXIMUS&&p[x][y-i]==0){qy++;} break;}for(i=1;i<5;i++)if(x+i<MAXIMUS&&p[x+i][y]==Now)ix++;else {if(x+i<MAXIMUS&&p[x+i][y]==0){qx++;} break;}//向右检查for(i=1;i<5;i++)if(x-i>0&&p[x-i][y]==Now)ix++;else {if(x-i>0&&p[x-i][y]==0){qx++;} break;}//向左检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==Now)ir++;else{if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==0){qr++;}break;} //向右下检查for(i=1;i<5;i++)if(x-i>0&&y-i>0&&p[x-i][y-i]==Now)ir++;else{if(x-i>0&&y-i>0&&p[x-i][y-i]==0){qr++;} } //向左上检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==Now)ic++;else {if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==0){qc++;}break;} //向右上检查for(i=1;i<5;i++)if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==Now)ic++;else{if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==0){qc++;}break;}//向左下检查if(ir>=5||ic>=5||ix>=5||iy>=5){xy.x=x;xy.y=y;return xy;}int tc=1,tx=1,ty=1,tr=1;int qtc=0,qtr=0,qtx=0,qty=0;for(i=1;i<5;i++)if(y+i<MAXIMUS&&p[x][y+i]==3-Now)ty++;else{if(y+i<MAXIMUS&&p[x][y+i]==0){qty++;} break;} //向下检查for(i=1;i<5;i++)if(y-i>0&&p[x][y-i]==3-Now)ty++;else{if(y+i<MAXIMUS&&p[x][y-i]==0){qty++;} break;}for(i=1;i<5;i++)if(x+i<MAXIMUS&&p[x+i][y]==3-Now)tx++;else {if(x+i<MAXIMUS&&p[x+i][y]==0){qtx++;} break;}//向右检查for(i=1;i<5;i++)if(x-i>0&&p[x-i][y]==3-Now)tx++;else {if(x-i>0&&p[x-i][y]==0){qtx++;} break;}//向左检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==3-Now)tr++;else{if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==0){qtr++;}break;} //向右下检查for(i=1;i<5;i++)if(x-i>0&&y-i>0&&p[x-i][y-i]==3-Now)tr++;else{if(x-i>0&&y-i>0&&p[x-i][y-i]==0){qtr++;} } //向左上检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==3-Now)tc++;else {if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==0){qtc++;}break;} //向右上检查for(i=1;i<5;i++)if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==3-Now)tc++;else{if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==0){qtc++;}break;}
//			if((ir>=4&&qr>0)||(ic>=4&&qc>0)||(ix>=4&&qx>0)||(iy>=4&&qy>0)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//				if((tr==3&&qtr==3)||(qc==3&&qtc==3)||(qx==3&&qtx==3)||(qy==3&&qty==3)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//				if((tr==4&&qtr>0)||(qc==4&&qtc>0)||(qx==4&&qtx>0)||(qy==4&&qty>0)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//			
//				if((ir==3&&qr==2)||(ic==3&&qc==2)||(ix==3&&qx==2)||(iy==3&&qy==2)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//			
//				if((tr==3&&qtr==2)||(tc==3&&qtc==2)||(tx==3&&qtx==2)||(ty==3&&qty==2)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}power[x][y]= pow(ix,ix)*qx+ pow(iy,iy)*qy+ pow(ir,ir)*qr+ pow(ic,ic)*qc+ pow(tx,tx)*qtx+ pow(ty,ty)*qty+ pow(tc,tc)*qtc+ pow(tr,tr)*qtr; 		}}}int max =0;for(int x =0;x <MAXIMUS;x++){for(int y =0;y<MAXIMUS;y++){if(power[x][y]>max){max =power[x][y];xy.x=x;xy.y=y; } }} return xy;
}
/*** 设置光标位置*/
void gotoxy(int x,int y)
{COORD c;c.X=x;c.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}/*** 文字颜色函数      此函数的局限性:1、只能Windows系统下使用   2、不能改变背景颜色*/
int color(int c)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改文字颜色return 0;
}
/*** 开始界面*/
void welcometogame()
{int n;int i,j = 1;gotoxy(23,2);color(13);printf("五 子 棋 游 戏");color(15);          			//白色边框for (i =6; i <= 12; i++)   	//输出上下边框┅{for (j = 7; j <= 54; j++)  //输出左右边框┇{gotoxy(j, i);if (i == 6 || i == 12){printf("--");}else if (j == 7 || j == 54){printf("|");}}}color(14);gotoxy(15, 8);printf("1.开始游戏");gotoxy(35, 8);printf("2.游戏说明");gotoxy(15, 10);printf("3.人机对战          4.退出游戏");gotoxy(19,13);color(12);printf("请选择[1 2 3 4]:[ ]\b\b");        //\b为退格,使得光标处于[]中间color(14);scanf("%d", &n);    		//输入选项switch (n){case 1:system("cls");RunGame();break;case 2:explation();break;case 3:system("cls");RunRobotGame();break;case 4:exit(0);     		//退出游戏break;}
}//修改过的字符串复制函数,会忽略末端的\0
char* Copy(char* strDest,const char* strSrc){char* strDestCopy = strDest;while (*strSrc!='\0'){*strDest++=*strSrc++;}return strDestCopy;}//初始化一个对局函数void Initialize(){int i,j;//循环变量showText="";//重置显示信息count=0;//回合数归零for(i=0;i<MAXIMUS;i++)//重置对局数据{for(j=0;j<MAXIMUS;j++){p[i][j]=0;}}Cx=Cy=MAXIMUS/2;//重置光标到中央	Now=1;//重置当前为黑方}//获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘char* getStyle(int i,int j){if(p[i][j]==1)//1为黑子return "●";else if(p[i][j]==2)//2为白子return "○";else if(i==0&&j==0)//以下为边缘棋盘样式return "┏";else if(i==MAXIMUS-1&&j==0)return "┓";else if(i==MAXIMUS-1&&j==MAXIMUS-1)return "┛";else if(i==0&&j==MAXIMUS-1)return "┗";else if(i==0)return "┠";else if(i==MAXIMUS-1)return "┨";else if(j==0)return "┯";else if(j==MAXIMUS-1)return "┷";return "┼";//中间的空位}//获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示char* getCurse(int i,int j){if(i==Cx){if(j==Cy)return "┏";else if (j==Cy+1)return "┗";}else if(i==Cx+1){if(j==Cy)return "┓";else if (j==Cy+1)return "┛";}return "  ";//如果不在光标附近则为空
}//向缓冲器写入字符串
void write(char* c)
{Copy(buff[wl]+wp,c);wp+=strlen(c);
}//缓冲器写入位置提行
void ln()
{wl+=1;wp=0;
}//将缓冲器内容输出到屏幕
void Display()
{int i,l=strlen(showText);//循环变量,中间文字信息的长度int Offset=MAXIMUS*2+2-l/2;//算出中间文字信息居中显示所在的横坐标位置if(Offset%2==1)//如果位置为奇数,则移动到偶数,避免混乱{Offset--;}Copy(buff[MAXIMUS]+Offset,showText);//讲中间文字信息复制到缓冲器if(l%2==1)//如果中间文字长度为半角奇数,则补上空格,避免混乱{*(buff[MAXIMUS]+Offset+l)=0x20;}system("cls");//清理屏幕,准备写入for(i=0;i<MAXIMUS*2+1;i++){//循环写入每一行printf("%s",buff[i]);if(i<MAXIMUS*2)//写入完每一行需要换行printf("\n");}
}//将整个棋盘算出并储存到缓冲器,然后调用Display函数显示出来void Print(){int i,j;//循环变量wl=0;wp=0;for(j=0;j<=MAXIMUS;j++)//写入出交点左上角的字符,因为需要打印棋盘右下角,所以很以横纵各多一次循环{for(i=0;i<=MAXIMUS;i++){write(getCurse(i,j));//写入左上角字符if(j==0||j==MAXIMUS)//如果是棋上下盘边缘则没有连接的竖线,用空格填充位置{if(i!=MAXIMUS)write(" ");}else//如果在棋盘中间则用竖线承接上下{if(i==0||i==MAXIMUS-1)//左右边缘的竖线更粗write("┃");else if(i!=MAXIMUS)//中间的竖线write("│");}}if(j==MAXIMUS)//如果是最后一次循环,则只需要处理边侧字符,交点要少一排{break;}ln();//提行开始打印交点内容write(" ");//用空位补齐位置for(i=0;i<MAXIMUS;i++)//按横坐标循环正常的次数{write(getStyle(i,j));//写入交点字符if(i!=MAXIMUS-1)//如果不在最右侧则补充一个横线承接左右{if(j==0||j==MAXIMUS-1){write("--");//上下边缘的横线更粗}else{write("--");//中间的横线}}}ln();//写完一行后提行}Display();//将缓冲器内容输出到屏幕
}int Put()
{//在当前光标位置走子,如果非空,则返回0表示失败if(p[Cx][Cy]==0){p[Cx][Cy]=Now;//改变该位置数据return 1;//返回1表示成功}else{return 0;}
}//胜负检查,即判断当前走子位置有没有造成五连珠的情况
int Check()
{int w=1,x=1,y=1,z=1,i;//累计横竖正斜反邪四个方向的连续相同棋子数目for(i=1;i<5;i++)if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==Now)w++;else break;//向下检查for(i=1;i<5;i++)if(Cy-i>0&&p[Cx][Cy-i]==Now)w++;else break;//向上检查if(w>=5)return Now;//若果达到5个则判断当前走子玩家为赢家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==Now)x++;else break;//向右检查for(i=1;i<5;i++)if(Cx-i>0&&p[Cx-i][Cy]==Now)x++;else break;//向左检查if(x>=5)return Now;//若果达到5个则判断当前走子玩家为赢家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy+i<MAXIMUS&&p[Cx+i][Cy+i]==Now)y++;elsebreak;//向右下检查for(i=1;i<5;i++)if(Cx-i>0&&Cy-i>0&&p[Cx-i][Cy-i]==Now)y++;else break;//向左上检查if(y>=5)return Now;//若果达到5个则判断当前走子玩家为赢家for(i=1;i<5;i++)if(Cx+i<MAXIMUS&&Cy-i>0&&p[Cx+i][Cy-i]==Now)z++;else break;//向右上检查for(i=1;i<5;i++)if(Cx-i>0&&Cy+i<MAXIMUS&&p[Cx-i][Cy+i]==Now)z++;elsebreak;//向左下检查 if(z>=5)return Now;//若果达到5个则判断当前走子玩家为赢家if(z>=5) {return Now;}return 0;//若没有检查到五连珠,则返回0表示还没有玩家达成胜利
}//进行整个对局,返回赢家信息(虽然有用上)
int RunGame()
{int input;//输入变量int victor;//赢家信息Initialize();//初始化对局while(1){//开始无限回合的死循环,直到出现胜利跳出Print();//打印棋盘input=getch();//等待键盘按下一个字符if(input==27)//如果是ESC则退出程序{exit(0);}else if(input==0){input = getch();if(input == 59){place pxy = robot();
//	    	Cx = rand()%MAXIMUS;
//	    	Cy = rand()%MAXIMUS;Cx = pxy.x;Cy =pxy.y;if(Put())//如果走子成功则判断胜负{victor=Check();Now=3-Now;//轮换当前走子玩家count++;if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="黑方获得了胜利!";Print();if(getch()==0xE0){getch();}return Now;}else if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="白方获得了胜利!";Display();if(getch()==0xE0){getch();}return Now;}else if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局{showText="平局!";Display();if(getch()==0xE0){getch();}return 0;}}}} else if(input==0x20)//如果是空格则开始走子{if(Put())//如果走子成功则判断胜负{victor=Check();Now=3-Now;//轮换当前走子玩家count++;if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="黑方获得了胜利!";Print();if(getch()==0xE0){getch();}return Now;}else if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="白方获得了胜利!";Display();if(getch()==0xE0){getch();}return Now;}else if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局{showText="平局!";Display();if(getch()==0xE0){getch();}return 0;}}}else if(input==0xE0)//如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键{input=getch();//获得第二次输入信息switch(input)//判断方向键方向并移动光标位置{case 0x4B:Cx--; break;case 0x48:Cy--;break;case 0x4D:Cx++;break;case 0x50:Cy++;break;}if(Cx<0)Cx=MAXIMUS-1;//如果标光位置越界则移动到对侧if(Cy<0)Cy=MAXIMUS-1; if(Cx>MAXIMUS-1)Cx=0;if(Cy>MAXIMUS-1)Cy=0;}}
}int RunRobotGame()
{int input;//输入变量int victor;//赢家信息Initialize();//初始化对局while(1){//开始无限回合的死循环,直到出现胜利跳出Print();//打印棋盘if(Now != 2){input=getch();//等待键盘按下一个字符if(input==27)//如果是ESC则退出程序{exit(0);}else if(input==0x20)//如果是空格则开始走子{if(Put())//如果走子成功则判断胜负{victor=Check();Now=3-Now;//轮换当前走子玩家count++;if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="黑方获得了胜利!";Print();if(getch()==0xE0){getch();}return Now;}else if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="白方获得了胜利!";Display();if(getch()==0xE0){getch();}return Now;}else if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局{showText="平局!";Display();if(getch()==0xE0){getch();}return 0;}}}else if(input==0xE0)//如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键{input=getch();//获得第二次输入信息switch(input)//判断方向键方向并移动光标位置{case 0x4B:Cx--; break;case 0x48:Cy--;break;case 0x4D:Cx++;break;case 0x50:Cy++;break;}if(Cx<0)Cx=MAXIMUS-1;//如果标光位置越界则移动到对侧if(Cy<0)Cy=MAXIMUS-1; if(Cx>MAXIMUS-1)Cx=0;if(Cy>MAXIMUS-1)Cy=0;}}else{place pxy = robot();
//	    	Cx = rand()%MAXIMUS;
//	    	Cy = rand()%MAXIMUS;Cx = pxy.x;Cy =pxy.y;if(Put())//如果走子成功则判断胜负{victor=Check();Now=3-Now;//轮换当前走子玩家count++;if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="黑方获得了胜利!";Print();if(getch()==0xE0){getch();}return Now;}else if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息{showText="白方获得了胜利!";Display();if(getch()==0xE0){getch();}return Now;}else if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局{showText="平局!";Display();if(getch()==0xE0){getch();}return 0;}}}}
}/*
*   游戏说明
*/
void explation()
{int i,j = 1;system("cls");color(13);gotoxy(27,3);printf("游戏说明");color(5);for (i = 6; i <= 22; i++)   //输出上下边框==={for (j = 3; j <= 58; j++)  //输出左右边框||{gotoxy(j, i);if (i == 6 || i == 22) printf("=");else if (j == 3 || j == 58) printf("||");}}color(15);gotoxy(10,8);printf("tip1: 用↑.↓.←.→控制光标的位置");color(14);gotoxy(10,11);printf("tip2: 用空格键确定下棋子");color(12);gotoxy(10,14);printf("tip3: 黑白棋哪个先上下左右5个连在一起,得胜利");color(11);gotoxy(10,17);printf("tip4: 按<Esc>退出游戏");getch();                //按任意键返回主界面system("cls");welcometogame();
}int main()//主函数
{// system("color 2E");//设置颜色welcometogame();while(1){//循环执行游戏RunGame();}return 0;
}

计算位置权重的代码

place robot(){place xy;int power[MAXIMUS][MAXIMUS]={0}; for(int x =0;x <MAXIMUS;x++){for(int y =0;y<MAXIMUS;y++){int i=0;int ix=1,iy=1,ir=1,ic=1;int qx=0,qy=0,qr=0,qc=0;if(p[x][y]==0){for(i=1;i<5;i++)if(y+i<MAXIMUS&&p[x][y+i]==Now)iy++;else{if(y+i<MAXIMUS&&p[x][y+i]==0){qy++;} break;} //向下检查for(i=1;i<5;i++)if(y-i>0&&p[x][y-i]==Now)iy++;else{if(y+i<MAXIMUS&&p[x][y-i]==0){qy++;} break;}for(i=1;i<5;i++)if(x+i<MAXIMUS&&p[x+i][y]==Now)ix++;else {if(x+i<MAXIMUS&&p[x+i][y]==0){qx++;} break;}//向右检查for(i=1;i<5;i++)if(x-i>0&&p[x-i][y]==Now)ix++;else {if(x-i>0&&p[x-i][y]==0){qx++;} break;}//向左检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==Now)ir++;else{if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==0){qr++;}break;} //向右下检查for(i=1;i<5;i++)if(x-i>0&&y-i>0&&p[x-i][y-i]==Now)ir++;else{if(x-i>0&&y-i>0&&p[x-i][y-i]==0){qr++;} } //向左上检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==Now)ic++;else {if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==0){qc++;}break;} //向右上检查for(i=1;i<5;i++)if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==Now)ic++;else{if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==0){qc++;}break;}//向左下检查if(ir>=5||ic>=5||ix>=5||iy>=5){xy.x=x;xy.y=y;return xy;}int tc=1,tx=1,ty=1,tr=1;int qtc=0,qtr=0,qtx=0,qty=0;for(i=1;i<5;i++)if(y+i<MAXIMUS&&p[x][y+i]==3-Now)ty++;else{if(y+i<MAXIMUS&&p[x][y+i]==0){qty++;} break;} //向下检查for(i=1;i<5;i++)if(y-i>0&&p[x][y-i]==3-Now)ty++;else{if(y+i<MAXIMUS&&p[x][y-i]==0){qty++;} break;}for(i=1;i<5;i++)if(x+i<MAXIMUS&&p[x+i][y]==3-Now)tx++;else {if(x+i<MAXIMUS&&p[x+i][y]==0){qtx++;} break;}//向右检查for(i=1;i<5;i++)if(x-i>0&&p[x-i][y]==3-Now)tx++;else {if(x-i>0&&p[x-i][y]==0){qtx++;} break;}//向左检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==3-Now)tr++;else{if(x+i<MAXIMUS&&y+i<MAXIMUS&&p[x+i][y+i]==0){qtr++;}break;} //向右下检查for(i=1;i<5;i++)if(x-i>0&&y-i>0&&p[x-i][y-i]==3-Now)tr++;else{if(x-i>0&&y-i>0&&p[x-i][y-i]==0){qtr++;} } //向左上检查for(i=1;i<5;i++)if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==3-Now)tc++;else {if(x+i<MAXIMUS&&y-i>0&&p[x+i][y-i]==0){qtc++;}break;} //向右上检查for(i=1;i<5;i++)if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==3-Now)tc++;else{if(x-i>0&&y+i<MAXIMUS&&p[x-i][y+i]==0){qtc++;}break;}
//			if((ir>=4&&qr>0)||(ic>=4&&qc>0)||(ix>=4&&qx>0)||(iy>=4&&qy>0)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//				if((tr==3&&qtr==3)||(qc==3&&qtc==3)||(qx==3&&qtx==3)||(qy==3&&qty==3)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//				if((tr==4&&qtr>0)||(qc==4&&qtc>0)||(qx==4&&qtx>0)||(qy==4&&qty>0)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//			
//				if((ir==3&&qr==2)||(ic==3&&qc==2)||(ix==3&&qx==2)||(iy==3&&qy==2)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}
//			
//				if((tr==3&&qtr==2)||(tc==3&&qtc==2)||(tx==3&&qtx==2)||(ty==3&&qty==2)){
//					xy.x = x;
//					xy.y =y;
//					return xy;
//				}power[x][y]= pow(ix,ix)*qx+ pow(iy,iy)*qy+ pow(ir,ir)*qr+ pow(ic,ic)*qc+ pow(tx,tx)*qtx+ pow(ty,ty)*qty+ pow(tc,tc)*qtc+ pow(tr,tr)*qtr; 		}}}int max =0;for(int x =0;x <MAXIMUS;x++){for(int y =0;y<MAXIMUS;y++){if(power[x][y]>max){max =power[x][y];xy.x=x;xy.y=y; } }} return xy;
}

这个算法是返回最佳位置的,然后调用走棋的函数就实现了自动走棋和提示,其实很简单,就是依次判断该位置的上下左右斜线的8个方位,然后根据我不断调试得到的“高级权重计算公式”,得到了较为合理的走棋。其中被注释掉的是之前想要扩展的棋型,后面直接摆烂了。就由你们努力了。


http://www.ppmy.cn/news/396729.html

相关文章

Cmder 安装 cmder 此时不应有 \cmder\vendor\bin\cexec.cmd““。

问题&#xff1a;安装cmder后&#xff0c;打开第一句总是 此时不应有 \cmder\vendor\bin\cexec.cmd""。 探索过程&#xff1a;修改环境变量和Path, 如 1. 2. 但是&#xff0c;依然没有解决问题。 解决办法&#xff1a;删掉原来下载的Cmder解压后的包。之前安装在…

Lumus在CES上发布AR显示屏,拥有55度视场角

以色列AR公司Lumus 发布AR眼镜原型产品&#xff0c;一个拥有大视角&#xff0c;一个时尚感十足。 今年的CES上&#xff0c;不少厂商都发布了和AR相关的产品。一家位于以色列的AR眼镜光学方案初创公司Lumus也公布了两款增强现实眼镜的原型——Maximus和Sleek。 Lumus在去年6月份…

ConEmu

代替cmd的conemu设置 https://www.cnblogs.com/botoo/p/8599811.html https://sourceforge.net/projects/conemu/ https://www.fosshub.com/ConEmu.html Description ConEmu (also known as ConEmu-Maximus5) is an advanced console window (also known as local termina…

PyTorch中的torch.max()和torch.maximum()的用法详解

1、torch.max() torch.max(input) → Tensor 返回 input tensor 中所有元素的最大值。 torch.max(input, dim, keepdimFalse) → output tensors (max, max_indices) 参数&#xff1a; input&#xff1a;输入的 tensor。dim&#xff1a;按什么维度求最大值&#xff08;2D中&am…

r4be和服务器主板稳定性,升级进化 华硕R4BE主板细节解析_华硕 Rampage IV Black Edition_主板评测-中关村在线...

●升级进化华硕R4BE主板细节解析 作为一款定位旗舰级的主板,华硕R4BE不光在硬性规格上拥有绝对高度,在辅助功能及细节设计上也有着独到之处。因为它不光要满足极限超频玩家在超频方面的需求,还要在操作便捷程度上做到人性化。 板载超频区域 熟悉华硕ROG系列产品的用户一定不…

[汽车人][巨无霸 福特][Fortess Maximus]

[汽车人][巨无霸 福特][Fortess Maximus] [ 来自 “ ITPUB博客 ” &#xff0c;链接&#xff1a;http://blog.itpub.net/66530/viewspace-614424/&#xff0c;如需转载&#xff0c;请注明出处&#xff0c;否则将追究法律责任。 转载于:http://blog.itpub.net/66530/viewspace-…

STL之priority_queue与仿函数

目录 一.仿函数1.介绍2.示例 二.priority_queue1.介绍2.成员函数3.模拟实现4.使用 三.其他1.typename Container::value_type 一.仿函数 1.介绍 函数对象&#xff0c;又称仿函数&#xff0c;是可以像函数一样使用的对象&#xff0c;其原理就是重载了函数调用符&#xff1a;()…

C语言实现的简易五子棋

#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #define MAXIMUS 15 ///定义棋盘大小 int p[MAXIMUS][MAXIMUS];///存储对局信息 char buff[MAXIMUS*21][MAXIMUS*43];///输出缓冲器 int Cx,Cy;///当前光标位置 int N…