?? computer.cs
字號(hào):
using System;
namespace FiveStones
{
/// <summary>
/// Computer 的摘要說明。
/// 電腦類。計(jì)算電腦下棋的位置
/// </summary>
public class Computer
{
private bool mflag; //區(qū)別電腦是下黑棋還是下白棋
private int x; //電腦下子的位置
private int y; //電腦下子的位置
public Computer(bool flag)
{
mflag = flag;
}
public int X
{
get
{
return x;
}
}
public int Y
{
get
{
return y;
}
}
/// <summary>
/// 電腦下棋
/// </summary>
/// <param name="arrchessboard"></param>
public void Down(int[,] arrchessboard)
{
//權(quán)值數(shù)組
int [,] qz = new int[15,15];
//基本思路:先計(jì)算每個(gè)點(diǎn)的權(quán)值,在權(quán)值最高的位置下棋
for (int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if (arrchessboard[i,j] < 2)
{
qz[i,j] = -1; //當(dāng)已有子時(shí)標(biāo)注為-1
}
else
{
qz[i,j] = Check(i,j,arrchessboard);
}
}
}
//找出權(quán)值最大的點(diǎn)
MaxQZ(qz);
//先不考慮智能問題,只管下棋的地方無子
//Random r = new Random();
//x = r.Next(0,14);
//y = r.Next(0,14);
}
/// <summary>
/// 找出權(quán)值最大點(diǎn)
/// </summary>
/// <param name="qz"></param>
private void MaxQZ(int [,] qz)
{
int max = 0;
for (int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if (qz[i,j]>max)
{
x = i;
y = j;
max = qz[i,j];
}
}
}
}
/// <summary>
/// 檢查m,n點(diǎn)的權(quán)值
/// </summary>
/// <param name="m"></param>
/// <param name="n"></param>
/// <param name="arrchessboard"></param>
/// <returns></returns>
private int Check(int m, int n, int[,] arrchessboard)
{
int qz = 0;
//找自己的取勝點(diǎn)(1000)
int w1 = 100000;
//找對(duì)手的取勝點(diǎn)(80)
int w2 = 50000;
//找自己的三個(gè)相連的點(diǎn)(60)
int w3 = 10000;
//找對(duì)手的三個(gè)相連的點(diǎn)(40)
int w4 = 5000;
//找自己的兩個(gè)相連的點(diǎn)(20)
int w5 = 1000;
//找對(duì)手的兩個(gè)相連的點(diǎn)(10)
int w6 = 500;
//找自己的相連的點(diǎn)(5)
int w7 = 100;
//找對(duì)方的相連的點(diǎn)(5)
int w8 = 50;
//找自己的失敗點(diǎn)
int w9 = -1000000;
int[] arrf = new int[4];
//如果該位置下我方的子
if (mflag)
{
//我方黑子
arrchessboard[m,n] = 0;
}
else
{
//我方白子
arrchessboard[m,n] = 1;
}
arrf[0] = Rule.Xnum(m,n,arrchessboard);
arrf[1] = Rule.Ynum(m,n,arrchessboard);
arrf[2] = Rule.YXnum(m,n,arrchessboard);
arrf[3] = Rule.XYnum(m,n,arrchessboard);
//中心點(diǎn)權(quán)值加1
if (m==7 && n==7){qz+=1;}
for (int i=0;i<4;i++)
{
if (Math.Abs(arrf[i]) == 5)
{
qz += w1;
}
if (arrf[i] == 4)
{
qz += w3;
}
if (arrf[i] == 3)
{
qz += w5;
}
if (arrf[i] == 2)
{
qz += w7;
}
//如果我方為黑棋,還要檢查失敗點(diǎn)
if (mflag)
{
if (Rule.IsFail(arrf, arrchessboard[m,n])>0)
{
qz += w9;
}
}
}
//如果該位置下對(duì)方的子
if (mflag)
{
//對(duì)方白子
arrchessboard[m,n] = 1;
}
else
{
//對(duì)方黑子
arrchessboard[m,n] = 0;
}
arrf[0] = Rule.Xnum(m,n,arrchessboard);
arrf[1] = Rule.Ynum(m,n,arrchessboard);
arrf[2] = Rule.YXnum(m,n,arrchessboard);
arrf[3] = Rule.XYnum(m,n,arrchessboard);
for (int i=0;i<4;i++)
{
if (Math.Abs(arrf[i]) == 5)
{
qz += w2;
}
if (arrf[i] == 4)
{
qz += w4;
}
if (arrf[i] == 3)
{
qz += w6;
}
if (arrf[i] == 2)
{
qz += w8;
}
}
//數(shù)組好像是引用傳遞,探測完后恢復(fù)到默認(rèn)值
arrchessboard[m,n] = 2;
return qz;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -