gvgai框架搭建及controller编写
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编写相关推荐
- Xposed框架搭建及模块编写相关问题
问题一:模拟器的选择 首先提供一个xposed下载链接 包含xposed与xposed框架下载 由于里面框架只支持SDK21到SDK27,所以模拟器选择也要在这个范围,如果不在这个范围,可能会出现以下 ...
- pygame只能编写游戏_游戏框架搭建
游戏框架搭建 目标 -- 使用 面相对象 设计 飞机大战游戏类 目标 明确主程序职责 实现主程序类 准备游戏精灵组 01. 明确主程序职责 回顾 快速入门案例,一个游戏主程序的 职责 可以分为两个部分 ...
- (三) Angular2项目框架搭建心得
前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...
- javaweb成长之路:SSM框架搭建
学习javaweb开发,框架的学习是难以避免的,合理的使用框架进行开发,可以很大程度的提升开发效率,减少开发者的工作量.随着it行业的不断发展,各种框架也是层出不穷,目前使用最广的框架应该是属于ssm ...
- webapi框架搭建-创建项目(三)-webapi owin
webapi框架搭建系列博客 上一篇:创建项目(二) 在上一篇里,我们已经创建好了webapi应用,并已经部署到iis里,本篇讲如何用owin自宿主或是iis宿主来部署webapi应用. owin介绍 ...
- SpringSecurity(二)、权限项目框架搭建
Springboot + SpringSecurity权限项目框架搭建 目录 一.项目介绍 二.项目搭建(父子工程) 1.添加 pom 依赖 2.修改 yml 配置 3.编写JwtTokenUtil工 ...
- SSM框架搭建,及遇到的问题
SSM框架搭建,及遇到的问题 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Exp ...
- 小菜鸟的SSM框架搭建【详细步骤】【SSM/IDEA/MAVEN】
小菜鸟的SSM框架搭建 内容很长噢,一步步搭建 此框架是跟着b站上的黎曼的猜想所发布的视频搭建起来的,细节操作可以看视频.我只是在这里梳理一下ssm框架搭建的流程. 整合说明:SSM整合可以使用多种方 ...
- Koa入门(一)—— Koa项目基础框架搭建
Koa项目基础框架搭建 项目初始化 项目自动重启 配置ES6语法 基本目录搭建 配置env信息 自动加载路由 统一异常处理 自定义异常 异常处理中间件 中间件配置 目录别名配置 项目初始化 mkdir ...
最新文章
- 算法工程师面试必考项——链表
- 计算机一级单元格公式设置错误是什么原因,excel表格公式出错怎么解决,电子表格求和出错...
- 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
- 避免使用CreateThread函数,导致的内存泄露
- 用python画常密度轮廓线,如何使用Matplotlib在极坐标中绘制具有等高线密度线的散点图?...
- TCP提供可靠传输的工作原理和实现过程
- 百度AI学习:二、语音合成
- 要想不被套,学会这八招
- Django + Uwsgi + Nginx 实现生产环境部署
- 遇到错误怎么办:ndk-build.cmd‘‘ finished with non-zero exit value 2
- 安卓模拟定位mockLocation,闪退?
- 顺序表基本操作的实现
- 「图与推荐指南针」: 顶级学者/研究组有哪些?
- VR 、SR 轴矢冠三个切面的显示
- LWIP之DNS域名解析(二)
- cimiss java,灾害性天气个例库智能分析系统的设计与实现-气象.PDF
- 多媒体卡和SD卡的卡识别过程
- 【干货分享】前端面试知识点锦集01(HTML+CSS篇)—— 附答案
- 解决Ubuntu 18.04-Ubuntu 22.04中文输入法安装依赖的问题,成功安装搜狗拼音
- 字节笔试题(含答案)
热门文章
- 2022-2028年中国出版业投资分析及前景预测报告(全卷)
- Ubuntu 中的 dpkg 安装deb、删除deb、显示已安装包列表、解压deb文件、显示deb包内文件列表、配置deb软件包
- Python学习日志9月14日
- 安装centos 7 桌面
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...
- js判断 IE 浏览器
- qt试用1(Eclipse+cdt+Qt)
- 用PHP计算个税,PHP计算个人所得税示例【不使用速算扣除数】
- python定义一个汽车类_汽车类Python程序
- 敲代码括号技巧_阅码神奇Souceinsight使用小技巧总结