《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启

一、前言

新年就要到了,祝大家新的一年:🐲 龙行龘龘,🔥 前程朤朤!

白泽花了点时间,用 500行 Go 代码写了一个控制台的小游戏:《模拟龙生》,在游戏中你将模拟一条新生的巨龙,开始无尽的冒险!

Tips:运气很重要!不然会抓狂!还有游戏可能有些小 BUG,你那么帅,一定不好意思说我(欢迎 pr)。

游戏玩法图解:

image-20240119100821996

🐲 游戏代码在我的开源 Go 学习仓库的dragon路径下,可以直接运行可执行程序体验(win64/mac 均可)。

仓库里还包含 Go 各阶段学习文章、读书笔记、电子书、简历模板等,欢迎 star。

image-20240119102429937

二、游戏玩法

🐲 《模拟龙生》大部分游戏时间都是挂机冒险,不占用大家时间~

游戏的目的是在指定轮次的游戏回合内,想方设法获得最高的修为!

攻略:

  1. 初始防御力可以高一点,战斗是回合制,防御力性价比高!
  2. 战斗你是先手,点高额攻击也是不错的选择!
  3. 没血后必须返回修养,身体是革命的本钱!
  4. 进阶成功概率75%,进阶成功提升某项能力,失败降低,进阶失败修为/2,越到后期越要谨慎,你的目的是在有限次轮数内获得尽可能高的修为!
  5. 🍀 运气真的很重要!心态要好!作者是无辜的!

1. 初始化

  • 起一个你喜欢的名字!然后分配100点能力值到三维属性。
  • 攻击力:当冒险遇到 NPC 时,会与其发生回合制战斗,每回合你对它可以造成:你的攻击力 - NPC 防御力的伤害。
  • 防御力:当冒险遇到 NPC 时,会与其发生回合制战斗,每回合它对你可以造成:NPC 的攻击力 - 你防御力的伤害。
  • 生命值:战斗和触发事件造成生命值为0均无法继续冒险,必须返回休养生息(每秒恢复最大生命值10%)。
  • 输入整个游戏的轮次:这里输入200轮。

🐲 这里也向大家发起挑战:200轮次内,挑战可以获取的最高修为值!欢迎加q群分享:622383022,或者评论区展示你的战绩!

image-20240119102637116

2. 外出冒险

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

🐲 每 0.5 秒进行一轮冒险,打印日志。

image-20240119104025273

🐲 冒险终止条件:轮次消耗完毕或者生命为0。

🐲 丢失轮次:如果你选择外出冒险50轮,但是在第25轮的时候,生命为0,则会丢失剩余25轮次。

image-20240119104240812

🐲 游戏结束:所有轮次消耗完毕。

3. 修为进阶

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

image-20240119105108313

4. 修养生息

image-20240119105201498

🐲 生命回复、修为提升:

image-20240119105602631

5. 游戏结算

🐲 这里当我还剩下60轮游戏的时候,我选择了直接进行60轮冒险,但是直接在冒险中暴毙了…(损失60轮,有时候运气才是最重要的)

最终修为:236!成为了2的7次方龙,好弱…

image-20240119105911030

三、游戏设计

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,或者评论区展示你的战绩!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/332977.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统三剑客之grep和正则表达式的介绍(一)

1.正则表达式 目录 1.正则表达式 1.什么是正则表达式 &#xff1f; 2.正则表达式的使用场景 3.正则表达式字符表示 4.它们之间的区别 2.grep命令 作用&#xff1a; 语法&#xff1a; 说明&#xff1a; 选项&#xff1a;options 重点 实例 3.后面的下次再更新。 …

C语言位域定义与使用

参考文章&#xff1a; 【C语言】详解位域定义与使用_c 语言定义位-CSDN博客 代码有修改&#xff0c;主要是变量初始化&#xff0c;原程序可能相应内存不能写。且第二个字节F不好区分各位。 #include <stdio.h>typedef struct {unsigned short b1 : 1;unsigned short b…

情人节专属--HTML制作情人节告白爱心

💕效果展示 💕html展示 <!DOCTYPE html> <html lang="en" > <head>

ros2仿真学习04 -turtlebot3实现cartographer算法建图演示

安装看这里 https://blog.csdn.net/hai411741962/article/details/135619608?spm1001.2014.3001.5502 虚拟机配置&#xff1a; 内存16g cpu 4 核 磁盘40G,20G 不够 启动仿真 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py启动成功如下 启动建图 重新开一个…

浅谈情绪的分类合集

什么是情绪分类 情绪分类&#xff0c;是指区分或者对比一种情绪与另一种情绪的方法&#xff0c;目前在情绪研究&#xff08;emotion research&#xff09;与情感科学&#xff08;affective science&#xff09;是具有争议的问题。有两个讨论情绪分类的基本观点&#xff1a; 情…

【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

实验5&#xff1a;Tomasulo 算法模拟和分析 一、实验目的 1&#xff1a;加深对指令级并行性及开发的理解。 2&#xff1a;加深对 Tomasulo 算法的理解。 3&#xff1a;掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处…

