gvgai框架搭建及controller编写

  • gvgai框架搭建
  • controller编写

gvgai框架搭建

gvgai官网:http://www.gvgai.net/
框架下载:http://www.gvgai.net/software.php
该框架的运行需要安装JDK和Intellij idea(我用的是这个)。

controller编写

以框架中的pacoman为例:
pacoman是一个双人游戏,游戏中,需要有两个agent控制两个吃豆人,要在躲避四个幽灵的前提下尽可能多的吃到金币,同时吃 豆人也可以获得一些奖励的道具,获得分数的同时能够得到特殊的增益效果。

这个游戏的程序入口位于src\tracks\multiplayer\testMultiplayer.java。在这里你可以选择用于双人游戏的控制器。如果你自己想玩可以将其中的一个控制器改为humanController。

编写控制器需要注意:
每一个控制器都是由一个继承自core\player\AbstractMultiPlayer.java的java类类构成(由此应该容易推知其它的控制器类从哪里继承),且这个类必须命名为Agent.java且必须实现两个方法:

public Agent(StateObservation stateObs, ElapsedCpuTimer elapsedTimer, playerID)
public Types.ACTIONS act(StateObservation stateObs, ElapsedCpuTimer elapsedTimer)

两个方法都需要两个参数 StateObservation stateObs 和 ElapsedCpuTimer elapsedTimer,其中:
StateObservation stateObs: 定义了 agent 当前所处的状态信息,一般通过上层程序传递下来,你 可以通过在可运行的控制器上加断点来查看其所包含的内容;另外,源文件位于 src\core\game\StateObservationMulti.java ,你可以去查看其自带的一些方法(使用Intellij idea的go to 命令简单直接)。
ElapsedCpuTimer elapsedTimer: 是一个类,它允许查询代理返回一个动作的剩余CPU时间。

通过如下代码实现控制器:

