前言

业余闲暇时,基于.netframework使用C#语言开发了一个五子棋人机对战的游戏,在此做些整理和分享,先上图。

winform版

UI虽然很简洁,却花了些功夫,图形元素全动态生成,毕竟不是美工专业,做成这个效果就算及格了。本程序涉及的主要技术点:winform、GDI绘图、多线程。

计算机执白获胜。

wpf版

程序采用前后端分离设计,UI界面很容易切换。在换成wpf界面后,效果好一些了。如下:

算法概述

1、点位标记及序列串的定义:
在五子棋点阵中,我们可以将对方点位记作“x”,己方点位记作“o”,空缺点位记作“_”。
那么点阵的每一行、每一列以及每一条斜线,都可以得到一个序列串。
在19×19点阵中共有多少序列串呢,我们来数一数。横向19+纵向19+斜线(18+19)+斜线(18+19)=112,减去4个角上共4×4=16个没有意义的序列串,那就是112-16=96个。
2、获取序列串的集合:
封装一个方法,计算得到当前棋局中所有96个序列串,放到一个List中,返回这个List,后面计算分数要用。
3、为不同的棋形设置分值:
棋形和分值的设计非常重要,它会直接影响到程序运行的智能效果。在经历无数次的测试之后,我设计的棋形分值如下图所示:

4、计算总分数:
将以上设计的棋形,放到序列串的List中逐一去匹配查找,计算当前棋局下黑方或白方的总分数。一个序列串中可能会包含多种棋形,将分数累加即可。将计算总分的算法封装起来,参数是(二维点阵、要计算的棋子颜色),返回int型分数。
5、寻找最优点位:
让程序遍历每一个空缺的点位,在每个点位假设下一颗己方棋子之后,计算己方和对方的各自的得分。另外,需要计算如果当前点位被对方占用,那么对方的得分将会是多少,以此判断是否需要先占用这个点位。将所有得分计算完后,就需要找到一个最优解。要注意,己方得分最高的点位,不一定就是最优解。我的判断顺序是:
1、按己方得分从大到小排列,在占用当前点位后,是否可以直接五连珠获胜,是则确定当前点位;
2、按己方得分从大到小排列,在占用当前点位后,是否阻断了对方的五连珠(对方已四连珠),是则确定当前点位;
3、按己方得分从大到小排列,在占用当前点位后,是否可以四连珠且两端空缺(必杀),是则确定当前点位;
4、按己方得分从大到小排列,在占用当前点位后,最高得分点是否可以让对方必须防守,是则确定当前点位;
5、如果对方最高分超出需要防守的分,则按对方得分从小到大排列,在占用当前点位后,己方得分是否高于对方得分,是则确定当前点位;
6、如果当前点位被对方占用后,对方是否会形成多支交叉的无解局面,是则确定当前点位;
7、如果以上都不满足,则取己方得分最高的点位;
以上大致就是取最优解的流程。
经过测试后发现,想要战胜这套算法是非常困难的,不信可以下载我的源码试试哈。算法应该可以进一步优化,欢迎批评指正共同探讨。
代码的运行效率考验开发人员的编码水平。我在程序后台开了一个线程作为计算机棋手,运行速度是很快的,几乎不用等待。

源码下载:

下载源码:https://download.csdn.net/download/hyq106/85186055
(提醒:源码是winform版的,下载后可联系本人赠送wpf版源码)

C#实现五子棋人机对战的思路与源码分享相关推荐

  1. python删除链表中重复的节点_Java编程删除链表中重复的节点问题解决思路及源码分享...

    一. 题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 二. 例子 输入链表:1->2->3->3->4->4-&g ...

  2. C#实现数独解题及随机出题的思路及源码分享

    前言 业余闲暇时,把若干年前还是开发小白时写的数独解题算法拿出来整理一下,顺带做些优化,并在此做些分享. 数独有多种,这里只说9乘9的数独,来看本篇幅的人相信都知道怎么玩. 话不多说,先上图,UI简洁 ...

  3. java 生成 防伪码,C#生成防伪码的思路及源码分享

    摘 要 1. 生成多个防伪码,防伪码的长度和个数由用户指定. 2. 防伪码由"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"字符组成,生成的防伪码不可以重复 ...

  4. vue + elemen可远程搜索select选择器的封装(思路及源码分享)

    目录 项目场景: 效果 1.封装下拉列表 2.页面中使用 项目场景: 我有很多的Form表单,在Form表单内又有很多的select选择器,这些选择器的下拉列表都是通过后端的接口传回的数据渲染的,如果 ...

  5. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

  6. 人工智能 - 五子棋人机对战

    人工智能 - 五子棋人机对战 作者: jig    阅读人次: 6635    文章来源:本站原创    发布时间:2007-7-12     网友评论(8)条 原帖及讨论:http://bbs.bc ...

  7. 五子棋人机对战_10.带人机对战的五子棋程序

    今天我们带来一个带人机对战功能的五子棋程序.程序基于前面文章中的框架搭建,新增人机对战的策略.程序基于规则进行决策,不考虑禁手,玩家执黑子先行.棋盘规模采用15乘15,棋盘规模容易扩展,程序棋力中等, ...

  8. C语言 AI智能,五子棋 人机对战,人人对战

    C语言五子棋,人机对战,人人对战 chunli@Linux:~$ cat main.c # include<stdio.h> # include<string.h> # inc ...

  9. 五子棋服务端程序java_9网上五子棋对战(java)服务端源码

    9网上五子棋对战(java)服务端源码 网上五子棋对战(java)服务端源码 /* 五子棋游戏是本人在学习java swing时写的一个程序,程序分两部分:服务器端和客户端.运行程序时先运行服务器端, ...

最新文章

  1. 数据结构与算法:16 Leetcode同步练习(六)
  2. 邮件客户端WebMail Pro v7.7.5发布,在线订购限时75折优惠!
  3. The server time zone value
  4. 45 jump game II(贪心)
  5. Android 关于ListView中按钮监听的优化问题(方法二)
  6. 了解linux服务器,教你快速了解一台Linux系统服务器的方法
  7. HDU-4902-Nice boat
  8. P4300-[AHOI2006]上学路线【网络流,最短路】
  9. lm_license_file 冲突怎么办_【微课+语音】孩子一个多月没有上学了怎么办?
  10. Matlab实现批量修改文件名
  11. 原理图端口符号_何为电气原理图和接线图?
  12. HTML CSS 个人网页设计 WEB前端大作业代码
  13. 黑苹果长期维护机型整理清单
  14. C# Revit二次开发
  15. lenovo服务器换系统重装系统_联想服务器重装系统教程
  16. 市场上的智能语音助理,主要的工作原理是什么?
  17. vue.js 动态合并单元格问题
  18. python连接access数据库未找到提供程序_连接ACCESS数据库时未找到提供程序.该程序可能未正确安装的解决...
  19. 数据采集和用户留存分析
  20. linux版本、查找、重启等命令

热门文章

  1. FFmpeg学习之视频像素和尺寸转换
  2. PAT 1033 旧键盘打字 (20 分) C++
  3. 【提问的智慧】学会提问:有效的提问能够直击问题的本质
  4. 神经网络上采样的方法
  5. bugku 杂项 宽带信息泄露
  6. 珊瑚虫QQ不显对方IP的故障排除
  7. 直播有哪些技巧?分享7个常见技巧
  8. python语言如何画圆_怎么用python画圆
  9. 循环中频繁查询数据库优化
  10. 个人计算机称为pc属于,个人计算机缩写为PC,这种计算机属于().