代码吃鸡:Python-Robocode

栏目: Python · 发布时间: 6年前

内容简介:最近看到一个很有“未来感”的新闻:一辆

最近看到一个很有“未来感”的新闻:

一辆 特斯拉 在拉斯维加斯出了车祸,撞“死”了一个……emmmm……机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中了解“ 被特斯拉撞是怎样一种体验 ”了。

代码吃鸡:Python-Robocode 图为受害者,情绪看起来很稳定

随着“ 人工智能 ”的应用场景越来越多,此类新闻以后可能也会越来越频繁。但愿这些机器人们能严格遵守 阿西莫夫三定律

  1. 机器人不得伤害人类个体,或者目睹人类个体将遭受危险而袖手不管
  2. 机器人必须服从人给予它的命令,当该命令与第一定律冲突时例外
  3. 机器人在不违反第一、第二定律的情况下要尽可能保护自己的生存

在早些年,人工智能这个概念还没有这么火的时候,提到 AI 经常是指 游戏中电脑角色的运行策略 。比如枪战游戏、即时战略游戏、MOBA 类游戏中的电脑方,对于 寻路、攻击、躲避 等行为的判断和执行。早期的一些 AI 有点傻,真的可以称得上“人工智障”。比如玩过星际争霸的玩家一定知道“勾农民”的战术:你只要攻击一下电脑方的基地,它的所有农民就会放下手中工作来追着你。

然而正因为如此,产生了一种 程序员 之间特有的较量: 编程游戏 。所有人 针对某一个游戏规则编写策略,看谁的策略表现得更好 ,能打败其他人,最终取得胜利。像星际争霸、CS之类的经典游戏都有过类似的比赛。优秀的代码甚至可以挑战人类,比如这两年为人所熟知的 AlphaGo ,就是此类的极致。而 对于编程新手来说,编程游戏也是练习代码的极好方式。

在众多可编程的游戏中,有个比较知名的项目: Robocode 。它是 IBM 在 2001 年发布的 坦克机器人战斗仿真引擎 ,并在数年后开源。简单来说,它就是一个“坦克大战”的游戏,你可以控制一辆坦克,和别人对战。然而与一般游戏所不同的是:你不是通过键盘鼠标控制坦克,而是需要 自己写一段代码,制定坦克的策略 ,在游戏开始后自动对战。

代码吃鸡:Python-Robocode 代码吃鸡:Python-Robocode

坦克由三部分组成:

  1. 车身
  2. 炮台(决定开炮方向)
  3. 雷达(用以发现敌人)

代码吃鸡:Python-Robocode

在代码中,你可以通过接口获取以下数据:

  1. 坦克当前坐标
  2. 车身、炮台、雷达的朝向角度
  3. 战场长宽尺寸
  4. 事件响应,包括:探测到敌人、被子弹打中、碰撞到敌人、碰撞到墙壁等

以及控制坦克的:

  1. 前进、后退
  2. 车身旋转
  3. 炮台旋转
  4. 雷达旋转
  5. 开炮

一些基本规则:

  1. 每辆坦克具有一定的能量,初始值相同,当能量降到0时则被消灭
  2. 被敌人击中会扣能量,但击中敌人会增加能量
  3. 发射炮弹需要消耗能量,可以指定消耗能量的多少,对敌人造成的伤害也相应变化
  4. 碰撞到敌人和墙壁时都会扣能量

所以我们要做的就是: 尽可能避开子弹尽可能避免撞墙和撞上别人尽可能击中敌人 (打不中不如不打)、活到最后。这和当下热门的吃鸡游戏(绝地求生)的套路就是一致的嘛。

可是,Robocode 使用的语言是 Java ,这是 IBM 当年所大力推广的。如果你想尝试,但不懂 JAVA 就尴尬了。好在有人做了个 Python 移植版本: Python-Robocode

不过呢,这个项目有点年久失修了,用的还是 python2 + PyQt4 ,在很多比较新的系统上运行会有一些小 bug,比如菜单栏点不出来、不能调参数之类。不要抱太高要求,还是可以玩玩的,我也就玩了一百多局而已。

具体方式:

  1. 下载项目代码
  2. 确保你电脑的环境已安装 python2、PyQt4,你可以创建一个虚拟环境来做这事(参考: Crossin:为什么你的python版本一团糟?因为少了这个操作
  3. 命令行运行 python main.py 启动项目
  4. 点击菜单栏上面的 Battle - New 添加坦克,你自己写的坦克也是从这里添加
  5. 之后如果不改变游戏设置,直接点击 Start Last Battle 即可
  6. 坦克策略文件在 Robots 文件夹下,你可以仿照已有例子增加一个

代码吃鸡:Python-Robocode

这里我再给一个更简单的策略示例:

from robot import Robot
import random
# 坦克类
class World(Robot):
    # 初始化
    def init(self):
        self.lockRadar("gun")
    # 游戏循环
    def run(self):
        self.gunTurn(90)
        self.turn(random.randint(-45, 45))
        self.move(random.randint(-100, 100))
    # 发现敌人事件
    def onTargetSpotted(self, botId, botName, botPos):
        self.fire(1)
        self.gunTurn(10)

这里我定义了一个名叫 World 的坦克类,继承框架提供的 Robot 类。在初始化里,把雷达和炮台角度绑定,这样只要发现敌人就可以开炮了。run是主体策略部分,会一直循环执行,这里我让它同时做三件事:炮台旋转90度、车身旋转随机角度、车身前进/后退随机距离。而当发现敌人后,就开炮,并将炮台移动10度(避免死锁)。

就这几行代码,保存到 hello.py里,从菜单栏添加到游戏中,已经可以让你的坦克上场 PK(当炮灰)了。接下来,你可以在此基础上继续扩展它,实现你自己的策略。

我还写了一个稍微复杂一点点的版本,对付这几个示例策略还是可以一战的。

代码吃鸡:Python-Robocode

代码在此:

https:// gitee.com/crossin/snippet/tree/master/tank 或者在公号(Crossin的编程教室)里回复关键字“ 坦克 ”获取。

你可以下载到你的目录中,这样就可以和我隔空对战了。欢迎大家把自己的策略发上来。

除了这个 Python 版本的 Robocode 之外,腾讯也做过一个很类似的 HTML5 版本,叫 CodeTank (鹅厂当年还不太习惯收购)。虽说 idea 不新鲜,但有个很大优势是 可以在线使用 ,不用下载搭建环境了,而且你可以看到其他开发者提交的代码。对于了解一些 JS 的学习者来说,这非常方便。关于 JS 我们暂时不展开说了。但即使你不太会 JS,也可以复制一些别人的代码,尝试改点参数,这个并不复杂。

代码吃鸡:Python-Robocode

在 CodeTank 里,你也可以挑战我,从 坦克库 - 坦克对战 里搜 crossin 就能找到了。

代码吃鸡:Python-Robocode

希望大家寓教于乐,玩得开心~

════


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning ASP.NET 4 in C# and Vb

Beginning ASP.NET 4 in C# and Vb

Imar Spaanjaars / Wrox / 2010-3-19 / GBP 29.99

This book is for anyone who wants to learn how to build rich and interactive web sites that run on the Microsoft platform. With the knowledge you gain from this book, you create a great foundation to ......一起来看看 《Beginning ASP.NET 4 in C# and Vb》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具