1。在《leela-zero-next》包中有一个

从人类游戏训练的(较弱的)网络的权重文件(https://sjeng.org/zero/best_v1.txt.zip)(6残差块,128通道)

2。并在《easyx吧》百度贴吧下了一个双人对战的五子棋+围棋的游戏(去掉其中的五子棋部分)。

把这两个合成一个人机对战围棋。

虽然leela-zero也是C++写的,但是我也看不懂,这里只使用其权重,还是按前面的方法生成推演网络。

难点在

(1)围棋界面的部分的数组数据--->转换成网络输入

(2)网络输出--->转换界面落子位

界面部分

流程:

载入一张背景图,在其上画19x19棋盘。

然后在鼠标点位下子(黑白轮流下)(鼠标左键)(任何时都可以双方交换子)

把其中的一方由网络代替

提子要手工提(鼠标右键)

一些变量:

int player_exchange = 0;//玩家轮流下棋
int arr[19][19] = { 0 };//棋盘数组
char str[5];//outtextxy转换字符中间容器
int a, b;//全局变量,记录交叉点位置
int a1, b1, a2, b2;//记录落子时落在数组的什么位置
int x, y;//全局变量,记录交叉点坐标int record_now_player_exchange;//记录刚读档的exchange值,此后exchange就会++
int play_weiqi = 0;//是否选择围棋//-------------------------------------
//人机对战
int jibw=0;//机器选黑白子 白:0,黑:1
vector<int> 顺序黑;//黑方下子序号(在网络图中的序号(也是下子顺序),连接界面和网络用)
vector<int> 顺序白;//白方下子序号

画棋盘:

// 画棋盘
void 画棋盘()
{int i;int j;BeginBatchDraw();IMAGE bk;loadimage(&bk, "围棋背景.jpg", 1100, 1000);//五子棋背景图片putimage(0, 0, 20 * 25 + 130, 121 * 25 - 20, &bk, 0, 0);setlinecolor(BLACK);setlinestyle(PS_SOLID, 1);for (j = 1; j <= 19; j++){line(1 * 25, j * 25, 19 * 25, j * 25);}for (i = 1; i <= 19; i++){line(i * 25, 1 * 25, i * 25, 19 * 25);}//写入下标数字for (i = 1; i <= 19; i++){for (j = 1; j <= 19; j++){setbkmode(0);settextstyle(16, 0, _T("宋体"));settextcolor(BLACK);outtextxy(i * 25 - 6, 19 * 25 + 8, change(i));outtextxy(1 * 25 - 24, j * 25 - 9, change(j));}}//画边框setlinestyle(PS_SOLID, 2);line(1 * 25, 1 * 25, 19 * 25, 1 * 25);line(1 * 25, 19 * 25, 19 * 25, 19 * 25);line(1 * 25, 1 * 25, 1 * 25, 19 * 25);line(19 * 25, 1 * 25, 19 * 25, 19 * 25);setfillcolor(BLACK);//画四个点fillcircle(4 * 25, 4 * 25, 3);fillcircle(16 * 25, 4 * 25, 3);fillcircle(4 * 25, 16 * 25, 3);fillcircle(16 * 25, 16 * 25, 3);fillcircle(10 * 25, 10 * 25, 3);fillcircle(10 * 25, 4 * 25, 3);fillcircle(16 * 25, 10 * 25, 3);fillcircle(10 * 25, 16 * 25, 3);fillcircle(4 * 25, 10 * 25, 3);setbkmode(0);settextstyle(16, 0, _T("宋体"));settextcolor(BLACK);outtextxy(510, 40, "棋子坐标为:");//outtextxy(520, 60, "  行  列");outtextxy(520, 60, "  列  行");outtextxy(510, 100, "该:");outtextxy(510, 130, "白棋步数:");outtextxy(510, 160, "黑棋步数:");outtextxy(510, 190, "围棋规则:");outtextxy(510, 210, "·右键摘子");outtextxy(510, 230, "·玩家判断输赢");//outtextxy(510, 260, "五子棋规则:");outtextxy(510, 280, "按下a:对换子");//outtextxy(510, 350, "按下1:暂停:");//outtextxy(510, 380, "按下2:存档:");//outtextxy(510, 410, "按下3:退出:");//outtextxy(510, 440, "按下4:悔棋:");EndBatchDraw();}

画好的棋盘:

入口:

int main()
{initNet();//载入网络权重initgame();//画棋盘system ("title 围棋");player_down();//游戏循环(人机下子)closegraph();return 0;
}

游戏循环:

//玩家落子 游戏循环
void player_down()
{int i;int j;MOUSEMSG m;//定义一个鼠标变量mhwnd = GetHWnd();while (1){m = GetMouseMsg();//让棋子下在交叉点for (i = 1; i <= 19; i++){for (j = 1; j <= 19; j++){if ((abs(m.x - i * 25)<12) && (abs(m.y - j * 25)<12)){//记录下交叉点的位置a = i;b = j;x = i * 25;y = j * 25;}}}if(player_exchange % 2 ==jibw){if(机器下子())落子();}else{//玩家下子if (m.uMsg == WM_LBUTTONDOWN){huiqi_just_one = 1;//赋值为1,允许悔棋if (arr[a - 1][b - 1] != 0){//MessageBox(hwnd, TEXT("此地已有子,请另择他地!"), "提示:", MB_OK);continue;}cout<<"玩家:"<<a<<","<<b<<endl;  cout<<"序号:"<<(b-1)*19+a-1<<endl;落子();}}//按下右键,清除棋子——围棋规则if (m.uMsg == WM_RBUTTONDOWN){if (arr[a - 1][b - 1]!= 0){arr[a - 1][b - 1] = 0;delete_stone_youjian();continue;}}char ch;//接收键盘的变量hwnd = GetHWnd();while (kbhit()){ch = getch();//玩家和机器对换if (ch == 'a'){if(jibw==0)jibw=1;elsejibw=0;}}}
}

机器下子:

bool 机器下子()
{//黑白子下子顺序到后面//生成最近8步棋数据//走子方8步棋//非走子方8步棋//当前行棋方-----------这些到网络部分 netgo 生成//输入网络//返回落子位bool lu=false;//选点成功吗,不成功可能要当机了(可以加大,5个不够)vector<int> 前5序号;netgo(顺序黑, 顺序白,前5序号);//去网络部分//返回下子序号生成棋盘位置for(int i=0;i<前5序号.size();i++){int xy=前5序号[i];int b0=xy/19;int a0=xy%19;if(arr[a0][b0]== 0){b=b0+1;a=a0+1;cout<<"机:"<<a<<","<<b<<endl;cout<<"序号:"<<xy<<endl;x = a * 25;y = b * 25;lu=true;break;}}return lu;
}

落子并生成下棋顺序:

//落子并生成下棋顺序
void 落子()
{if (player_exchange % 2 == 0){setfillcolor(WHITE);solidcircle(x, y, 8);//此时的a,b就是交叉点的位置a1 = a - 1; b1 = b - 1;arr[a1][b1] = 1;number_white++;//设置图片遮盖字体setfillcolor(YELLOW);solidrectangle(580, 130, 595, 147);//步数solidrectangle(580, 100, 595, 120);//黑,白字solidrectangle(519, 60, 534, 77);//棋子坐标solidrectangle(551, 60, 566, 77);//坐标//setcolor(BLACK);setlinecolor(BLACK);outtextxy(580, 130, change(number_white));outtextxy(564, 100, ":黑");outtextxy(519, 60,change(a1+1));outtextxy(551, 60, change(b1+1));顺序白.push_back(a1+b1*19);}else{setfillcolor(BLACK);solidcircle(x, y, 8);//将黑棋的点的值都设置成为2a2 = a - 1; b2 = b - 1;arr[a2][b2] = 2;number_black++;//设置图片遮盖字体setfillcolor(YELLOW);solidrectangle(580, 160, 595, 177);solidrectangle(580, 100, 595, 120);solidrectangle(519, 60, 534, 77);//坐标solidrectangle(551, 60, 566, 77);//坐标//setcolor(BLACK);setlinecolor(BLACK);outtextxy(580, 160, change(number_black));outtextxy(564, 100, ":白");outtextxy(519, 60, change(a2+1));outtextxy(551, 60, change(b2+1));顺序黑.push_back(a2+b2*19);}player_exchange++;}

界面部分不都是我写的(我修改了一部分代码,,加了一部分,部分原创),有兴趣的朋友可以去贴吧下载原始代码。

下了几步图:

界面部分暂时结束。

C++实现人机对战围棋(使用Leela Zero权重)-界面相关推荐

  1. 手把手教你:如何让围棋人工智能Leela Zero陪你“人机大战”

    如今,围棋人工智能的水平已经碾压人类,对于像我一样的围棋爱好者来说,早已等不及通过与人工智能对弈和复盘分析来快速提升棋力了.不过,独孤求败的AlphaGo Zero已然退出江湖,而绝艺.金毛.星阵等围 ...

  2. Python实现五子棋人机对战 | CSDN博文精选

    作者 | 吴小鹏 来源 | 数据札记倌(ID:Data_Groom) 五子棋是常见的一款小游戏,五子棋问题是人工智能中的一个经典问题.这篇文章主要介绍了Python版本五子棋的实现代码,大家可以做个参 ...

  3. c语言五子棋人机对弈算法,使用canvas基于AI算法实现人机对战之五子棋

    这是我使用canvas基于AI算法实现的人机对战之五子棋 黑棋是我 下了几局,真心下不过啊!!! 不说了,源码奉上: 人机大战之五子棋 canvas{ display: block; margin:5 ...

  4. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

  5. java人际对战五子棋_系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输...

    展开全部 一.实验题目 五子棋游戏e69da5e6ba9062616964757a686964616f31333365633835. 二.问题分析 五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策 ...

  6. 五子棋程序设计(C语言、人机对战、禁手)

    五子棋程序设计(C语言.人机对战.禁手) 一.程序需求分析 1.1五子棋简介 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏. 五子棋有两种玩法.玩法一:双方分别使用黑白两色的棋 ...

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

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

  8. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  9. java五子棋游戏人工智能_基于java的五子棋游戏(人机对战)

    [实例简介] 我毕业设计自己做的基于java的五子棋游戏软件,获得优秀论文,功能在单纯的人机对战上算比较齐全,也比较好玩!希望为毕业设计做游戏的同学提供些查考! 软件的基本功能 软件的基本功能介绍如下 ...

  10. 设计一款博弈类游戏的人机对战算法、策略_卡牌游戏八合一,华人团队开源强化学习研究平台RLCard...

    雷锋网 AI 科技评论按:在过去的两三年中,我们经常听说人工智能在棋牌类游戏(博弈)中取得新的成果,比如基于深度强化学习的 AlphaGo 击败了人类世界冠军,由 AlphaGo 进化而来的 Alph ...

最新文章

  1. android 手机监听屏幕锁屏,用户解锁
  2. [YTU]_2877(结构体---职工信息结构体)
  3. Backbone React Requirejs 应用实战(一)——RequireJS管理React依赖
  4. 学习笔记(番外篇)——python批量转换图片格式
  5. 如何使用 git 更新branch到master最新状态
  6. Windows 安装 Redis 教程
  7. python 单位根检验代码_python时间序列分析
  8. USACO 2.3 Cow Pedigrees 【DP+前缀和优化】
  9. 1075_MISRA_C规范学习_2004_Rule_5.1
  10. Mac Android 查看dex文件内容
  11. 双系统linux分区扩容,Win7 下Ubuntu14.04 双系统无损扩容
  12. 帮你解剖Python的一个轻量级桌面GUI开发第三方库:Eel,让它体无完肤
  13. 【代码审计-JAVA】javaweb代码审计思路
  14. Myeclipse10下载,安装,破解,插件,优化介绍
  15. Java获取当年以及任意一年的第一天和最后一天 获取当天的开始时间和结束时间 自动获取去年的年份 常用于每年的数据统计
  16. 【TEST】NOI-Linux可用 gedit c++精简配置 附Emacs日常配置
  17. (一)android 桌面悬浮窗 录屏源码放送
  18. mysql 博客建表语句,mysql建表语句
  19. python库中的ssl.py
  20. Google Earth Engine(GEE)——逐年批量下载sentinel-2多波段影像

热门文章

  1. 泰迪杯数据挖掘挑战赛—数据预处理(二)
  2. 单层感知器->BP算法详细推导
  3. 数据结构实训——哈希表设计
  4. 实战项目之后台管理系统
  5. RS-485接口(上下拉电阻选择等)分析
  6. 计算机电源高频干扰,开关电源中电磁干扰的透彻分析及其解决办法
  7. 连接程序,汇编程序,编译程序和解释程序
  8. 使用爬虫自动登录QQ空间
  9. OA办公系统源码下载_PHPOA源码
  10. 服务器XP系统打印机共享设置,如何设置打印机共享_教你在xp系统上设置打印机共享 - 驱动管家...