using System.Reflection;
using System.Runtime.CompilerServices;
//
// 有关程序集的常规信息是通过下列
// 属性集控制的。更改这些属性值可修改与程序集
// 关联的信息。
//
[assembly: AssemblyTitle("FiveStones")]
[assembly: AssemblyDescription("这是一个用C#编写的五子棋程序。")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("二十四画生")]
[assembly: AssemblyProduct("C#版五子棋")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//
// 程序集的版本信息由下列 4 个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 您可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值,方法是按
// 如下所示使用 '*':
[assembly: AssemblyVersion("1.0.1")]
//
// 要对程序集进行签名,必须指定要使用的密钥。有关程序集签名的更多信息,请参考
// Microsoft .NET Framework 文档。
//
// 使用下面的属性控制用于签名的密钥。
//
// 注意:
// (*) 如果未指定密钥,则程序集不会被签名。
// (*) KeyName 是指已经安装在计算机上的
// 加密服务提供程序(CSP)中的密钥。KeyFile 是指包含
// 密钥的文件。
// (*) 如果 KeyFile 和 KeyName 值都已指定,则
// 发生下列处理:
// (1) 如果在 CSP 中可以找到 KeyName,则使用该密钥。
// (2) 如果 KeyName 不存在而 KeyFile 存在,则
// KeyFile 中的密钥安装到 CSP 中并且使用该密钥。
// (*) 要创建 KeyFile,可以使用 sn.exe(强名称)实用工具。
// 在指定 KeyFile 时,KeyFile 的位置应该相对于
// 项目输出目录,即
// %Project Directory%\obj\<configuration>。例如,如果 KeyFile 位于
// 该项目目录,应将 AssemblyKeyFile
// 属性指定为 [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// (*) “延迟签名”是一个高级选项 - 有关它的更多信息,请参阅 Microsoft .NET Framework
// 文档。
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]
using System;
namespace FiveStones
{
/// <summary>
/// Computer 的摘要说明。
/// 电脑类。计算电脑下棋的位置
/// </summary>
public class Computer
{
private bool mflag; //区别电脑是下黑棋还是下白棋
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)
{
//权值数组
int [,] qz = new int[15,15];
//基本思路:先计算每个点的权值,在权值最高的位置下棋
for (int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
if (arrchessboard[i,j] < 2)
{
qz[i,j] = -1; //当已有子时标注为-1
}
else
{
qz[i,j] = Check(i,j,arrchessboard);
}
}
}
//找出权值最大的点
MaxQZ(qz);
//先不考虑智能问题,只管下棋的地方无子
//Random r = new Random();
//x = r.Next(0,14);
//y = r.Next(0,14);
}
/// <summary>
/// 找出权值最大点
/// </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点的权值
/// </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;
//找自己的取胜点(1000)
int w1 = 100000;
//找对手的取胜点(80)
int w2 = 50000;
//找自己的三个相连的点(60)
int w3 = 10000;
//找对手的三个相连的点(40)
int w4 = 5000;
//找自己的两个相连的点(20)
int w5 = 1000;
//找对手的两个相连的点(10)
int w6 = 500;
//找自己的相连的点(5)
int w7 = 100;
//找对方的相连的点(5)
int w8 = 50;
//找自己的失败点
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);
//中心点权值加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;
}
//如果我方为黑棋,还要检查失败点
if (mflag)
{
if (Rule.IsFail(arrf, arrchessboard[m,n])>0)
{
qz += w9;
}
}
}
//如果该位置下对方的子
if (mflag)
{
//对方白子
arrchessboard[m,n] = 1;
}
else
{
//对方黑子
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;
}
}
//数组好像是引用传递,探测完后恢复到默认值
arrchessboard[m,n] = 2;
return qz;
}
}
}
using System;
namespace FiveStones
{
/// <summary>
/// Rule 的摘要说明。
/// 游戏规则类
/// </summary>
public class Rule
{
/// <summary>
/// 判断下棋位置是否有子
/// </summary>
/// <param name="m"></param>
/// <param name="n"></param>
/// <param name="arrchessboard"></param>
/// <returns></returns>
public static bool IsExist(int m, int n, int[,] arrchessboard)
{
if (arrchessboard[m,n] < 2)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 返回结果(1:双三禁手失败/2:双四禁手失败/3:长连禁手失败/4:胜利/5:平局/6:继续)
/// </summary>
/// <param name="m"></param>
/// <param name="n"></param>
/// <param name="arrchessboard"></param>
/// <returns></returns>
public static int Result(int m, int n, int[,] arrchessboard)
{
//m,n点四个方向的连子数,依次正东正西,正南正北方,西北东南,西南东北
int[] arrf = new int[4];
arrf[0] = Xnum(m,n,arrchessboard);
arrf[1] = Ynum(m,n,arrchessboard);
arrf[2] = YXnum(m,n,arrchessboard);
arrf[3] = XYnum(m,n,arrchessboard);
//测试
//return Ynum(m,n,arrchessboard);
//检查是否失败
if (IsFail(arrf, arrchessboard[m,n]) > 0)
{
return IsFail(arrf, arrchessboard[m,n]);
}
else
{
//检查是否胜利
if (IsWin(arrf))
{
return 4;
}
else
{
//检查是否平局
if (IsTie(arrchessboard))
{
return 5;
}
else
{
return 6;
}
}
}
}
#region 检查是否失败,是否胜利,是否平局
/// <summary>
/// 是否失败(0:没有失败/1:双三禁手/2:双四禁手/3:长连禁手)
/// </summary>
/// <param name="arr"></param>
/// <param name="stoneflag">是黑棋还是白棋</param>
/// <returns>没有失败:0/双三禁手:1/双四禁手:2/长连禁手:3</returns>
public static int IsFail(int[] arr, int stoneflag)
{
if (stoneflag == 1)
{
//如果是白棋不验证因为白棋无禁手
return 0;
}
else
{
//验证双三禁手(该处的双三因该是活的双三吧)
int num = 0; //活的3子相连的个数
for (int i=0;i<4;i++)
{
if (arr[i] == 3)
{
num++;
}
}
if (num > 1)
{
return 1;
}
//验证双四禁手(该处的双四因该是活的双四吧)
num = 0; //活的4子相连的个数
for (int i=0;i<4;i++
wuziqi.rar_c 五子棋_五子棋
版权申诉
72 浏览量
2022-09-21
08:12:34
上传
评论
收藏 8KB RAR 举报
Kinonoyomeo
- 粉丝: 74
- 资源: 1万+
最新资源
- Qt开发知识、经验总结 包括Qss,数据库,Excel,Model/View等
- IV数据.xlsx
- foldcraftlauncher_262944.apk
- 珍藏多年的基于matlab实现潮流计算程序源代码集合,包含多个潮流计算程序.rar
- 使用FPGA实现串-并型乘法器
- 基于matlab实现针对基于双曲线定位的DV-Hop算法中误差误差出一种基于加权双曲线定位的DV-Hop改进算法.rar
- 基于matlab实现由遗传算法开发的整数规划,车辆调度问题.rar
- 电视家7.0(对电视配置要求高).apk
- 免费计算机毕业设计-基于JavaEE的医院病历管理系统设计与实现(包含论文+源码)
- 手机端 我的世界融合植物大战僵尸版.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