夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> Asp.net专题(WCF/WPF/WF)
c#五子棋开发
夜鹰教程网 来源:www.yyjcw.com 日期:2016-11-2 0:00:00
该五子棋程序是参照2004年11期《开发高手》上的五子棋开发专题改进的。现在的1.0.0版只有人机对战的部分。整个程序共有4个主要的类:Chessboard类用来绘制棋盘,控制下棋等操作;Computer类主要是电脑人工智能方面;Rule类用来判断输赢的规则方面;Stone类用来绘制棋子。 
前天发表的一片《人民币大写转化函数(C#版)》的随笔效果还不错,在大家的热烈讨论中我也学到了不少知识。现在把我最近刚完成的一个五子棋程序共享给大家希望能同样达到抛砖引玉的效果。
  该五子棋程序是参照2004年11期《开发高手》上的五子棋开发专题改进的。现在的1.0.0版只有人机对战的部分。整个程序共有4个主要的类:Chessboard类用来绘制棋盘,控制下棋等操作;Computer类主要是电脑人工智能方面;Rule类用来判断输赢的规则方面;Stone类用来绘制棋子。
  基本思路:电脑下子时先检查未落子点的权值,在权值最高的位置下棋。如果要提高人工智能,可用探索回溯的方法多搜索几步,在比较那点权值最高。
  检查m,n点的权值的方法:
        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;
        }


  关于如何让电脑下的棋子闪动几秒的方法我还没有想到,希望大家帮忙想想。如有Bug也请大家多多指出。
  不多说了大家下源码自己看吧:FiveStones(v1.0.0).rar
版本:FiveStones(v1.0.1).rar(将最后一步棋上标示了小三角)

 

==========================================

作者:二十四画生

出处: http://esshs.cnblogs.com/

转载请注明来源于博客园——二十四画生的Blog,并保留有原文链接。

复制链接 网友评论 收藏本文 关闭此页
上一条: .net常见概念汇总  下一条: GDI+双缓冲解决重绘图形界面闪烁问题
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
表单提交中get和post方式的区别有…
解决ASP中UTF-8与GB2312编码转换乱…
asp数组中REDIM的用法(动态数组)…
生成html的新方法ASP
ASP字符串函数大全
ASP生成Word文件的代码
ASP中Randomize随机函数的使用
十天学会ASP教程之第一天:安装调…
自定义的asp日期格式化函数
防范ASP网站漏洞的八大法则之一
十天学会ASP教程之第二天:表单传…
asp中关于从utf8页面到gb2312页面…
ASP教程:实现长文章分页功能
IIS6架设网站的问题总结
五分钟打开 allow_url_fopen 的最…
  最近更新
C# Json数据中的特殊字符导致页面…
博客园是有开发博客查询相关的接口…
C#里面的ref和out区别
C#调用API让声卡发出声音
.NET使用反射读取用户自定义的枚举…
.net操作SqlServer数据库增删改查…
如何将WCF服务部署到远程服务器
对WebApi 实现服务端信息的监控
用WCF生成Restful风格的接口返回 …
只有一个地址如何调用WCF服务
WCF简介
搭一个简单的wcf服务
WCF配置说明
WCF传输的数据量过大问题的解决方…
asp.net大文件分块上传文件秒传断…

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3