他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险

这篇具有很好参考价值的文章主要介绍了他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

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

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

3天前的《🐲模拟龙生|500行Go代码写一个随机冒险游戏|巨龙修为挑战》文章中已经对核心玩法和游戏核心架构做了介绍,但是第一版实在是写得匆忙,编码不够优雅。

🌟幸得热心同学提了 pr 优化了部分代码逻辑,甚至凌晨1:30给游戏加了 UI,在这个基础上,白泽也为游戏增加了排行榜功能,这篇文章讲解一下相比3天前,《模拟龙生》的一些架构上的变化以及玩法的更新。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

🌟 游戏更新主要包含:

  • 使用 termdash(基于终端窗口的跨平台仪表盘)作为 UI。

  • 架构升级,使用 channel 传递游戏内所有 IO 内容,面向协程编程。

  • 增加排行榜玩法。

公众号 「白泽talk」,我也开源了一个 Go 学习仓库:包含我写作的 Go 各阶段学习文章、读书笔记、电子书、简历模板等,欢迎 star。

白泽目前正在打造一个氛围良好的行业交流群(游戏交流群),文章的更新也会提前预告,欢迎加入:622383022。

二、核心玩法

  • 玩法流程:

具体参详前一篇文章,后续也会尽快在仓库的 README 部分更新新增内容玩法手册。

游戏核心玩法:挂机、打怪、冒险、修炼。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

  • 游玩体验(gif):
    1. 分配100点能力值,并进行x轮冒险,这里我输入100。
    2. 选择2开始冒险,进行50轮,但冒险中第41轮意外死亡,丢失9轮冒险次数。
    3. 选择1返回修养,进行10轮,恢复生命值和提升修为。
    4. 选择2开始冒险,进行40轮,最后获得修为2093进入排行榜第三名。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

三、更新内容

3.1 termdash 构建 UI

Termdash 是一款基于终端的跨平台定制仪表盘。只要将需要展示的消息,发送给 termdash 库负责 UI 展示的结构体,则可以将其以仪表盘的形式,动态展示更新。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

《模拟龙生》将游戏 UI 区域分成历史记录区、排行榜区、数值区、操作提示区、输入区。

界面布局

termdash 的界面布局与 HTML 的 div 布局有些相似,通过 container 将区域进行分割,可以水平分割也可以垂直分割,下面这段代码就是 dragon 游戏当中,历史记录区域与排行榜区域布局。

container.SplitPercent(50) 这行代码表示各占百分之五十空间。

// 历史记录区域布局 & 排行榜区域布局
container.Right(
   container.SplitVertical(
      container.Left(
         container.PlaceWidget(historyPanel),
         container.BorderTitle(HistoryAreaBorderTitle),
         container.Border(HistoryAreaBorderStyle),
         container.BorderColor(HistoryAreaBorderColor),
         container.KeyFocusSkip(),
      ),
      container.Right(
         container.PlaceWidget(rankPanel),
         container.BorderTitle(RankAreaBorderTitle),
         container.Border(RankAreaBorderStyle),
         container.BorderColor(RankAreaBorderColor),
         container.KeyFocusSkip(),
      ),
      container.SplitPercent(50),
   ),
),

3.2 使用 channel 传递消息

整个游戏的左下角是用户唯一的输入区域,通过捕获用户的输入,触发相遇的游戏逻辑之后,通过 channel 将数据发送到对应的 container 区域进行展示。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

每一个游戏区域,在 printer 结构体中,都有对应的属性字段,比如 historyText 字段对应着“龙生经历”区域,而每一个区域也都有对应的一个channel 用于接收消息,如 history 就是用于接收龙生经历的 channel。

// 创建消息打印器结构体
p := &printer{
   terminal:        terminal,
   ctx:             ctx,
   container:       c,
   // 历史记录消息接收
   history:         make(chan historyInfo),
   // 历史记录区域 UI
   historyText:     historyPanel,
   rank:            make(chan rankInfo),
   rankText:        rankPanel,
   operateHintText: operationHint,
   operateHint:     make(chan string),
   scanned:         make(chan string),
   flushChannel:    make(chan struct{}),
   values:          values,
   experienceBar:   experience,
   hpBar:           hpBar,
   keyBinding: func(k *terminalapi.Keyboard) {
      // Ctrl + W 退出
      if k.Key == keyboard.KeyCtrlW {
         cancel()
         os.Exit(0)
      }

      // Enter 完成输入
      if k.Key == keyboard.KeyEnter {
         value := inputs.ReadAndClear()
         p.scanned <- value
      }
   },
}
// 更新数值面板区域
go p.updateValuesPanel()
// 接收并打印龙的经历到历史经历区域
go p.receiveHistory()
// 接收并打印操作提示语区域
go p.receiveOperateHint()
// 接收并打印信息到排行榜区域
go p.receiveRank()

只有先从 channel 中获取到了消息,才能将消息在对应 UI 区域展示。以龙的冒险为例,如果龙正在参与冒险,则每过0.5秒会在龙生经历(历史记录)区域打印一条记录,如:剩余寿命 xxx 轮,你打败了 xxx,修为增加 xxx

而UI 上的内容展示与程序执行关系如下:

  1. 提前启动 go 协程监听 history 这个 channel,获取要打印到 UI 区域的龙的经历。(调用的是 p.receiveHistory())。
  2. 每隔0.5秒处理业务,将需要打印的信息发送给 p.history 这个 channel。
// 接收历史数据,并换行
func (p *printer) addHistoryLn(info historyInfo) {
	info.info += "\n"
	p.history <- info
}

