摘要:最近看到一个很有未来感的新闻一辆特斯拉在拉斯维加斯出了车祸,撞死了一个机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中了解被特斯拉撞是怎样一种体验了。像星际争霸之类的经典游戏都有过类似的比赛。
最近看到一个很有“未来感”的新闻:
一辆 特斯拉 在拉斯维加斯出了车祸,撞“死”了一个……emmmm……机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中了解“ 被特斯拉撞是怎样一种体验 ”了。
图为受害者,情绪看起来很稳定
随着“ 人工智能 ”的应用场景越来越多,此类新闻以后可能也会越来越频繁。但愿这些机器人们能严格遵守 阿西莫夫三定律 :
机器人不得伤害人类个体,或者目睹人类个体将遭受危险而袖手不管
机器人必须服从人给予它的命令,当该命令与第一定律冲突时例外
机器人在不违反第一、第二定律的情况下要尽可能保护自己的生存
在早些年,人工智能这个概念还没有这么火的时候,提到 AI 经常是指 游戏中电脑角色的运行策略 。比如枪战游戏、即时战略游戏、MOBA 类游戏中的电脑方,对于 寻路、攻击、躲避 等行为的判断和执行。早期的一些 AI 有点傻,真的可以称得上“人工智障”。比如玩过星际争霸的玩家一定知道“勾农民”的战术:你只要攻击一下电脑方的基地,它的所有农民就会放下手中工作来追着你。
然而正因为如此,产生了一种程序员之间特有的较量: 编程游戏 。所有人 针对某一个游戏规则编写策略,看谁的策略表现得更好 ,能打败其他人,最终取得胜利。像星际争霸、CS之类的经典游戏都有过类似的比赛。优秀的代码甚至可以挑战人类,比如这两年为人所熟知的 AlphaGo ,就是此类的极致。而 对于编程新手来说,编程游戏也是练习代码的极好方式。
在众多可编程的游戏中,有个比较知名的项目: Robocode 。它是 IBM 在 2001 年发布的 坦克机器人战斗仿真引擎 ,并在数年后开源。简单来说,它就是一个“坦克大战”的游戏,你可以控制一辆坦克,和别人对战。然而与一般游戏所不同的是:你不是通过键盘鼠标控制坦克,而是需要 自己写一段代码,制定坦克的策略 ,在游戏开始后自动对战。
坦克由三部分组成:
车身
炮台(决定开炮方向)
雷达(用以发现敌人)
在代码中,你可以通过接口获取以下数据:
坦克当前坐标
车身、炮台、雷达的朝向角度
战场长宽尺寸
事件响应,包括:探测到敌人、被子弹打中、碰撞到敌人、碰撞到墙壁等
以及控制坦克的:
前进、后退
车身旋转
炮台旋转
雷达旋转
开炮
一些基本规则:
每辆坦克具有一定的能量,初始值相同,当能量降到0时则被消灭
被敌人击中会扣能量,但击中敌人会增加能量
发射炮弹需要消耗能量,可以指定消耗能量的多少,对敌人造成的伤害也相应变化
碰撞到敌人和墙壁时都会扣能量
所以我们要做的就是: 尽可能避开子弹 、 尽可能避免撞墙和撞上别人 、 尽可能击中敌人 (打不中不如不打)、活到最后。这和当下热门的吃鸡游戏(绝地求生)的套路就是一致的嘛。
可是,Robocode 使用的语言是 Java ,这是 IBM 当年所大力推广的。如果你想尝试,但不懂 JAVA 就尴尬了。好在有人做了个 Python 移植版本: Python-Robocode 。
项目地址:
https://github.com/turkishviking/Python-Robocode/wiki/Bot-Example
不过呢,这个项目有点年久失修了,用的还是 python2 + PyQt4 ,在很多比较新的系统上运行会有一些小 bug,比如菜单栏点不出来、不能调参数之类。不要抱太高要求,还是可以玩玩的,我也就玩了一百多局而已。
具体方式:
下载项目代码
确保你电脑的环境已安装 python2、PyQt4,你可以创建一个虚拟环境来做这事(参考:Crossin:为什么你的python版本一团糟?因为少了这个操作)
命令行运行 python main.py 启动项目
点击菜单栏上面的 Battle - New 添加坦克,你自己写的坦克也是从这里添加
之后如果不改变游戏设置,直接点击 Start Last Battle 即可
坦克策略文件在 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(当炮灰)了。接下来,你可以在此基础上继续扩展它,实现你自己的策略。
我还写了一个稍微复杂一点点的版本,对付这几个示例策略还是可以一战的。
代码在此:
https:// gitee.com/crossin/snippet/tree/master/tank
或者在公号(Crossin的编程教室)里回复关键字“ 坦克 ”获取。
你可以下载到你的目录中,这样就可以和我隔空对战了。欢迎大家把自己的策略发上来。
除了这个 Python 版本的 Robocode 之外,腾讯也做过一个很类似的 HTML5 版本,叫 CodeTank (鹅厂当年还不太习惯收购)。虽说 idea 不新鲜,但有个很大优势是 可以在线使用 ,不用下载搭建环境了,而且你可以看到其他开发者提交的代码。对于了解一些 JS 的学习者来说,这非常方便。关于 JS 我们暂时不展开说了。但即使你不太会 JS,也可以复制一些别人的代码,尝试改点参数,这个并不复杂。
在 CodeTank 里,你也可以挑战我,从 坦克库 - 坦克对战 里搜 crossin 就能找到了。
希望大家寓教于乐,玩得开心~
════
其他文章及回答:
如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉 | 字符播放器 | 一图学Python
欢迎搜索及关注公众号: Crossin的编程教室
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43071.html
摘要:本博客猫叔的博客,转载请申明出阅读本文约分钟适读人群互联网工作者游戏爱好者吃鸡吗本文部分素材摘抄自最前线腾讯吃鸡游戏或借壳变现,绝地求生成为和平精英。我比较少玩吃鸡几乎没有,不过对于游戏的好奇感一直高于其他行业。 本博客 猫叔的博客,转载请申明出阅读本文约3分钟适读人群:IT/互联网工作者、游戏爱好者 吃鸡吗? showImg(https://segmentfault.com/img...
摘要:效率专精系列善用统一描述语言提升开发效率分钟搞定环境配置与使用考虑到篇幅较长的文档反复修改的情况,要快速找到修改点比较困难。 之前零零散散写了几篇文章,主要是实际开发过程中一些效率痛点和相应的改善方法。今天抽空温故知新,把之前的内容串起来,做了个小总结,即《效率专精系列》小系列的总集篇。 回顾项目开发流程 开发一个新项目时,开发流程大概分成以下几步: 设计方案,并落地成设计文档 设计...
摘要:程序主要是通过使用库来登录到微信网页端,然后通过来发送消息和接收消息。推荐阅读顶级开源项目用吃鸡是一种什么样的体验用玩微信,机器人陪你唠嗑本文首发于公众号痴海,后台回复,为你精心准备时下最热门教程。 showImg(https://segmentfault.com/img/remote/1460000015982002); 阅读文本大概需要 5 分钟。 今天带给大家一个非常有意思的 p...
阅读 3095·2021-09-28 09:42
阅读 3447·2021-09-22 15:21
阅读 1121·2021-07-29 13:50
阅读 3561·2019-08-30 15:56
阅读 3367·2019-08-30 15:54
阅读 1196·2019-08-30 13:12
阅读 1171·2019-08-29 17:03
阅读 1196·2019-08-29 10:59