打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
代码吃鸡,来挑战吗?

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

图为受害者,情绪看起来很稳定

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

  1. 机器人不得伤害人类个体,或者目睹人类个体将遭受危险而袖手不管

  2. 机器人必须服从人给予它的命令,当该命令与第一定律冲突时例外

  3. 机器人在不违反第一、第二定律的情况下要尽可能保护自己的生存

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

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

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

坦克由三部分组成:

  1. 车身

  2. 炮台(决定开炮方向)

  3. 雷达(用以发现敌人)

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

  1. 坦克当前坐标

  2. 车身、炮台、雷达的朝向角度

  3. 战场长宽尺寸

  4. 事件响应,包括:探测到敌人、被子弹打中、碰撞到敌人、碰撞到墙壁等

以及控制坦克的:

  1. 前进、后退

  2. 车身旋转

  3. 炮台旋转

  4. 雷达旋转

  5. 开炮

一些基本规则:

  1. 每辆坦克具有一定的能量,初始值相同,当能量降到0时则被消灭

  2. 被敌人击中会扣能量,但击中敌人会增加能量

  3. 发射炮弹需要消耗能量,可以指定消耗能量的多少,对敌人造成的伤害也相应变化

  4. 碰撞到敌人和墙壁时都会扣能量

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

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

项目地址:
https://github.com/turkishviking/Python-Robocode/wiki/Bot-Example

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

具体方式:

  1. 下载项目代码

  2. 确保你电脑的环境已安装 python2、PyQt4,你可以创建一个虚拟环境来做这事(参考:为什么你的python版本一团糟?因为少了这个操作

  3. 命令行运行 python main.py 启动项目

  4. 点击菜单栏上面的 Battle - New 添加坦克,你自己写的坦克也是从这里添加

  5. 之后如果不改变游戏设置,直接点击 Start Last Battle 即可

  6. 坦克策略文件在 Robots 文件夹下,你可以仿照已有例子增加一个

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

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(当炮灰)了。接下来,你可以在此基础上继续扩展它,实现你自己的策略。

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
零基础学编程003:在游戏中学JAVA和C#
15个免费游戏,将帮助您学习如何 编写代码
python抽卡游戏代码
教你玩Robocode(1)
玩Robocode游戏,学习Java - 蛋白质日志 - BlogJava
2.7万 Star!最全面的 Python 设计模式集合
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服