package tracks.multiPlayer.hw;import core.game.StateObservation;
import core.game.StateObservationMulti;
import core.player.AbstractMultiPlayer;
import ontology.Types;
import tools.ElapsedCpuTimer;
import tools.Vector2d;import java.util.ArrayList;
import java.util.Random;public class Agent extends AbstractMultiPlayer {int id;int oppID;Random rnd;int no_player;public Agent(StateObservationMulti stateObs, ElapsedCpuTimer elapsedTimer, int playerID) {id = playerID;no_player = stateObs.getNoPlayers();oppID = (playerID + 1) % stateObs.getNoPlayers();rnd = new Random();}@Overridepublic Types.ACTIONS act(StateObservationMulti stateObs, ElapsedCpuTimer elapsedTimer) {Types.ACTIONS bestAction = getBestAction(stateObs,id);//System.out.printf("当前最好的动作是:%s\n",bestAction);return bestAction;}//获取玩家当前较优动作private Types.ACTIONS getBestAction(StateObservationMulti stateObs, int id) {Graph g=new Graph();g=g.search(stateObs,id);if(g==null)return keepMovingAction(stateObs,id);return g.getScdEntry().action;}// 获得一个使吃豆人保持移动的动作private Types.ACTIONS keepMovingAction(StateObservationMulti stateObs,int id){ArrayList<Types.ACTIONS> movingActions=new ArrayList<>();ArrayList<Types.ACTIONS> actions=stateObs.getAvailableActions(id);int oppID=(id+1)%stateObs.getNoPlayers();int no_player=stateObs.getNoPlayers();Vector2d avatar=stateObs.getAvatarPosition(id);for(Types.ACTIONS action:stateObs.getAvailableActions(id)){//不考虑ACTION_NILif(action==Types.ACTIONS.ACTION_NIL)continue;Types.ACTIONS []acts=new Types.ACTIONS[no_player];acts[id]=action;acts[oppID]=Types.ACTIONS.ACTION_NIL;StateObservationMulti stCopy=stateObs.copy();stCopy.advance(acts);//如果该动作会导致玩家死亡,也不考虑boolean gameOver=stCopy.isGameOver();Types.WINNER win=stCopy.getMultiGameWinner()[id];if(gameOver||win==Types.WINNER.PLAYER_LOSES)continue;//如果该动作无法改变玩家位置,不考虑Vector2d new_avatar=stCopy.getAvatarPosition(id);if(new_avatar!=avatar)movingActions.add(action);}//最终返回所有改变玩家位置的动作中的一个,或返回随机if(movingActions.size()==0)return actions.get(new Random().nextInt(actions.size()));elsereturn movingActions.get(new Random().nextInt(movingActions.size()));}
}

附带的图搜索算法:

package tracks.multiPlayer.hw;import core.game.StateObservationMulti;
import ontology.Types;
import tools.Vector2d;import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Random;public class Graph {public Types.ACTIONS action=null;public Types.ACTIONS no_action=null;public StateObservationMulti stateObs=null;public Graph parent=null;//返回带有最优前进路径之动作的节点public Graph getScdEntry(){if(this.parent!=null&&this.parent.action!=null)return this.parent.getScdEntry();elsereturn this;}//通过act返回相应的数字public int classifyAct(Types.ACTIONS act){switch (act){case ACTION_UP: return 1;case ACTION_DOWN: return 2;case ACTION_LEFT: return 3;case ACTION_RIGHT: return 4;}return 0;}//通过数字i的值返回对应的动作public Types.ACTIONS getAct(int i){switch (i){case 1:return Types.ACTIONS.ACTION_UP;case 2:return Types.ACTIONS.ACTION_DOWN;case 3:return Types.ACTIONS.ACTION_LEFT;case 4:return Types.ACTIONS.ACTION_RIGHT;}return Types.ACTIONS.ACTION_NIL;}//对Graph对象进行拷贝,返回一个与拷贝对象一致的Graphprivate Graph copy(){int i;Graph g=new Graph();i=classifyAct(this.action);g.action=getAct(i);i=classifyAct(this.no_action);g.no_action=getAct(i);g.stateObs=this.stateObs.copy();return g;}public Graph search(StateObservationMulti stateObs,int id){//初始化变量this.stateObs=stateObs;this.action=null;this.no_action=null;this.parent=null;int step=0,maxStep=50;int oppID = (id + 1) % stateObs.getNoPlayers();int no_player = stateObs.getNoPlayers();double score = stateObs.getGameScore(id);//初始化“队列”,并将带有当前状态的节点入列int front=-1,rear=-1;Graph entry1=null,entry2=null;Graph[]entries=new Graph[999];rear=(rear+1)%999;entries[rear]=this;//开始搜索路径,当搜索深度到达极限而仍未得到结果的情况下,返回nullwhile(front!=rear&&step<maxStep){step++;front=(front+1)%999;entry1=entries[front];//对于节点entry1的每个可行的动作通过copy()和advance()方法判断是否能够for(Types.ACTIONS action:entry1.stateObs.getAvailableActions(id)){//如果动作为保持不动或者是转换位前一个转台的动作,则放弃(为防止搜索陷入死循环)if(action==Types.ACTIONS.ACTION_NIL||action==entry1.no_action)continue;Types.ACTIONS []acts=new Types.ACTIONS[no_player];acts[id]=action;acts[oppID]=Types.ACTIONS.ACTION_NIL;StateObservationMulti stCopy=entry1.stateObs.copy();Vector2d avatar=stCopy.getAvatarPosition(id);stCopy.advance(acts);//如果此动作过后导致了玩家的死亡,则放弃boolean gameOver=stCopy.isGameOver();Types.WINNER win=stCopy.getMultiGameWinner()[id];if(gameOver||win==Types.WINNER.PLAYER_LOSES)continue;//如果此动作后玩家仍呆在先前的位置,则放弃Vector2d new_avatar=stCopy.getAvatarPosition(id);if(new_avatar==avatar)continue;//通过筛选的节点可以入列entry2=new Graph();entry2.parent=entry1;entry2.stateObs=stCopy;entry2.action=action;switch (action){case ACTION_UP:entry2.no_action= Types.ACTIONS.ACTION_DOWN;break;case ACTION_DOWN:entry2.no_action= Types.ACTIONS.ACTION_UP;break;case ACTION_LEFT:entry2.no_action=Types.ACTIONS.ACTION_RIGHT;break;case ACTION_RIGHT:entry2.no_action= Types.ACTIONS.ACTION_LEFT;break;}rear=(rear+1)%999;entries[rear]=entry2;if(entry2.stateObs.getGameScore(id)>score){return entry2;}}}return null;}
}

控制器效果展示(我是那个“走路带风”的):

gvgai框架搭建及controller编写相关推荐

  1. Xposed框架搭建及模块编写相关问题

    问题一:模拟器的选择 首先提供一个xposed下载链接 包含xposed与xposed框架下载 由于里面框架只支持SDK21到SDK27,所以模拟器选择也要在这个范围,如果不在这个范围,可能会出现以下 ...

  2. pygame只能编写游戏_游戏框架搭建

    游戏框架搭建 目标 -- 使用 面相对象 设计 飞机大战游戏类 目标 明确主程序职责 实现主程序类 准备游戏精灵组 01. 明确主程序职责 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分 ...

  3. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...

  4. javaweb成长之路:SSM框架搭建

    学习javaweb开发,框架的学习是难以避免的,合理的使用框架进行开发,可以很大程度的提升开发效率,减少开发者的工作量.随着it行业的不断发展,各种框架也是层出不穷,目前使用最广的框架应该是属于ssm ...

  5. webapi框架搭建-创建项目(三)-webapi owin

    webapi框架搭建系列博客 上一篇:创建项目(二) 在上一篇里,我们已经创建好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用. owin介绍 ...

  6. SpringSecurity(二)、权限项目框架搭建

    Springboot + SpringSecurity权限项目框架搭建 目录 一.项目介绍 二.项目搭建(父子工程) 1.添加 pom 依赖 2.修改 yml 配置 3.编写JwtTokenUtil工 ...

  7. SSM框架搭建,及遇到的问题

    SSM框架搭建,及遇到的问题 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Exp ...

  8. 小菜鸟的SSM框架搭建【详细步骤】【SSM/IDEA/MAVEN】

    小菜鸟的SSM框架搭建 内容很长噢,一步步搭建 此框架是跟着b站上的黎曼的猜想所发布的视频搭建起来的,细节操作可以看视频.我只是在这里梳理一下ssm框架搭建的流程. 整合说明:SSM整合可以使用多种方 ...

  9. Koa入门(一)—— Koa项目基础框架搭建

    Koa项目基础框架搭建 项目初始化 项目自动重启 配置ES6语法 基本目录搭建 配置env信息 自动加载路由 统一异常处理 自定义异常 异常处理中间件 中间件配置 目录别名配置 项目初始化 mkdir ...

最新文章

  1. 算法工程师面试必考项——链表
  2. 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
  3. 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
  4. 避免使用CreateThread函数,导致的内存泄露
  5. 用python画常密度轮廓线,如何使用Matplotlib在极坐标中绘制具有等高线密度线的散点图?...
  6. TCP提供可靠传输的工作原理和实现过程
  7. 百度AI学习:二、语音合成
  8. 要想不被套,学会这八招
  9. Django + Uwsgi + Nginx 实现生产环境部署
  10. 遇到错误怎么办:ndk-build.cmd‘‘ finished with non-zero exit value 2
  11. 安卓模拟定位mockLocation,闪退?
  12. 顺序表基本操作的实现
  13. 「图与推荐指南针」: 顶级学者/研究组有哪些?
  14. VR 、SR 轴矢冠三个切面的显示
  15. LWIP之DNS域名解析(二)
  16. cimiss java,灾害性天气个例库智能分析系统的设计与实现-气象.PDF
  17. 多媒体卡和SD卡的卡识别过程
  18. 【干货分享】前端面试知识点锦集01(HTML+CSS篇)—— 附答案
  19. 解决Ubuntu 18.04-Ubuntu 22.04中文输入法安装依赖的问题,成功安装搜狗拼音
  20. 字节笔试题(含答案)

热门文章

  1. 2022-2028年中国出版业投资分析及前景预测报告(全卷)
  2. Ubuntu 中的 dpkg 安装deb、删除deb、显示已安装包列表、解压deb文件、显示deb包内文件列表、配置deb软件包
  3. Python学习日志9月14日
  4. 安装centos 7 桌面
  5. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...
  6. js判断 IE 浏览器
  7. qt试用1(Eclipse+cdt+Qt)
  8. 用PHP计算个税,PHP计算个人所得税示例【不使用速算扣除数】
  9. python定义一个汽车类_汽车类Python程序
  10. 敲代码括号技巧_阅码神奇Souceinsight使用小技巧总结