前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于深度学习的一款五子棋小游戏

基于深度学习的一款五子棋小游戏

原创
作者头像
陶陶name
发布2022-05-13 08:39:56
4180
发布2022-05-13 08:39:56
举报
文章被收录于专栏:陶陶计算机陶陶计算机

今天分享一个基于深度学习而开发的AI小游戏简单介绍

这一款基于深度学习的五子棋小游戏的界面是使用Unity开发的,而网络结构是使用keras搭建的。

环境

笔者的环境如下

操作系统 windows 10

使用框架是keras

初始化界面

在这里插入图片描述
在这里插入图片描述

游戏界面

在这里插入图片描述
在这里插入图片描述

棋谱部分代码

代码语言:c#
复制
using System;
using System.Collections;
using System.Collections.Generic;
using Wineforever;
using System.Linq;
using System.IO;
using UnityEngine;
using System.Diagnostics;
using System.Text;

public static class ai{
    public struct Point
    {
        public int X;
        public int Y;
    }
    public static Point move()
    {
        var root = System.IO.Directory.GetCurrentDirectory();
        //调用预测脚本
        System.Console.InputEncoding = System.Text.Encoding.UTF8;
        System.Diagnostics.Process exep = new System.Diagnostics.Process();
        exep.StartInfo.UseShellExecute = false;
        exep.StartInfo.FileName = "cmd.exe";
        exep.StartInfo.RedirectStandardInput = true;
        exep.Start();
        exep.StandardInput.WriteLine("cd /d "+ root);
        exep.StandardInput.WriteLine("python predict.py");
        exep.StandardInput.WriteLine("exit()");
        exep.WaitForExit();
        //分析输出信息
        var policy_dic = Wineforever.String.client.LoadFromSheet(root + "\\policy.wf")["Policy"];//预测落子
        //var eva = double.Parse(Wineforever.String.client.LoadFromSheet(System.AppDomain.CurrentDomain.BaseDirectory + "Assets\\eva.wf")["Evaluation"][0]);//胜率指数
        var policy_list = policy_dic.Select((i => double.Parse(i))).ToList();
        var sorted = policy_list.Select((x, i) => new KeyValuePair<double, int>(x, i)).OrderByDescending(x => x.Key).ToList();
        //var policy_sorted = sorted.Select(i => i.Key).ToList();
        var policy_index = sorted.Select(i => i.Value).ToList();
        //转换成落子坐标
        var Move = new Point();
        for (int i = 0; i < 361; i++)
        {
            int index = policy_index[i];
            int Y = index % 19, X = index / 19;
            if (GameObject.Find("board").GetComponent<logic>().Board_State[X,Y] == -1)
            {
                Move.X = X;
                Move.Y = Y;
                break;
            }
        }
        return Move;
    }
}

网络结构

网络结构就很简单了,使用keras搭建四层卷积层,输入的尺寸是4x19x19

代码语言:python
复制
ef create_model():
    lr = 1e-4
    policy_net = Sequential()
    policy_net.add(Convolution2D(filters=32,kernel_size=(5,5),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr),input_shape=(4,19,19)))
    policy_net.add(Convolution2D(filters=64,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Convolution2D(filters=128,kernel_size=(3,3),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Convolution2D(filters=4,kernel_size=(1,1),padding='same', data_format="channels_first", activation="relu",kernel_regularizer=l2(lr)))
    policy_net.add(Flatten())
    policy_net.add(Dense(361,activation="softmax",kernel_regularizer=l2(lr)))
    adam = Adam(lr=2e-4)
    policy_net.compile(optimizer=adam,loss='categorical_crossentropy')
    policy_net.save('policy_model.h5')

训练

使用命令:

代码语言:python
复制
python train.py

测试

在文件夹下点击gobang.exe即可

说明

项目中我已经将tarin的一部分数据放在Assets下的train中了,数据的数量比较的少,大概只用三四百个数据的样子,这里呢,当你完整和AI玩一盘游戏后所产生的对战数据也会被保存在train的目录下,这样即可为后面的训练提供数据的基础。训练时,它的loss下降的是很漫长的,这里提供的模型,是经过使用了30000条数据经过大概三天的时间训练而来的。大家在这个模型的基础上继续训练,会有一个相对好的结果。但是呢,这个AI现在的棋力还是很弱的,暂时性的只是学会了如何下棋,想要达到打败普通人还是很难的。想要达到一个很好的效果,还是需要花费大量的时间和资源进行训练。

总结

由于笔者的水平有限,在表述上有不准确的地方,还请谅解。。。

源码地址:https://github.com/huzixuan1/AI_Gomoku

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 初始化界面
    • 游戏界面
      • 棋谱部分代码
        • 网络结构
          • 训练
            • 测试
              • 说明
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档