对角棋编程
‘壹’ C语言编程立体四子棋
给个判断胜利的算法你,具体自己完善。
//一个立四方体用不同的面进行切割可切割成12个不重复的面,对每个面调用isWin()函数,以下是伪代码
void main()
{
int board[4][4][4]={1,1,2,2...1,2,1}
int cube[][];
for(i=0;i<4;i++)
{
cube[][]=board[i][][];
if(isWin(cube))
{
printf("win");
return;
}
cube[][]=board[][i][]
if(isWin(cube))
{
printf("win");
return;
}
cube[][]=board[][][i]
if(isWin(cube))
{
printf("win");
return;
}
}
//判断一个面是否构成四连
int isWin(int cube[][])
{
//判断所有行的四个棋子是否一样
for(i=0;i<4;i++)
if(cube[i][0]==cube[i][1]==cube[i][2]==cube[i][3])
return true;
//判断所有列的四个棋子是否一样
for(i=0;i<4;i++)
if(cube[0][i]==cube[1][i]==cube[2][i]==cube[3][i])
return true;
//判断对角线的四个棋子是否一样
if(cube[0][0]==cube[1][1]==cube[2][2]==cube[3][3])
return true;
if(cube[0][3]==cube[1][2]==cube[2][1]==cube[3][0])
return true;
return false;
}
}
‘贰’ 五子棋获胜表,编程怎么写
在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为10*10。
(1),计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:6*10=60。
(2),计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:6*10=60。
(3),计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36。
(4),计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)*2=36。
这样所有的获胜组合数为:60+60+36+36=192。
‘叁’ 用C语言编程:在8*8格上摆棋子任意一个棋子不能处于同一行同一列或同一斜线上,将其摆法一一打印出来。
参考一下我的代码吧,你再作下修改就行了
#include<stdio.h>
void reset(int visited[][8])
{
int i;
int j;
for(i = 0; i < 8; i++)
for(j = 0; j < 8; j++)
visited[i][j] = 0;
}
int judge(int visited[][8],int i,int j)
{
int k;
if(i == j)
{
for(k = 0; k < 8; k++)
if(visited[k][k])
return 0;
}
if(i+j == 7)
{
for(k = 0; k < 8; k++)
if(visited[k][7-k])
return 0;
}
for(k = 0; k < 8; k++)
if(visited[i][k] || visited[k][j])
return 0;
return 1;
}
void main()
{
FILE *fp = fopen("output.txt","w");
int visited[8][8];
int m,n;
int i,j;
for(m = 0; m < 8; m++) //从左到右遍历
for(n = 0; n < 8; n++)
{
reset(visited);
visited[m][n] = 1;
for(i = 0; i < 8; i++)
{
for(j = 0; j < 8;j++)
{
if(judge(visited,i,j) || visited[i][j])
{
visited[i][j] = 1;
fprintf(fp,"# ");
}
else
fprintf(fp,". ");
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
}
fclose(fp);
}
‘肆’ java 用二维数组编程 井字棋问题求助!
inta[][]=newint[3][3];
for(inti=0;i<a.length;i++){
for(intj=0;j<a.length;j++){
a[i][j]=(int)(Math.random()*2);
}
}
intx=0;
for(inti=0;i<a.length;i++){
for(intj=0;j<a.length;j++){
x++;
System.out.print(a[i][j]+"");
if(x%3==0)
System.out.println();
}
}
判断的话if(a[0][0]==a[0][2]==a[0][1])等等都写上就行了
‘伍’ 手机象棋软件是怎么编程出来的,这么厉害
软件下棋是这样的:
先观察当前局面,列出所有可能的走法,然后对每种走法进行分析。
分析时,会深入若干步,看这种下法究竟如何。
判断局面的时候,会根据多种因素评分:比如为每一个棋子赋予不同的权重,车为20,马为10,炮为10,之类;为不同的位置也赋予不同的权重,比如,车在中央为50,在角落为10,在靠近对方九宫的地方为80;同一个棋子在不同的进程也可能有不同的值,比如马,到了残局阶段就会增加价值;兵过河以后会增加价值;如果能够导致杀棋的下法,价值会最大。如果能造成对方拥塞、丢子等分值降低的下法,也会为己方增值。
如果你按照套路开局,它还有开局库可以随便挑;如果你不按照套路开局,它有强大的计算力。
软件的优势是计算的全面和较深入。能够把人对象棋棋理的认识反应出来,所以很厉害。
(围棋软件暂时还没有那么厉害,是因为围棋的变化和棋理更复杂。最高水平的围棋棋手都谦虚的说自己只了解了围棋的7% )
‘陆’ 五子棋c程序设计
#include<stdio.h>
#define N 10
void welcome();
void initqipan();
void showqi(int i);
void save(int p);
void panan(int p);
void heqi();
void over();
int zouqihang();
int zouqilie();
/******************结构体*****************/
struct zuobiao
{
int x[N];
int y[N];
}wei[N];
/******************主函数*****************/
void main()
{
int p=0;
welcome();
initqipan();
for(p=1;p<=N;p++)
{
wei[p].x[p]=zouqihang();
wei[p].y[p]=zouqilie();
save(p);
showqi(p);
panan(p);
}
if(p==N)
heqi();
over();
}
/******************建立棋盘*****************/
void initqipan()
{
int i,j;
for(i=0;i<N;i++)
{
printf("%d",i);
printf(" ");
}
printf("\n");
for(i=1;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==0)
printf("%d",i);
else
printf("·");
}
printf("\n");
}
}
/******************显示棋子*****************/
void showqi(int p)
{
int i,j,k,m;
int a[N],b[N];
FILE *fp;
fp=fopen("wuzi_list","rb");
for(i=1;i<=N;i++)
{
fread(&wei[i],sizeof(struct zuobiao),1,fp);
a[i]=wei[i].x[i];
b[i]=wei[i].y[i];
}
for(m=1;m<p;m++)
{
while(wei[p].x[p]==a[m]&&wei[p].y[p]==b[m])
{
printf("错误!\n");
wei[p].x[p]=zouqihang();
wei[p].y[p]=zouqilie();
m=1;
}
}
for(i=0;i<N;i++)
{
printf("%d",i);
printf(" ");
}
printf("\n");
for(i=1;i<N;i++)
{
for(j=1;j<N;j++)
{
if(j==1)
printf("%d",i);
for(k=1;k<=p;k++)
{
if(i==wei[k].x[k]&&j==wei[k].y[k])
{
if(k%2==1)
{printf("○");
break;}
else if(k%2==0)
{printf("●");
break;}
}
}
if(k>p)printf("·");
else continue;
}
printf("\n");
}
}
/******************走棋行*****************/
int zouqihang()
{
int x;
printf("请输入要走棋子所在行数!\n");
printf("x=");
scanf("%d",&x);
while(x>N-1||x<1)
{
printf("错误!\n");
printf("请输入要走棋子所在行数!\n");
printf("x=");
scanf("%d",&x);
}
return x;
}
/******************走棋列*****************/
int zouqilie()
{
int y;
printf("请输入要走棋子所在列数!\n");
printf("y=");
scanf("%d",&y);
while(y>N-1||y<1)
{
printf("错误!\n");
printf("请输入要走棋子所在列数!\n");
printf("y=");
scanf("%d",&y);
}
return y;
}
/******************文件保存*****************/
void save(int i)
{
FILE *fp;
fp=fopen("wuzi_list","wb");
fwrite(&wei[i],sizeof(struct zuobiao),1,fp);
}
/****************判断输赢*******************/
void panan(int p)
{
int i,j,k[8]={1,1,1,1,1,1,1,1,};
int a[N],b[N];
FILE *fp;
fp=fopen("wuzi_list","rb");
for(i=1;i<=p;i++)
{
fread(&wei[i],sizeof(struct zuobiao),1,fp);
a[i]=wei[i].x[i];
b[i]=wei[i].y[i];
}
/*****************判断行******************/
for(i=1;i<=p;i++)
{
if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j])&&(b[i]==b[j]-1))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-2))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-3))
{
k[0]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-4))
{
k[0]++;
continue;
}
else if(k[0]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[0]==5)
break;
k[0]=1;
}
else if(k[0]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j])&&(b[i]==b[j]-1))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-2))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-3))
{
k[1]++;
continue;
}
else if((a[i]==a[j])&&(b[i]==b[j]-4))
{
k[1]++;
continue;
}
else if(k[1]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[1]==5)
break;
k[1]=1;
}
}
/**********************判断列************************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]))
{
k[2]++;
continue;
}
else if(k[2]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[2]==5)
break;
k[2]=1;
}
else if(k[2]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]))
{
k[3]++;
continue;
}
else if(k[3]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[3]==5)
break;
k[3]=1;
}
}
/****************判断对角(左上-右下)******************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5||k[2]==5||k[3]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]-1))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]-2))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]-3))
{
k[4]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]-4))
{
k[4]++;
continue;
}
else if(k[4]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[4]==5)
break;
k[4]=1;
}
else if(k[2]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]-1)&&(b[i]==b[j]-1))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-2)&&(b[i]==b[j]-2))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-3)&&(b[i]==b[j]-3))
{
k[5]++;
continue;
}
else if((a[i]==a[j]-4)&&(b[i]==b[j]-4))
{
k[5]++;
continue;
}
else if(k[5]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[5]==5)
break;
k[5]=1;
}
}
/**********判断对角(左下-右上)************/
for(i=1;i<=p;i++)
{
if(k[0]==5||k[1]==5||k[2]==5||k[3]==5||k[4]==5||k[5]==5)
break;
else if(i%2==1)
{
for(j=1;j<=p;j=j+2)
{
if((a[i]==a[j]+1)&&(b[i]==b[j]-1))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+2)&&(b[i]==b[j]-2))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+3)&&(b[i]==b[j]-3))
{
k[6]++;
continue;
}
else if((a[i]==a[j]+4)&&(b[i]==b[j]-4))
{
k[6]++;
continue;
}
else if(k[6]==5)
{
printf("Player 1 wins!!!\n");
}
else
continue;
}
if(k[6]==5)
break;
k[6]=1;
}
else if(k[6]==5)
break;
else if(i%2==0)
{
for(j=2;j<=p;j=j+2)
{
if((a[i]==a[j]+1)&&(b[i]==b[j]-1))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+2)&&(b[i]==b[j]-2))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+3)&&(b[i]==b[j]-3))
{
k[7]++;
continue;
}
else if((a[i]==a[j]+4)&&(b[i]==b[j]-4))
{
k[7]++;
continue;
}
else if(k[7]==5)
{
printf("Player 2 wins!!!\n");
}
else
continue;
}
if(k[7]==5)
break;
k[7]=1;
}
}
}
/****************和棋*******************/
void heqi()
{
printf("平局\n");
}
/****************游戏结束*******************/
void over()
{
printf("游戏结束!!!\n");
}
/****************游戏开始*******************/
void welcome()
{
printf("欢迎使用!!!\n");
}
这个是10x10的,你改一下了就行 别忘了给分哦
‘柒’ 象棋对弈软件是如何编制出来的
呵呵,开始我也觉得没有破绽,后来发现了软件也会出昏招。原来原理很简单,只是把基本的开局定式以及常见的对弈拆解局面转换成数据库函数,当出现数据库招数,便调出同类型的宏功能。说到底,只是电脑软件做到了更多的对弈棋局收集,把相关的招数进行了数码汇编。比如:仙人指路开局,软件就会自动把存储在数据库中的符合这一定式类型的所有函数自动调出,选择基本应招(根据用户选手游戏难度不同,软件也会选择相应招数致胜比率和复杂程度)。所以按一般局面和软件玩,就等于和一个熟读兵法的谋士作战,很难赢。你会有看不透,想不到的时候,软件按步就班,数据库就是它的眼睛和脑袋。但是编制软件的并不是一流大师,他们手头上有的都是找得到的棋局,但是棋盘千变万化,有很多招式不可能存在软件中,所以软件也会碰到出昏招的时候。我们可以做一个小实验,两台电脑玩相同的象棋游戏,如果以A电脑进行先手,B电脑进行后手,以B电脑的招式来和A电脑下。百分之九十九的机率是和棋。如果我们用自己的方式操作B电脑和A电脑进行至中局(有一方有多子优势),然后再让两台电脑自己下,肯定有一台电脑是输的。你就会发现输的电脑下的棋局很一般,因为它还是在以应对的形式开展,试问没有优势的情况下,那台数据库一样的电脑软件会出现奇招嘛?也就是说软件也是会输的。我记得国际象棋那个深蓝也输给过卡斯帕罗夫,然后那个更深的蓝赢了卡斯帕罗夫。还是赢在数据采集啊。
‘捌’ 如何实现五子棋编程 帮忙把代码写给我 加两百分
Option Explicit
'五子棋程序 人机对战版本
'需要2个Label控件 2个CommandButton控件
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
'Dim PlayStep() As String '记录棋谱的数组
'Dim Label2Cap As String
Private Const BoxL As Single = 50, BoxT As Single = 50, BoxW As Single = 25, BoxN As Integer = 18
Dim Table() As Long '棋盘(0-BoxN,0-BoxN) 0-空 1-黑子 2-白子
Dim PsCore() As Long '定义当前玩家桌面空格的分数
Dim CsCore() As Long '定义当前电脑桌面空格的分数
Dim pWin() As Boolean '定义玩家的获胜组合
Dim cWin() As Boolean '定义电脑的获胜组合
Dim pFlag() As Boolean '定义玩家的获胜组合标志
Dim cFlag() As Boolean '定义电脑的获胜组合标志
Dim ThePlayFlag As Boolean '定义游戏有效标志
Private Sub Command1_Click()
If Not ThePlayFlag Then Call InitPlayEnvironment: Exit Sub
If MsgBox("本局还没有下完,是否重新开始?(Y/N)", vbYesNo) = vbNo Then Exit Sub
Call InitPlayEnvironment
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_Load()
Dim i As Long, lw As Long, lh As Long
'Label2Cap = "000 黑方 行 00 列 00"
Me.Width = 10815: Me.Height = 8040
' Me.Caption = "五子棋 - 人机对战": Me.Show
lw = Me.Width \ Screen.TwipsPerPixelX: lh = Me.Height \ Screen.TwipsPerPixelY
SetWindowRgn Me.hWnd, CreateRoundRectRgn(0, 0, lw, lh, 60, 60), True
With Label1
.Alignment = vbCenter: .FontSize = 12: .FontBold = True
.ForeColor = vbRed: .BackStyle = 0: .AutoSize = True: .Move 8910, 510
End With
Label2.AutoSize = True: Label2.WordWrap = True
Label2.BackStyle = 0: Label2.Move 8040, 1050, 2280
Command1.Move 8025, 7035, 1020, 435: Command1.Caption = "再来一局"
Command2.Move 9300, 7035, 1020, 435: Command2.Caption = "不玩了"
Call DrawChessBoard: Me.FillStyle = 0: Call InitPlayEnvironment
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
End
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim iRow As Long, iCol As Long, i As Long, k As Long, t As String
If Not ThePlayFlag Then Exit Sub
If Button = vbLeftButton Then '左键下棋
iRow = -1: iCol = -1
For i = 0 To BoxN '鼠标必须落在交叉点 半径10以内 若是则给出行列号
If (Y + 10) > (BoxT + i * BoxW) And (Y - 10) <= (BoxT + i * BoxW) Then iRow = i
If (X + 10) > (BoxL + i * BoxW) And (X - 10) <= (BoxL + i * BoxW) Then iCol = i
Next
If (iRow = -1) Or (iCol = -1) Then Beep: Exit Sub
If Table(iCol, iRow) > 0 Then Exit Sub
Table(iCol, iRow) = 2: Label1.Caption = "下一步 黑方"
Me.FillColor = vbWhite: Me.Circle (iCol * BoxW + BoxT, iRow * BoxW + BoxL), 8
For i = 0 To UBound(cWin, 3)
If cWin(iCol, iRow, i) = True Then cFlag(i) = False
Next
Call CheckWin: Call DianNao '检查当前玩家是否获胜 调用电脑算法
End If
End Sub
Public Sub InitPlayEnvironment()
'*****************************************************************************
' 模块名称: InitPlayEnvironment [初始化过程]
'
' 描述: 1. 设置背景音乐。 2. 设置游戏状态有效。
' 3. 初始化游戏状态标签。 4. 直接指定电脑的第一步走法。
' 5. 初始化基本得分桌面。 6. 电脑和玩家获胜标志初始化。
' 7. 初始化所有获胜组合。 8. 重新设定玩家的获胜标志。
'*****************************************************************************
Dim i As Long, j As Long, m As Long, n As Long
ThePlayFlag = True: Label1.Caption = "下一步 白方": Label2.Caption = ""
Me.FillColor = vbBlack: Me.FillStyle = 0: Me.AutoRedraw = True
Me.Cls: Me.Circle (9 * BoxW + BoxL, 9 * BoxW + BoxT), 8
ReDim Table(0 To BoxN, 0 To BoxN) As Long
ReDim pFlag(NumsWin(BoxN + 1) - 1) As Boolean
ReDim cFlag(UBound(pFlag)) As Boolean
ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long
ReDim pWin(BoxN, BoxN, UBound(pFlag)) As Boolean
ReDim cWin(BoxN, BoxN, UBound(pFlag)) As Boolean
For i = 0 To UBound(pFlag): pFlag(i) = True: cFlag(i) = True: Next
Table(9, 9) = 1 '假定电脑先手 并下了(9, 9)位 将其值设为1
'******** 初始化获胜组合 ****************************************
For i = 0 To BoxN: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(j + m, i, n) = True: cWin(j + m, i, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(i, j + m, n) = True: cWin(i, j + m, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN - 4: For j = 0 To BoxN - 4
For m = 0 To 4
pWin(j + m, i + m, n) = True: cWin(j + m, i + m, n) = True
Next
n = n + 1
Next: Next
For i = 0 To BoxN - 4: For j = BoxN To 4 Step -1
For m = 0 To 4
pWin(j - m, i + m, n) = True: cWin(j - m, i + m, n) = True
Next
n = n + 1
Next: Next
'******** 初始化获胜组合结束 *************************************
For i = 0 To UBound(pWin, 3) '由于电脑已下了(9, 9)位 所以需要重新设定玩家的获胜标志
If pWin(9, 9, i) = True Then pFlag(i) = False
Next
End Sub
Public Function DrawChessBoard() As Long
'容器的(BoxL, BoxT)为左上角坐标画一个 BoxN*BoxN, 每格边长为 BoxW 象素的棋盘
Dim i As Long, j As Long, cx As Long, cy As Long
Me.ScaleMode = 3: Me.FillStyle = 1: Me.AutoRedraw = True: Me.Cls
For i = 0 To BoxN '画棋盘
Me.Line (BoxL + i * BoxW, BoxT)-(BoxL + i * BoxW, BoxT + BoxN * BoxW)
Me.Line (BoxL, BoxT + i * BoxW)-(BoxL + BoxN * BoxW, BoxT + i * BoxW)
Me.CurrentX = BoxL + i * BoxW - IIf(i > 9, 6, 2)
Me.CurrentY = BoxT - 20: Me.Print Format(i)
Me.CurrentX = BoxL - IIf(i > 9, 23, 20)
Me.CurrentY = BoxT + i * BoxW - 6: Me.Print Format(i)
Next
For i = 3 To 16 Step 6: For j = 3 To 16 Step 6 '画小标志
cx = BoxL + j * BoxW - 3: cy = BoxT + i * BoxW - 3
Me.Line (cx, cy)-(cx + 6, cy + 6), , B
Next: Next
Me.AutoRedraw = False: Set Me.Picture = Me.Image
End Function
Public Sub CheckWin()
'*****************************************************************************
' 模块名称: CheckWin [获胜检查算法]
'
' 描述: 1. 检查是否和棋。 2. 检查电脑是否获胜。 3. 检查玩家是否获胜。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim cA As Long, pA As Long, cN As Long
For i = 0 To UBound(cFlag): cN = IIf(cFlag(i) = False, cN + 1, cN): Next
If cN = UBound(cFlag) - 1 Then '设定和棋规则
Label1.Caption = "双方和棋!": ThePlayFlag = False: Exit Sub
End If
For i = 0 To UBound(cFlag) '检查电脑是否获胜
If cFlag(i) = True Then
cA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cA = cA + 1
Next: Next
If cA = 5 Then Label1.Caption = "电脑获胜!": ThePlayFlag = False: Exit Sub
End If
Next
For i = 0 To UBound(pFlag) '检查玩家是否获胜
If pFlag(i) = True Then
pA = 0: For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pA = pA + 1
Next: Next
If pA = 5 Then Label1.Caption = "玩家获胜!": ThePlayFlag = False: Exit Sub
End If
Next
End Sub
Public Sub DianNao()
'*****************************************************************************
' 模块名称: DianNao [电脑算法]
' 描述: 1. 初始化赋值系统。 2. 赋值加强算法。 3. 计算电脑和玩家的最佳攻击位。
' 4. 比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。 5. 执行检查获胜函数。
'*****************************************************************************
Dim i As Long, j As Long, k As Long, m As Long, n As Long
Dim Dc As Long, cAb As Long, pAb As Long
ReDim PsCore(BoxN, BoxN) As Long, CsCore(BoxN, BoxN) As Long '初始化赋值数组
'******** 电脑加强算法 ********
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
cAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 1 And cWin(j, k, i) = True Then cAb = cAb + 1
Next: Next
Select Case cAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then CsCore(m, n) = CsCore(m, n) + 5
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And cWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next
For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
pAb = 0
For j = 0 To BoxN: For k = 0 To BoxN
If Table(j, k) = 2 And pWin(j, k, i) = True Then pAb = pAb + 1
Next: Next
Select Case pAb
Case 3
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then PsCore(m, n) = PsCore(m, n) + 30
Next: Next
Case 4
For m = 0 To BoxN: For n = 0 To BoxN
If Table(m, n) = 0 And pWin(m, n, i) = True Then
Table(m, n) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (m * BoxW + BoxL, n * BoxW + BoxT), 8
For Dc = 0 To UBound(pWin, 3)
If pWin(m, n, Dc) = True Then pFlag(Dc) = False: Call CheckWin: Exit Sub
Next
End If
Next: Next
End Select
End If
Next
'******** 电脑加强算法结束 ********
'******** 赋值系统 ****************
For i = 0 To UBound(cFlag)
If cFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And cWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 1) And cWin(m, n, i) Then CsCore(j, k) = CsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next
For i = 0 To UBound(pFlag)
If pFlag(i) = True Then
For j = 0 To BoxN: For k = 0 To BoxN
If (Table(j, k) = 0) And pWin(j, k, i) Then
For m = 0 To BoxN: For n = 0 To BoxN
If (Table(m, n) = 2) And pWin(m, n, i) Then PsCore(j, k) = PsCore(j, k) + 1
Next: Next
End If
Next: Next
End If
Next
'******** 赋值系统结束 ************
'******** 分值比较算法 ************
Dim a As Long, b As Long, c As Long, d As Long
Dim cS As Long, pS As Long
For i = 0 To BoxN: For j = 0 To BoxN
If CsCore(i, j) > cS Then cS = CsCore(i, j): a = i: b = j
Next: Next
For i = 0 To BoxN: For j = 0 To BoxN
If PsCore(i, j) > pS Then pS = PsCore(i, j): c = i: d = j
Next: Next
If cS > pS Then
Table(a, b) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (a * BoxW + BoxL, b * BoxW + BoxT), 8
For i = 0 To UBound(pWin, 3)
If pWin(a, b, i) = True Then pFlag(i) = False
Next
Else
Table(c, d) = 1: Label1.Caption = "下一步 白方"
Me.FillColor = vbBlack: Me.Circle (c * BoxW + BoxL, d * BoxW + BoxL), 8
For i = 0 To UBound(pWin, 3)
If pWin(c, d, i) = True Then pFlag(i) = False
Next
End If
'******** 分值比较算法结束 ********
Call CheckWin
End Sub
Public Function NumsWin(ByVal n As Long) As Long
'根据输入的棋盘布局 n*n 计算总共有多少种获胜组合
'假定棋盘为 10 * 10 相应的棋盘数组就是 Table(9, 9)
'水平方向 每一列获胜组合是6 共10列 6*10=60
'垂直方向 每一行获胜组合是6 共10行 8*10=60
'正对角线方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'反对角线方向 6 + (5 + 4 + 3 + 2 + 1) * 2 = 36
'总的获胜组合数为 60 + 60 + 36 + 36 = 192
Dim i As Long, t As Long
For i = n - 5 To 1 Step -1: t = t + i: Next
NumsWin = 2 * (2 * t + n - 4) + 2 * n * (n - 4)
End Function