简要总结:
本次完成的是莫斯密码练习器,内置有三种模式:练习模式、字符->莫斯码模式、莫斯码->字符模式。还蛮好玩的,下面来详细讲一讲这三种模式。按键选择与规则略有不同,因为我觉得字符->莫斯码模式下有必要加上确认和消除按键防止误操作。
项目已发布,可以在https://makecode.com/_785YCuaPVT3F直接玩耍。
练习模式:
画面中的两个精灵会随机说出一组对应的字符和莫斯码,玩家操作其中一个精灵与另一个精灵重叠即可得分。玩家操控的精灵会说字符或者莫斯码,这一切都是随机的!
字符->莫斯码模式:
画面中的精灵会随机说出一个字符,玩家通过左右键输入对应的莫斯码,左键为横,右键为点。输入有误可以按B键清零,确认输入按A键即可。玩家需要在10s内进行确认,超时游戏自动结束。玩家初始有三条命。
莫斯码->字符模式:
画面会随机出四个精灵,其中有一个由玩家操纵。有且只有一个精灵说的字符与玩家操纵的字符对应,玩家需要操纵精灵使其配对。玩家初始有三条命。不过由于精灵的随机的位置没有做过多判断,所以可能会有玩家的精灵与其他精灵重合的可能性,不过可能性很小。
以上统一得分蜂鸣器响,掉生命震动,这三种模式分别用上、下、左进行切换。
游戏开始前会啰哩巴嗦说一堆玩法,我自己设的,按A继续即可。
游戏的主心骨就是一堆status和if else实现的伪状态机,并没有完全解耦也没有过多优化,不重要,代码能跑就行哈哈哈!不同status对应的模式如下。
status == 1 #选择游戏模式
status == 2、3#字符->莫斯码模式
status == 4、5 #练习模式
status == 6、7 #莫斯码->字符模式
整个过程主要用python实现,大家也能看到我反复迭代的痕迹。其实这个跟arduino差不多,也是分成开始初始化执行的部分和循环执行的部分。
count = 0
moorse_food3: Sprite = None
moorse_food2: Sprite = None
moorse_food1: Sprite = None
foodsss: Sprite = None
var_input = ""
value = 0
flag_scene = 0
KitronikRobot: Sprite = None
status = 0
list2: List[str] = []
dict_moorse: List[str] = []
info.set_life(3)
info.set_score(0)
# unknown expression: 178
dict_moorse = [".-",
"-...",
"-.-.",
"-..",
".",
"..-.",
"--.",
"....",
"..",
".---",
"-.-",
".-..",
"--",
"-.",
"---",
".--.",
"--.-",
".-.",
"...",
"-",
"..-",
"...-",
".--",
"-..-",
"-.--",
"--..",
".----",
"..---",
"...--",
"....-",
".....",
"-....",
"--...",
"---..",
"----.",
"-----",
"--..--",
".-.-.-",
"..--..",
"-..-.",
"-....-",
"-.--.",
"-.--.-"]
list2 = ["A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"0",
", ",
".",
"?",
"/",
"-",
"(",
")"]
game_count = 10
introduction()
实现流程:
接下来介绍一下实现的流程。
开始时初始化生命值和分数,初始化若干变量,调用introduction进行一堆介绍。部分截图如下。
以及具体的初始化代码。有一点需要吐槽,这个编辑器会自己改变量名!!!
introduction用官方例程里的实现方法改了一下,如下所示。
def introduction():
game.set_dialog_frame(img("""
.....cccccccccccccc.....
...cbd111111111111dbc...
..cd1111111111111111dc..
.cd111111111111111111dc.
.b11111111111111111111b.
cd11111111111111111111dc
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
c1111111111111111111111c
cd11111111111111111111dc
cb11111111111111111111bc
ccd111111111111111111dc.
.ccd1111111111111111dcc.
..c111111111111111dbcc..
.b11dcccccccccccccccc...
cddcccccccccccccccc.....
ccccc...................
"""))
game.set_dialog_cursor(img("""
. . . b b b . .
. . b 5 5 5 b .
. b 5 d 3 d 5 b
. b 5 1 5 3 5 b
. c d 1 5 3 5 c
. c d d 1 d 5 c
. . f d d d f .
. . . f f f . .
"""))
show_introduction("欢迎来到本游戏")
show_introduction("本游戏有三种模式")
show_introduction("1.练习模式")
show_introduction("2.字符->莫斯码游戏")
show_introduction("3.莫斯码->字符游戏")
show_introduction("分别对应上下左切换")
show_introduction("ID:锅包肉")
def show_introduction(文本: str):
game.show_long_text(文本, DialogLayout.FULL)
#music.ba_ding.play()#太吵了我给注释掉了,不然一直dingdingding!!!
游戏总共有几个循环,分别是:无限循环、当游戏更新时。
无限循环用来控制整个游戏整体的调度,主体就是if else的逻辑判断和各种status标志位参数的给定。部分截图如下。
当游戏更新是用来控制字符->莫斯码的游戏更新。另外两个用重叠的中断函数实现(中断是我自己猜的)。
比如限制精灵的移动范围。
字符->莫斯码具体的逻辑如下。
由于设置了game_count
,玩家撑过对应局数之后,直接判定胜利,否则如果生命为0或者时间结束判定失败。
还有若干中断,当重叠时,当按键按下时,当倒计时结束时。
练习模式的逻辑如下,由于默认精灵初始化的时候默认重叠在一起,一进去就会触发判定,但是在这个模式下不会产生坏的影响,只会让得分+1,所以这个bug就当feature了哈哈哈(逃
莫斯码->字符模式的逻辑如下。
同样由于采用的是overlap重叠判定,也会有一进入游戏就重叠的问题,而且也需要一进去就重叠来调用函数。我用了一个比较讨巧的方案。在status = 6
的时候,提前把错误的两个精灵的位置藏到对话框后面被遮挡而且不会被触发的地方,正确的精灵和玩家操纵的精灵的位置保持默认,这样当status
跳转到7
的时候,两个正确匹配的精灵重叠直接触发判定,随机更新位置。跟上面一样,以来就送你1分,当feature了哈哈哈。不过更新的地方没有过多判定,可能直接更新到玩家的精灵所在的位置,这就当做是天命吧,也算做feature嘿嘿。
后面就是稀疏平常的当按键按下时根据所处的status
产生不一样的效果。具体的例子如下所示。
以及定时器结束时触发游戏结束。
此外还写了若干函数以供调用,不算复杂,其中一个例子如下所示。
感想:
每一期都玩的很开心,尤其看到自己从一筹莫展到豁然开朗,很享受这个过程嘿嘿。另外,欢迎大家下载体验我写的游戏!!!
一共上传两个版本,一个beta1是只实现莫斯码游戏的版本,beta2是实现三个游戏模式的版本。