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

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

简单介绍

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

环境

笔者的环境如下

操作系统 windows 10
使用框架是keras

初始化界面

在这里插入图片描述

游戏界面

在这里插入图片描述

棋谱部分代码

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

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 train.py

测试

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

说明

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

总结

由于笔者的水平有限,在表述上有不准确的地方,还请谅解。。。
源码地址:https://github.com/huzixuan1/AI_Gomoku
有问题欢迎添加1017190168讨论交流

posted @ 2022-05-11 16:38  陶陶Name  阅读(224)  评论(0编辑  收藏  举报