《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
2024/1/19 14:32:24
本文主要是介绍《模拟龙生》|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代码写一个随机冒险游戏|巨龙修为挑战开启的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站