CC工具箱使用指南:【用地用海指标汇总】

一、简介 在湘源上画的规划用地图&#xff0c;想导出规划指标表是很容易的。 但是现在很多用地图最终是要在ArcGIS中处理的&#xff0c;想再导出指标表就比较麻烦。 这个工具的主要功能就是在ArcGIS中汇总统计&#xff0c;生成类似湘源的Excel格式用地指标表。 二、工具参数…

20240117在本地机器识别OCR法语电影的字幕效果PK

20240117在本地机器识别OCR法语电影的字幕效果PK 2024/1/17 11:18 1959 - Jirai Cracher Sur Vos Tombes [Gast, Vian].avi https://www.pianbar.net//drama/52892.html 1959[我唾弃你的坟墓]Jirai cracher sur vos tombes[BT下载/迅雷下载] magnet:?xturn:btih:7c9c99d9d048…

【备战蓝桥杯】图论重点 敲黑板啦!

蓝桥杯备赛 | 洛谷做题打卡day11 文章目录 蓝桥杯备赛 | 洛谷做题打卡day11杂务题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 杂务 题目描述 John 的农场在给奶牛挤奶前有很多杂务要完成&#xff0c;每一项杂务都需要一定的时间来完成它。比如&a…

canvas绘制不同样式的六角星(示例源代码)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

Python如何便捷的执行JavaScript代码,调用JS函数

文章目录 📖 介绍 📖🏡 环境 🏡📒 实现方法 📒📝 安装📝 使用⚓️ 相关链接 ⚓️📖 介绍 📖 Python在写一些爬虫代码的时候经常需要接触到JS逆向,其中如何让Python便捷的执行JS代码就成了一个很关键的问题,本文分享一种便捷的方式实现这个需求。 🏡 环…

司铭宇老师:二手房地产中介销售培训:二手房经纪人必备的七种销售能力

二手房地产中介销售培训&#xff1a;二手房经纪人必备的七种销售能力 在房地产行业中&#xff0c;二手房经纪人扮演着至关重要的角色。他们需要具备一系列的销售能力&#xff0c;以便更好地为客户服务&#xff0c;实现业绩增长。本文将详细介绍二手房经纪人必备的七种销售能力…

带你解析Git的基础功能(三)

文章目录 前言一.远程仓库的概念二.远程仓库的操作2.1新建远程仓库2.2 克隆远程仓库2.3 向远程仓库推送2.4 拉取远程仓库2.5 忽略特殊⽂件2.6 标签管理 三.Git实战场景3.1 Git多人实战场景一准备工作由开发者1和开发者2新增加文件内容。将dev的文件合并到master上总结 3.2 Git多…

20240118-最小下降路径总和

昨天的爬楼梯以前写过&#xff0c;是一道基础的动态规划&#xff0c;就不重新写了。 题目要求 给定一个n*n的矩阵数组&#xff0c;返回通过矩阵的任何下降路径的最小和。 下降路径从第一行中的任何元素开始&#xff0c;并选择下一行中正下方或左右对角线的元素。具体来说&am…

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程 1&#xff09;系统架构1.1.系统成员组成1.2.作业提交流程 2&#xff09;核心概念2.1. 并行度&#xff08;Parallelism&#xff09;2.1.1.并行子任务和并行度2.1.2.并…

如何无公网ip使用Potplayer访问群晖NAS中储存的本地资源【内网穿透】

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

2023 年顶级前端工具

谁不喜欢一个好的前端工具&#xff1f;在本综述中&#xff0c;您将找到去年流行的有用的前端工具&#xff0c;它们将帮助您加快开发工作流程。让我们深入了解一下&#xff01; 在过去的 12 个月里&#xff0c;我在我的时事通讯 Web Tools Weekly 中分享了数百种工具。我为前端…

Flink TaskManager内存管理机制介绍与调优总结

内存模型 因为 TaskManager 是负责执行用户代码的角色&#xff0c;一般配置 TaskManager 内存的情况会比较多&#xff0c;所以本文当作重点讲解。根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用&#xff0c;增强作业运行的稳定性。 TaskManager 内…

Android Dialog setCanceledOnTouchOutside失效,点击dialog外面不消失

前言&#xff1a;有一个需求需要点击dialog外面要消失&#xff0c;本来以为很简单结果设置了一直未生效 setCanceledOnTouchOutside(true); 问了半天chat-gpt4结果给的答案都不明显 查看代码发现设置了style&#xff0c;于是尝试去除这个style&#xff0c;结果点击setCancele…

如何进行高效过滤器检漏:法规标准对比及检漏步骤指南

高效检漏光度计扫描法作为一种关键的高效过滤器检漏手段&#xff0c;在国内受到广泛应用。为确保其有效性和合规性&#xff0c;国内相关法规和标准对其进行了详细规定。本文将对比相关法规&#xff0c;并特别关注检漏过程中的详细步骤。 关于中邦兴业 北京中邦兴业科技有限公司…