《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
一、前言
新年就要到了,祝大家新的一年: 龙行龘龘, 前程朤朤!
白泽花了点时间,用 500行 Go 代码写了一个控制台的小游戏:《模拟龙生》,在游戏中你将模拟一条新生的巨龙,开始无尽的冒险!
Tips:运气很重要!不然会抓狂!还有游戏可能有些小 BUG,你那么帅,一定不好意思说我(欢迎 pr)。
游戏玩法图解:

游戏代码在我的开源 Go 学习仓库的
dragon路径下,可以直接运行可执行程序体验(win64/mac 均可)。仓库里还包含 Go 各阶段学习文章、读书笔记、电子书、简历模板等,欢迎 star。

二、游戏玩法
《模拟龙生》大部分游戏时间都是挂机冒险,不占用大家时间~
游戏的目的是在指定轮次的游戏回合内,想方设法获得最高的修为!
攻略:
- 初始防御力可以高一点,战斗是回合制,防御力性价比高!
- 战斗你是先手,点高额攻击也是不错的选择!
- 没血后必须返回修养,身体是革命的本钱!
- 进阶成功概率75%,进阶成功提升某项能力,失败降低,进阶失败修为/2,越到后期越要谨慎,你的目的是在有限次轮数内获得尽可能高的修为!
- 运气真的很重要!心态要好!作者是无辜的!
1. 初始化
- 起一个你喜欢的名字!然后分配100点能力值到三维属性。
- 攻击力:当冒险遇到 NPC 时,会与其发生回合制战斗,每回合你对它可以造成:你的攻击力 - NPC 防御力的伤害。
- 防御力:当冒险遇到 NPC 时,会与其发生回合制战斗,每回合它对你可以造成:NPC 的攻击力 - 你防御力的伤害。
- 生命值:战斗和触发事件造成生命值为0均无法继续冒险,必须返回休养生息(每秒恢复最大生命值10%)。
- 输入整个游戏的轮次:这里输入200轮。
这里也向大家发起挑战:200轮次内,挑战可以获取的最高修为值!欢迎加q群分享:622383022,或者评论区展示你的战绩!

2. 外出冒险
选择2则出发外出冒险(输入冒险轮次,200轮挑战就是限制这个),冒险有大概率遇到 NPC 与其战斗,小概率触发随机事件,战斗与事件都会对你的各项属性造成影响,但是生命值为0会丢失此次冒险的剩余轮次。
每 0.5 秒进行一轮冒险,打印日志。

冒险终止条件:轮次消耗完毕或者生命为0。
丢失轮次:如果你选择外出冒险50轮,但是在第25轮的时候,生命为0,则会丢失剩余25轮次。

游戏结束:所有轮次消耗完毕。
3. 修为进阶
// 修为进阶表
1, 2, 4, 8, 16, 32, 64, 128...
// 当修为到达2^x的时候,会触发进阶判断,询问你是否进阶(y/n)
1. 进阶成功:随机一项能力*2
2. 进阶失败:随机一项能力/2,修为/2
3. 放弃进阶:只有进入下一阶才能继续增长修为
// 当前成为2的5次方龙之前,默认自动选择进阶

4. 修养生息

生命回复、修为提升:

5. 游戏结算
这里当我还剩下60轮游戏的时候,我选择了直接进行60轮冒险,但是直接在冒险中暴毙了...(损失60轮,有时候运气才是最重要的)
最终修为:236!成为了2的7次方龙,好弱...

