yangjiaxu

  • 2024-07-12
  • 加入了学习《直播回放: 使用低成本 MSPM0 MCU 快速开发》,观看 使用低成本 MSPM0 MCU 快速开发

  • 2024-07-04
  • 回复了主题帖: 《Rust实战》书友互动剧终:信号、中断和异常

    rust的中断都包含了什么?是CPU有紧急事情处理会产生中断?还是程序崩溃会有中断呢?

  • 回复了主题帖: 《Rust实战》3.利用Rust来编写STM32的LED控制代码

    lugl4313820 发表于 2024-7-4 07:44 大佬什么时候带带我搞定开发环境呀。开发环境这临门一脚有点难呀。 这个环境倒是简单一些,就是先改变源,改成国内的源,不然需要等很久,这个网上讲安装rust的时候就有,其实就是改变环境变量,添加我们需要配置环境变量 RUSTUP_DIST_SERVER(默认指向 https://static.rust-lang.org)和 RUSTUP_UPDATE_ROOT (默认指向https://static.rust-lang.org/rustup),让其指向国内源,参考链接https://zhuanlan.zhihu.com/p/655386777。然后是安装一些必要的工具,举例说我用到文件转换rust-objcopy工具,自己安装一下就好了,命令是:cargo install rust-objcopy,跟Linux安装软件一样;最后就是找到一个靠谱且好用的rust的例程,因为刚开始cargo.toml这种都不会写的。不知道加哪个不加哪个。推荐看看这个例程,真的很全,https://github.com/stm32-rs/stm32f1xx-hal?tab=readme-ov-file 根据例程自己摸索如何搞嵌入式开发就好了。不过这种就是图一新鲜,我觉得rust做嵌入式开发还是不方便,还是按照作者的想法,做一些后端服务器之类的开发吧

  • 2024-07-03
  • 发表了主题帖: 《Rust实战》4.利用Rust来编写STM32的RC522驱动代码

    上一章实现了利用Rust编程来控制STM32F103实现LED的闪烁功能,这一章继续完善一下,将实现利用Rust编程来控制STM32F103驱动RC522进行读卡操作。RC522大家都知道,是一款射频识别芯片,其模块是RFID-RC522,是一款小蓝板,其采用SPI接口与MCU通讯,是比较常用且简单的射频通讯模块。今天我们就用它来实现射频识别。 代码如下: #![deny(unsafe_code)] #![no_main] #![no_std] use panic_itm as _; use cortex_m::iprintln; use cortex_m_rt::entry; use embedded_hal::digital::v1_compat::OldOutputPin; use embedded_hal::spi::{Mode, Phase, Polarity}; use mfrc522::Mfrc522; use stm32f1xx_hal::{pac, prelude::*, spi::Spi}; pub const MODE: Mode = Mode { polarity: Polarity::IdleLow, phase: Phase::CaptureOnFirstTransition, }; #[entry] fn main() -> ! { let mut cp = cortex_m::Peripherals::take().unwrap(); let dp = pac::Peripherals::take().unwrap(); let _stim = &mut cp.ITM.stim[0]; let rcc = dp.RCC.constrain(); let mut afio = dp.AFIO.constrain(); let mut flash = dp.FLASH.constrain(); let mut gpioa = dp.GPIOA.split(); let mut gpioc = dp.GPIOC.split(); let clocks = rcc.cfgr.freeze(&mut flash.acr); let sck = gpioa.pa5.into_alternate_push_pull(&mut gpioa.crl); let miso = gpioa.pa6; let mosi = gpioa.pa7.into_alternate_push_pull(&mut gpioa.crl); let spi = Spi::spi1( dp.SPI1, (sck, miso, mosi), &mut afio.mapr, MODE, 1.MHz(), clocks, ); let nss = gpioa.pa4.into_push_pull_output(&mut gpioa.crl); let mut mfrc522 = Mfrc522::new(spi, OldOutputPin::from(nss)).unwrap(); let mut delay = cp.SYST.delay(&clocks); let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh); led.set_high(); loop { if let Ok(atqa) = mfrc522.reqa() { if let Ok(uid) = mfrc522.select(&atqa) { //println!(_stim, "* {:?}", uid.as_bytes()); led.set_low(); delay.delay_ms(1_000_u16); } } led.set_high(); delay.delay_ms(1_000_u16); } }   这里主要利用了MCU的接口有:NSS-PA4、SCK-PA5、MISO-PA6、MOSI-PA7和LED-PC13。其主要逻辑是当利用RC522识别到IC卡的UID的时候,就控制LED进行亮1秒,如果再检测到卡继续亮起,如果检测不到卡之后,LED熄灭,并且延时1秒之后再继续检测IC卡。 图1 检测到IC卡 图2 正常状态下,没有检测到IC卡的效果 总结:本章主要的难点就是调用外设SPI,需利用该函数实现use stm32f1xx_hal::{pac, prelude::*, spi::Spi};同时,原来本想使用标准库模块中的delay,后来发现冲突了,因为本次程序已经禁止使用标准库模块,所以需要使用let mut delay = cp.SYST.delay(&clocks);来实现delay功能。总的来说,Rust确实是一款不错的语言,但是在驱动MCU方面,我觉得资料较少,同时需要有一定Rust基础才可能做到很熟练的在嵌入式方面开发,本书籍主要是以后台服务开发方面展开讲解的,确实是少有的实战类书籍,在这里也要感谢eeworld的试读活动,非常有意义,又可以多一点点知识的拓展~

  • 回复了主题帖: 《Rust实战》3.利用Rust来编写STM32的LED控制代码

    lugl4313820 发表于 2024-7-3 18:15 我搞了几天没有搞定,然后就没有然后了。。。 哈哈哈 感觉很麻烦,尤其是配置环境的时候真的懵

  • 发表了主题帖: 《Rust实战》3.利用Rust来编写STM32的LED控制代码

    本帖最后由 yangjiaxu 于 2024-7-3 14:31 编辑 大家好,上一篇说道搭建rust的开发环境在Windows上,并且使用vscode来作为辅助开发,《Rust实战》2.环境测试与vscode的环境搭建与应用 https://bbs.eeworld.com.cn/thread-1281652-1-1.html其实那篇还是比较简单的,我当时申请是想利用rust语言来开发STM32,当时想的是rust的优势是内存方面的管理,恰好当时遇到个问题就是关于内存方面的,所以就心血来潮的想利用rust语言试试,说归说,接下来就将rust应用在STM32上。 大家都知道STM32F103属于arm内核,因此需要让rust来支持arm才行,因此,需要安装, rustup target install thumbv7m-none-eabi rustup target install thumbv7m-none-eabi 是 Rust 工具链管理器 rustup 的一个命令,用于安装特定的目标(target)。这个目标 thumbv7m-none-eabi 是针对 ARM Cortex-M 系列处理器的,特别是那些支持 Thumb-2 指令集的处理器。 具体来说: thumbv7m 表示目标架构是 Thumb-2 指令集的 ARMv7-M 架构。 none 表示没有操作系统(bare-metal)。 eabi 表示嵌入式应用程序二进制接口(Embedded Application Binary Interface)。 安装这个目标后,你可以使用 Rust 编译器 rustc 或构建工具 cargo 来编译代码,生成可以在 ARM Cortex-M 系列处理器上运行的二进制文件。这对于开发嵌入式系统、微控制器项目非常有用。 安装完之后需要创建一个工程,可以使用命令行的方式进行创建,如下图所示: 创建成功之后,需要修改Cargo.toml,这个主要修改的目的是添加一些依赖项,说实话我是不会添加这些,所以本着拿来主义就好。 [dependencies] embedded-hal = "0.2.7" nb = "1" cortex-m = "0.7.6" cortex-m-rt = "0.7.1" # Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives panic-halt = "0.2.0" [dependencies.stm32f1xx-hal] version = "0.10.0" features = ["rt", "stm32f103", "medium"] 接下来需要创建.cargo/config and memory.x,主要是配置编译链和目标芯片的存储方面的信息。 接下来就可以进行程序编写了,在上文创建好的main.rs中,将以下代码复制进去: //! Blinks an LED //! //! This assumes that a LED is connected to pc13 as is the case on the blue pill board. //! //! Note: Without additional hardware, PC13 should not be used to drive an LED, see page 5.1.2 of //! the reference manual for an explanation. This is not an issue on the blue pill. #![deny(unsafe_code)] #![no_std] #![no_main] use panic_halt as _; use nb::block; use cortex_m_rt::entry; use stm32f1::stm32f103::gpioa; use stm32f1xx_hal::{pac, prelude::*, timer::Timer}; #[entry] fn main() -> ! { // Get access to the core peripherals from the cortex-m crate let cp = cortex_m::Peripherals::take().unwrap(); // Get access to the device specific peripherals from the peripheral access crate let dp = pac::Peripherals::take().unwrap(); // Take ownership over the raw flash and rcc devices and convert them into the corresponding // HAL structs let mut flash = dp.FLASH.constrain(); let rcc = dp.RCC.constrain(); // Freeze the configuration of all the clocks in the system and store the frozen frequencies in // `clocks` let clocks = rcc.cfgr.freeze(&mut flash.acr); // Acquire the GPIOC peripheral let mut gpioa = dp.GPIOA.split(); // Configure gpio C pin 13 as a push-pull output. The `crh` register is passed to the function // in order to configure the port. For pins 0-7, crl should be passed instead. let mut led = gpioa.pa8.into_push_pull_output(&mut gpioa.crh); // Configure the syst timer to trigger an update every second let mut timer = Timer::syst(cp.SYST, &clocks).counter_hz(); timer.start(1.Hz()).unwrap(); // Wait for the timer to trigger an update and change the state of the LED loop { block!(timer.wait()).unwrap(); led.set_high(); block!(timer.wait()).unwrap(); led.set_low(); } }   这段代码是一个嵌入式 Rust 程序,用于在 STM32F1 微控制器上闪烁连接到 PA8 引脚的 LED。由于担心很多人可能会看不懂,逐行进行了代码解释,解释如下: #![deny(unsafe_code)]:禁止使用 unsafe 代码。 #![no_std]:不使用标准库 std,而是使用嵌入式系统常用的 core 库。 #![no_main]:不使用标准的 main 函数入口,而是使用嵌入式系统常用的入口点。 use panic_halt as _;:导入 panic_halt 库,用于处理 panic 情况。 use nb::block;:导入 nb 库的 block 模块,用于阻塞等待操作。 use cortex_m_rt::entry;:导入 cortex_m_rt 库的 entry 宏,用于定义程序入口点。 use stm32f1xx_hal::{pac, prelude::*, timer::Timer};:导入 stm32f1xx_hal 库的相关模块。 #[entry]:定义程序的入口点。 fn main() -> !:定义一个无限循环的 main 函数。 let cp = cortex_m::Peripherals::take().unwrap();:获取 Cortex-M 内核的外设。 let dp = pac::Peripherals::take().unwrap();:获取 STM32F1 设备的外设。 let mut flash = dp.FLASH.constrain();:获取并约束 Flash 外设。 let rcc = dp.RCC.constrain();:获取并约束 RCC(复位和时钟控制)外设。 let clocks = rcc.cfgr.freeze(&mut flash.acr);:冻结时钟配置并获取时钟频率。 let mut gpioa = dp.GPIOA.split();:获取 GPIOA 外设。 let mut led = gpioc.pa8.into_push_pull_output(&mut gpioa.crh);:配置 PA8 引脚为推挽输出模式。 let mut timer = Timer::syst(cp.SYST, &clocks).counter_hz();:配置系统定时器。 timer.start(1.Hz()).unwrap();:启动定时器,设置定时器触发频率为 1 Hz。 loop { block!(timer.wait()).unwrap(); led.set_high(); block!(timer.wait()).unwrap(); led.set_low(); }:无限循环,等待定时器触发,切换 LED 状态。 这段代码通过配置 GPIO 和定时器,实现了在 STM32F1 微控制器上闪烁连接到 PA8 引脚的 LED。 当代码编辑好了之后,需要进行编译了 cargo build --features stm32f103 --example blinky 我是直接在例程的基础上进行的,所以当时名字没有修改,是blinky,在example文件夹下的blinky进行编译,编译好之后,会生成blinky文件,这个文件是不可执行文件,需要将其转换为bin可烧录的二进制文件,需要下面的命令: rust-objcopy -O binary target/thumbv7m-none-eabi/debug/examples/blinky blinky.bin 这个命令具体来说是这样的: rust-objcopy 是一个工具,通常是 llvm-objcopy 或 objcopy 的别名,用于处理对象文件(object files)。 -O binary 表示输出格式为二进制(binary)格式。 target/thumbv7m-none-eabi/debug/examples/blinky 是输入的 ELF 文件路径,这是 Rust 编译生成的可执行文件。 blinky.bin 是输出的二进制文件路径,这个文件可以直接烧录到目标硬件上。 这个命令的作用是将 Rust 编译生成的 ELF 文件 blinky 转换为二进制文件 blinky.bin,以便于将其烧录到 ARM Cortex-M 系列的微控制器中运行。 在嵌入式开发中,通常需要将编译生成的 ELF 文件转换为二进制文件,因为微控制器通常需要的是二进制格式的可执行文件,而不是 ELF 格式的文件。 当执行这个命令之后,就会生成一个bin文件 将该bin文件,地址是0x08000000,烧录到目标芯片即可。工作效果如下图所示。 至此,利用rust进行编写LED控制代码来让STM32F103执行就完成了,这系列的操作流程有几个难点: 第一就是针对Cargo.toml的编辑,主要是有那些依赖项,添加什么内容是比较难摸索的,需要有参考才可以。 第二是创建.cargo/config and memory.x,这个说实话可以找个好用的例程直接复制过来,但是如果找不到例程就需要自己来写了,网上可以找到,比如memory.x 接下来就是工具的问题,比如我第一次操作的时候,发现没安装rust-objcopy,导致找不到其命令,还有就是GCC编译链没安装,导致程序编译出错,不过通过对应的提示可以知道怎么操作,这个还算是简单一些。 最后就是针对GCC调试,这个我暂时还没实现,因为使用rust进行调试我还是不太习惯,而且调试感觉没有keil或者IAR这种单步调试来得直观。 总结:就是不是很建议使用rust开发STM32,哈哈,真的很麻烦,如果不熟悉的话,确实不是一个很适合的语言,不如C来的痛快,不过这两种语言和有优势,如果将rust用在网络/后台开发方面,应该更加方便和强大。

  • 2024-06-29
  • 回复了主题帖: 《Rust实战》书友互动第十一集:内核

    吾妻思萌 发表于 2024-6-28 09:02 一个小问题: 作为业余感兴趣去学习Rust的有一丝丝编程基础的人,Rust是否是太过于coding硬核了,像是很 ... 感觉rust就是给做网站,做数据安全方面的来做的,之前还以为做MCU会很方便,但是后来发现,好像不是很方便,反而没有C或者C++方便呢?可能是因为习惯了吧。

  • 回复了主题帖: 《Rust实战》多线程的小例子有点不理解啊

    吾妻思萌 发表于 2024-6-28 08:18 不影响,我天天fq 天天翻可还行,哈哈

  • 2024-06-27
  • 回复了主题帖: 《Rust实战》多线程的小例子有点不理解啊

    在Rust中,Result枚举类型通常用于表示可能的成功或失败的返回值。它有两个变体,Ok和Err,分别用于表示成功和失败的情况。当Result接受的返回值内容是Config结构体加一个static str时,static str表示一个静态字符串切片,它的生命周期是静态的,意味着它在整个程序的生命周期内都有效。这样设计的目的是为了在编译时就确定字符串的生命周期,避免在运行时出现内存安全问题。这也符合Rust语言对内存安全和并发性的严格要求。   其中代码解析是: 这段代码是一个Config结构体的定义和一个impl块,其中实现了一个名为build的关联函数。build函数接受一个字符串切片的引用作为参数,并返回一个Result枚举类型。如果参数的长度小于3,函数将返回一个Err,其中包含一个静态字符串切片"not enough arguments";否则,函数将返回一个Ok,其中包含一个Config结构体的实例。 因此,build函数返回的是一个Result枚举类型,其中Ok分支包含一个Config结构体的实例,Err分支包含一个静态字符串切片。

  • 2024-06-23
  • 回复了主题帖: 《Rust实战》书友互动第十集:进程、线程和容器

    nemon 发表于 2024-6-19 19:02 如果在函数funcA里面定义了一个线程来调用匿名函数,那么这个匿名函数在定义时如何才能读到funcA里定义的变 ... 在函数funcA里定义的线程调用匿名函数时,可以通过闭包的方式让匿名函数读取到funcA里定义的变量。闭包是指在一个函数内部定义另一个函数,并返回这个函数,从而形成一个闭包环境,使得内部函数可以访问外部函数的变量。这样,匿名函数就可以在定义时捕获并访问funcA里定义的变量。    

  • 2024-06-11
  • 回复了主题帖: 《Rust实战》书友互动第九集:时间与时间保持

    lugl4313820 发表于 2024-6-11 10:48 在(Windows和非Windows)中,设置时间有什么不同,如何实现遵循一种相同模式? 在 Rust 中,设置时间在 Windows 和非 Windows 系统中有所不同。在 Windows 中,可以使用 SetSystemTime 函数来设置系统时间,而在非 Windows 系统中,可以使用 settimeofday 函数来设置系统时间。 为了实现遵循一种相同模式,可以使用 Rust 的条件编译功能。可以使用 cfg 属性来检查当前操作系统,并根据操作系统选择不同的时间设置函数。

  • 2024-06-04
  • 回复了主题帖: 《Rust实战》书友互动第八集:网络,这个很熟悉...

    lugl4313820 发表于 2024-6-4 11:42 Rust的错误处理是安全而精细的,但是它也带了一些挑战。当一个函数包含了两个来自上游包的result类型时,? ... 在Rust中,当一个函数包含了两个不同的Result类型时,可以使用match语句来处理这种情况。match语句可以根据不同的Result类型执行不同的操作。 通过使用match语句,我们可以根据不同的Result类型执行不同的操作,从而处理包含多个不同Result类型的函数。

  • 回复了主题帖: 《Rust实战》书友互动第八集:网络,这个很熟悉...

    nemon 发表于 2024-6-4 12:24 问个开放性问题吧——你觉得UDP和TCP哪个更好用? 答:我觉得UDP比较简单一些,通信逻辑来说,只要把数据塞到缓冲区里,发完就不用管了,如果需要心跳可以定时发送,优势就是发送快,缺点就是数据如果丢了就是丢了。   TCP吧,我用的不是很多,但其优势就是安全,而且数据不容易丢。 总结来说:好用还是UDP好用,但是具体情况具体项目要具体分析

  • 2024-05-31
  • 回复了主题帖: 《Rust实战》书友互动第七集:文件与存储

    吾妻思萌 发表于 2024-5-29 08:12 小弟有个问题: Rust在文件读写时,这个match用于判断开头的文件存不存在。然后会抛出panic。 那要是 ... 你好,网上我找到一个答案,您看是否符合你的需求哈,解答如下: 在Rust中,处理文件读取时的错误通常会使用Result类型来处理,而不是直接抛出panic。当文件读取过程中出现错误,可以使用Result类型来捕获错误并进行相应的处理。例如,可以使用match语句来处理Result类型,对错误进行处理或者返回错误信息。 如果在文件读取过程中发生了网络断开或文件被删除等意外情况,Rust可以通过捕获相应的错误类型来处理这些情况。例如,可以使用match语句来处理io::Error类型的错误,然后根据具体情况进行相应的错误处理,比如重新连接网络或者提示文件不存在等。 总之,Rust提供了丰富的错误处理机制,可以帮助开发者更好地处理文件读取过程中可能出现的各种错误情况。

  • 2024-05-30
  • 回复了主题帖: 《Rust实战》书友互动第七集:文件与存储

    提问: 第七章讲到了文件与存储,我发现编译好的文件生成之后都是个可执行文件,那么如果想要在MCU职中运行的话至少是个bin,这个文件转换怎么操作呢?

  • 发表了主题帖: 《Python编程快速上手 让繁琐工作自动化 第2版》试读3、win11安装python

    刚刚看别人的帖子下面有坛友说,win11好像装不上python?巧的是,我都读到第二章结束了,环境竟然还没搭建完,那好吧,就把环境搭建一下,顺道看看是否win11安装不了python呢? 首先去python官网下载好对应操作系统的对应软件,我是用Windows11,所以我下载Windows installer(64-bit) https://www.python.org/downloads/release/python-3123/ 下载OK之后,就可以愉快的安装了,首先双击该安装软件,双击之后会出现下图,下图是选择如何安装,比如是直接安装还是自定义安装,是否选择管理员权限安装,下面还有个添加python路径。OK,我是选择自定义安装的,因为我想改变安装路径。如下图所示。 选择自定义安装之后,会出现下方界面,默认都是勾选的,那我就按照默认来好了。 选择好之后next,进入到设置路径和进阶选项,按照我这个选择就OK。然后点击install。 下图是正在安装的界面。 稍等片刻就会安装好了,安装好之后需要测试环境是否OK,我们仅需要win+R按键,进入cmd界面,输入python之后,回车,如果出现python的版本号等信息说明环境是OK的。 接下来是是安装Mu编辑器。顾名思义,Mu是一个关于python的编辑器,它提供了简洁的界面和易于使用的功能,非常适合用来编写Python代码。Mu编辑器还集成了MicroPython,可以直接在微控制器上运行代码,非常适合用来学习和实践物联网和嵌入式开发。下载地址:https://codewith.mu/en/download 正常还是一样,选择适合自己的操作系统,然后就下载等待就好了,下载成功之后是个msi文件,这也是Windows安装文件的一种格式,双击即可。如下图所示。 这个没有选择路径的选项,直接选择安装就好。 以上就是安装Mu编辑器的操作,超级简单有没有?接下来就是打开Mu编辑器了。打开之后发现还有模式选择,可以选择microPython,这个我也喜欢玩,这个输入嵌入式开发的一种,就是在单片机/SOC上运行micropython。当然今天的主角不是它,我们选择python 3进行python的编辑和编译调试并运行。 选择好之后,会进入到编辑代码界面,我们把上一章搞得代码直接复制到这里来,玩一玩,复制完成之后需要在运行之前进行保存,保存问.py文件,保存完成之后就可以运行和调试了。 看,上图已经可以完整的运行了这段代码,并且可以正常调试之类的。其实回顾一下,安装python的环境还是挺简单的嘛~

  • 发表了主题帖: 《Python编程快速上手 让繁琐工作自动化 第2版》试读2、原来命名这么重要

    距离第一章的发布也有一段时间了,这段时间不仅仅是工作,也做了python的学习,发现python真的很是有趣。第一章试读中我就预告,看第二章很简单,应该很快就能OK,确实,第二章具体讲的挺简单,而且浅显易懂,但是让我记忆犹新的一个关键点就是“不要覆写模块名”。这个让我很难忘记,因为这个确实是很容易被忽略的一个重点。 我先讲讲第二章的理解与感触吧。第二章首先介绍了“控制流”,所谓控制流其实就是程序的执行流程顺序,比如判断、比较、赋值的优先顺序,其实这就是控制流。控制流中包含了布尔值,所谓布尔值我的理解就是C语言中的“是非”。布尔值有“True、False”。接下来讲了比较操作符,这个就跟名称一样,作比较来用。接下来是“布尔操作符”,这个就像C语言中的的“与或非”一样。下来就上了一点点强度,也就是混合布尔操作符与比较操作符。下来是针对控制流的“条件”、“代码块”、比如if,else和elif这种条件判断语句。给我的感觉至此,逻辑思路跟C语言差不多,而且可以说是比C语言更简单,因为其逻辑直接就按照人的思路去操作,不需要考虑过多的结构,函数等等。 其实python也有while循环语句,其中还有break退出和continue关键词,而且循环也可以用for,同时可以用设置循环次数的range()函数。 接下来就是我想说的重点了,由于python的优势就是库非常多,可以调用各种各样的库,因此导入模块库是学习python的重点之一,这里在开始就强调,模块的名字可不要随便写,就像书上所介绍的一样。 为什么我要介绍这个点呢,因为在之前写代码的时候,发现前辈们有些时候就函数定义就很容易随心所欲,当然,我也有点,不过我一般会用英文缩写并且按照比较好的代码风格设置它,所以可以说是之前的我深受其害。因此在python之中,我觉得要有一个好的代码/脚本风格是比较好的习惯之一,同时,也可以让代码/脚本更加的简单易懂。如果要是随心所欲的设计函数/模块名称,很有可能导致脚本运行失败的风险。因此,我觉得需要与大家分享一下我读第二章的感触。接下来我根据第二章的心得,并且参考一些资料搞个了简单的小游戏。 # 定义游戏场景 scenes = { 'start': '你来到了一个神秘的森林,面前有两条小路,你要选择左边的路还是右边的路?(输入L或R)', 'left': '你选择了左边的路,你看到了一只可爱的小动物,你要和它玩耍吗?(输入Y或N)', 'right': '你选择了右边的路,你遇到了一只凶猛的怪兽,你要战斗还是逃跑?(输入F或R)', 'play': '你和小动物玩得很开心,它带你找到了宝藏,你赢了!', 'fight': '你勇敢地与怪兽战斗,但你不敌,游戏结束!', 'run': '你选择逃跑,你成功逃脱了怪兽的追击,但没有找到宝藏,游戏结束!' } # 游戏主逻辑 def game(): current_scene = 'start' while True: print(scenes[current_scene]) choice = input() if current_scene == 'start': if choice == 'L': current_scene = 'left' elif choice == 'R': current_scene = 'right' else: print('无效的选择,请重新输入!') elif current_scene == 'left': if choice == 'Y': current_scene = 'play' elif choice == 'N': current_scene = 'fight' else: print('无效的选择,请重新输入!') elif current_scene == 'right': if choice == 'F': current_scene = 'fight' elif choice == 'R': current_scene = 'run' else: print('无效的选择,请重新输入!') elif current_scene == 'play' or current_scene == 'fight' or current_scene == 'run': print('游戏结束!') break # 运行游戏 game()   运行效果如下: 希望大家可以玩的愉快哦~

  • 2024-05-23
  • 回复了主题帖: 我们完成了全站的http到https的转化,你发现了吗?

    管管:前不久让大家猜ee的动作,有谁发现这个头号大动作了吗?? 这给急的啊,哈哈哈

  • 回复了主题帖: 《Rust实战》书友互动第六集:内存,有啥你不熟悉的吗?

    问: rust最优越感的就是针对内存的处理了,可以说是确保了内存的安全性和线程安全性,那么rust与C语言的内存,有什么不同呢?

  • 2024-05-21
  • 回复了主题帖: 《Python编程快速上手 让繁琐工作自动化 第2版》试读1、第一章理解

    hellokitty_bean 发表于 2024-5-19 13:51 楼主好好加油。。。。。 如果时间允许,应该可以快速进入3、4章了。 快了快了,第二章好简单,快进到第三章了。哈哈

统计信息

已有194人来访过

  • 芯积分:581
  • 好友:3
  • 主题:43
  • 回复:214

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言