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++;
else
break;//向右下检查
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++;
else
break;//向左下检查 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个方位,然后根据我不断调试得到的“高级权重计算公式”,得到了较为合理的走棋。其中被注释掉的是之前想要扩展的棋型,后面直接摆烂了。就由你们努力了。