三、游戏设计
3.1 事件库与 NPC 库
Key 是当前修为阶段的幂,如果是2^14,则会遇到14列表的 NPC 或者事件。通过 map + 切片的方式存储事件库与 NPC 库,空间换时间。
var (
// NPCs NPC库
NPCs = map[int][]NPC{
// 省略...
14: []NPC{
NPC{"小妖", 100, 1, 1, 1},
NPC{"中妖", 200, 2, 2, 2},
NPC{"大妖", 300, 3, 3, 3},
NPC{"哪吒", 500, 5, 5, 5},
NPC{"葫芦娃", 1000, 10, 10, 10},
NPC{"托塔天王", 2000, 20, 20, 20},
NPC{"牛魔王", 5000, 50, 50, 50},
NPC{"二郎神", 10000, 100, 100, 100},
NPC{"狐尼克", 20000, 200, 200, 200},
NPC{"朱迪警官", 50000, 500, 500, 500},
NPC{"狮子王", 100000, 1000, 1000, 1000},
},
15: []NPC{
NPC{"雅典娜", 500000, 1000, 1000, 10000},
},
16: []NPC{
NPC{"雅典娜", 500000, 2000, 2000, 20000},
},
17: []NPC{
NPC{"宙斯", 5000000, 5000, 5000, 50000},
},
18: []NPC{
NPC{"宙斯", 5000000, 10000, 10000, 100000},
},
}
// Events 事件库
Events = map[int][]Event{
0: []Event{
Event{"从龙穴中出生,获得了一本《龙族秘典》", 10, 10, 10, 5},
},
1: []Event{
Event{"从龙穴中出生,获得了一本《龙族秘典》", 10, 10, 10, 5},
},
2: []Event{
Event{"从龙穴中出生,获得了一本《龙族秘典》", 0, 0, 0, 100},
Event{"遇到了一位古老的龙族长者,传授古老龙法", 0, 0, 0, 100},
Event{"迷失在龙穴中,生命值减少,攻击力提升", -5, 5, 0, 20},
Event{"发现龙草,恢复一些生命值", 10, 0, 0, 10},
},
// 省略...
}
)
3.2 巨龙的战斗方法
回合制战斗,你死我活!
// Fight 与 NPC 战斗
func (d *Dragon) Fight(n *NPC) {
// 回合制战斗,你死我活!
for d.Life > 0 && n.Life > 0 {
if n.Attack > d.Defense {
d.Life -= n.Attack - d.Defense
}
if d.Attack > n.Defense {
n.Life -= d.Attack - n.Defense
}
}
if d.Life <= 0 {
fmt.Printf("你被%s打败了\n", n.Name)
d.Life = 0
appendExperience(d, -n.Experience)
} else {
fmt.Printf("你打败了%s\n", n.Name)
appendExperience(d, n.Experience)
}
}
3.3 巨龙遭遇事件
// Process 处理偶发事件
func (d *Dragon) Process(e *Event) {
fmt.Println(e.Name)
d.Attack += e.Attack
d.Defense += e.Defense
// 增加生命
appendLife(d, e.Life)
// 增加修为
appendExperience(d, e.Experience)
}
3.4 修为进阶函数
进阶的成功概率通过 const 常量 SuccessRate 进行控制,这里是75%。
// 修为进阶
func handleAdvance(dragon *Dragon) int {
fmt.Println("修为达到了瓶颈,是否进阶?(y/n)")
var choice string
if dragon.ExperienceStage <= 5 {
fmt.Printf("修为低于2的5次方龙,默认自动进阶")
choice = "y"
} else {
fmt.Scanln(&choice)
}
if choice == "y" {
if rand.Float64() <= SuccessRate {
fmt.Println("恭喜,修为成功进阶!")
randomIncrease(dragon)
return 0
} else {
fmt.Println("很遗憾,修为进阶失败。")
randomDecrease(dragon)
return 1
}
}
fmt.Println("你选择了放弃进阶。")
return 2
}
3.5 修养生息
恢复生命值,并增长修为。
// 修养生息
func toHeal(dragon *Dragon, turn int) {
fmt.Printf("你开始修养生息,恢复生命值,并增长修为\n")
for turn > 0 {
turn--
dragon.Remaining--
fmt.Printf("修养中ing...\n剩余寿命 %d 轮\n", dragon.Remaining)
appendLife(dragon, int(float64(dragon.MaxLife)*HealingRate)+1)
appendExperience(dragon, int(float64(dragon.Experience)*HealingRate)+1)
printStatus(dragon)
if isGameOver(dragon) {
break
}
time.Sleep(500 * time.Millisecond)
}
}
3.6 外出冒险
小概率遭遇事件,大概率遭遇 NPC。
// 外出冒险
func toAdventure(dragon *Dragon, turn int) {
fmt.Printf("你开始外出冒险,增长修为\n")
for turn > 0 {
if dragon.Life <= 0 {
dragon.Remaining -= turn
fmt.Printf("你已经死亡,无法继续冒险!丢失%d冒险回合,请按1修养生息!!!!!!!!\n", turn)
break
}
turn--
dragon.Remaining--
fmt.Printf("\n剩余寿命 %d 轮\n", dragon.Remaining)
rad := rand.Float64()
if rad <= NPCChance {
event := Events[dragon.ExperienceStage][rand.Intn(len(Events[dragon.ExperienceStage]))]
dragon.Process(&event)
} else if rad <= NPCChance+EventChance {
npc := NPCs[dragon.ExperienceStage][rand.Intn(len(NPCs[dragon.ExperienceStage]))]
dragon.Fight(&npc)
} else {
fmt.Println("你踏入了一片宁静的山林,潜心修炼")
appendExperience(dragon, int(float64(dragon.Experience)*HealingRate)*2+1)
}
printStatus(dragon)
if isGameOver(dragon) {
break
}
time.Sleep(500 * time.Millisecond)
}
}
四、小结
你长达200轮的一生真是波澜壮阔,你达成了以下成就:
姓名:白泽,修为:236,称号:2的7次方龙,攻击力:70,防御力:2225,生命值:0,剩余寿命:0轮
游戏代码在我的开源 Go 学习仓库的
dragon路径下,可以直接运行可执行程序体验。这里也向大家发起挑战:200轮次内,挑战可以获取的最高修为值!欢迎加q群分享:622383022,或者评论区展示你的战绩!
《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启的更多相关文章
- 只用120行Java代码写一个自己的区块链
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...
- 只用200行Go代码写一个自己的区块链!
Coral Health · 大约23小时之前 · 220 次点击 · 预计阅读时间 7 分钟 · 不到1分钟之前 开始浏览 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大 ...
- 只用200行Go代码写一个自己的区块链!(转)
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...
- 只用120行Java代码写一个自己的区块链-3挖矿算法
在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...
- 只用120行Java代码写一个自己的区块链-2网络
已经看完第一章的内容了吗,欢迎回来. 上一章我们介绍了关于怎么去编写自己的区块链,完成哈希和新块的校验.但是它只是在一个终端(结点)上跑.我们怎么样来连接其他结点以及贡献新的块呢,怎么样广播到其他结点 ...
- 只用120行Java代码写一个自己的区块链-4实现真正的p2p网络
在之前的文章中,我们模拟了节点网络通讯,很多朋友反馈说,他们想看真正的节点网络通讯而不是单节点的模拟.本章将满足你们.
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
随机推荐
- java协程操作mysql数据库
我的项目: nanshaws/nettyWeb: 复习一下netty,并打算做一个web项目出来 (github.com) 最近在项目中分别添加了虚拟线程操作mysql数据库,和用协程操作mysql数 ...
- 使用MapStruct出现了No property named "productId" exists in source parameter(s). Type "Product" has no properties.
pom.xml <properties> <maven.compiler.source>17</maven.compiler.source> <maven.c ...
- 反向 Debug 了解一下?揭秘 Java DEBUG 的基本原理
Debug 的时候,都遇到过手速太快,直接跳过了自己想调试的方法.代码的时候吧-- 一旦跳过,可能就得重新执行一遍,准备数据.重新启动可能几分钟就过去了. 好在IDE 们都很强大,还给你后悔的机会,可 ...
- .Net中的AutoScrollPosition问题 (panel 滚动条的位置设定)
本文转自:http://www.cnblogs.com/h2appy/archive/2008/04/23/1167400.html 有Panel类型的窗体panel1,其AutoScroll设为了T ...
- 冲刺秋招之牛客刷Java记录第二天
第一题 下列代码输入什么? public class Test { public static Test t1 = new Test(); { System.out.println("blo ...
- Python——第一章:用户交互
变量 = input(提示语)首先会在屏幕中显示出提示语, 用户输入内容. 然后把用户输入的内容交给前面的变量 案例1: a = input("请输入第一个数字:") #括号里是提 ...
- 案例分享-Exception.getMessage突然为null
背景 之前做的小工具一个jsqlparse+git做的小工具帮我节省时间摸鱼昨天突然停止工作,看了下jvm并没有退出,但是看日志确实有不少Error输出,虽说是一个普通的NPE,但是分析了一下却疑点重 ...
- 2023-08-26:请用go语言编写。开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A、B、C、D四个球队,且每个村民只会喜欢其中的一支球队, 但是说
2023-08-26:请用go语言编写.开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A.B.C.D四个球队,且每个村民只会喜欢其中的一支球队, 但是说 ...
- 华为云API Explorer:自动化运维的得力助手
华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放API,支持全量快速检索.可视化调试.帮助文档.代码示例等能力,帮助开发者快速学习API,使用API开发代 ...
- 一文带你认识MindSpore新一代分子模拟库SPONGE
[本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:基于MindSpore自动并行.图算融合等特性,SPONGE可高效地完成传统分子模拟过程,利用Mi ...