// 接收历史数据处理方法
func (p *printer) receiveHistory() {
   go func() {
      for {
         select {
         case info := <-p.history:
            p.historyText.Write(info.info, info.options...)
         }
      }
   }()
}

游戏中所有 UI 区域的内容都是通过最终调用 p.xxx.Write() 方法输出到 UI 仪表盘上的,而诸如 historyText 这个属性对应的数据类型,都是 termdash 库所提供的。

3.3 排行榜玩法

在游戏开始之初会打印之前历史记录中,最终获得经验值最高的10条记录,降序排列。并在游戏正常结束(非 CTRL + W 形式结束)后,如果进入前十,则更新榜单。

他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险,golang,游戏,开源,开源,游戏,ui

排行榜的实现:

  1. sqlite3 作为数据库,对应 rank.db 文件,运行程序时如果不存在则会自动创建。
  2. 对应的数据结构和数据处理方法:
// 创建消息打印器结构体
p := &printer{
   // rank 数据接收 channel
   rank:            make(chan rankInfo),
   // rank UI 区域
   rankText:        rankPanel,
}
// 接收并打印信息到排行榜区域
go p.receiveRank()

// 接收排行榜数据,并换行
func (p *printer) addRankLn(info rankInfo) {
	info.info += "\n"
	p.rank <- info
}

// 展示排行榜
func showRank(ranks []*Rank, rank *Rank) {
	p.rankText.Reset()
	for i, r := range ranks {
		s := fmt.Sprintf("第%v名,龙的ID:%v,名称:%v,经验值:%v,攻击力:%v,防御力:%v,生命值:%v", i+1, r.DragonID, r.Name, r.Experience, r.Attack, r.Defense, r.Life)
		if r.equal(rank) {
			s = "👑" + s
		}
		s = s + "\n"
		p.addRankLn(newRankInfo(s))
	}
}

四、小结

🌟 下一阶段的打算

  • 趣味性:优化 NPC 和随机事件的内容。

  • 功能性:待定

欢迎评论对《模拟龙生》游玩的体验,有好的想法也可以一起交流,当然也欢迎多多 pr。文章来源地址https://www.toymoban.com/news/detail-820846.html

到了这里,关于他凌晨1:30给我开源的游戏加了UI|模拟龙生,挂机冒险的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NOIP2023模拟9联测30-金牌

    link 记 d u d_u d u ​ 表示 u u u 到 1 1 1 的距离。 预处理出 s u m u = ∑ v ∈ T u 2 d v − d u sum_u=sumlimits_{vin T_{u}}2^{d_v-d_u} s u m u ​ = v ∈ T u ​ ∑ ​ 2 d v ​ − d u ​ 。 考虑两种情况 x x x 和 y y y 都不是 l c a lca l c a 。答案就是 2 dis ⁡ ( x , y ) ∑ u ∈ T x 2 d u − d x ∑ v ∈ T y 2 d v

    2024年02月06日
    浏览(32)
  • JVM实战(30)——模拟堆内存溢出

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月25日
    浏览(50)
  • 开源虚拟现实引擎。CARLA是一个基于Unreal Engine 4开发的游戏引擎,支持模拟各种汽车、摩托车、轨道交通信号等车辆的行驶行为,并且提供了一套API接口,供开发者进行调用,用来进行地图构建

    作者:禅与计算机程序设计艺术 目前,市面上存在多个智能汽车解决方案,包括滴滴、理想汽车、百度无人驾驶等,均由大型科技公司或各个公司开发,其中一些公司如理想汽车、百度、字节跳动等已经取得了较为丰硕的成果。随着技术的发展,人们越来越关注智能汽车在未

    2024年02月08日
    浏览(52)
  • 【Arduino30】DS1302时钟芯片模拟值实验

    DS1302芯片:1片 32.768kHz晶振:1个 面包板:1个 杜邦线:若干 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。 DS1302常用于以下场景: 电子时钟和钟表: DS1302可以通过

    2024年02月09日
    浏览(49)
  • 边玩边学,30个Python小游戏(含源码)

    大家好,我是小F~ 经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享 30个Python小游戏 ,教你如何通过边打游戏边学编程! 相关文件及

    2024年02月14日
    浏览(37)
  • 好可怕!情侣住酒店凌晨被人开门闯入

    近日,深圳南山区一家酒店的服务员的不当行为引发了隐私权的问题。 据媒体报道,5月13日凌晨,王先生和女友在深圳南山区一家酒店入住,凌晨2点二人已经熟睡,突然有人推门而入。 经调查发现,闯入的人竟然是酒店的男服务员。 好可怕,半夜三更突然有人进来真的可怕

    2024年02月05日
    浏览(25)
  • 【深度学习:MPT-30B】提高开源基础模型的标准

    隆重推出 MPT-30B,它是我们开源模型基础系列中功能更强大的新成员,在 NVIDIA H100 Tensor Core GPU 上使用 8k 上下文长度进行训练。 在这里尝试 HuggingFace 上的 MPT-30B-Chat! 自 5 月份推出 MPT-7B 以来,ML 社区热切地接受开源 MosaicML 基础系列模型。 MPT-7B 基础、-Instruct、-Chat 和 -Story

    2024年02月22日
    浏览(40)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(69)
  • 新挂机赚钱项目,闲置手机,电脑挂机赚钱的方法

    新标题:利用闲置手机和电脑挂机赚钱的全新项目,轻松实现 passively income 文章: 近年来,随着科技的不断进步,挂机赚钱成为一种备受关注的赚钱方式。通过利用闲置的手机和电脑,在不占用太多时间和精力的前提下,可以实现被动收入。本文将介绍一个全新的挂机赚钱项

    2024年02月04日
    浏览(48)
  • 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域。 在本项目中,使用了51单片机作为主

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包