哈喽,大家好,又一次见面了,这次是第四次参加我们的Funpack活动了,本期的开发版是来自Kitronik公司的 ARCADE--一款功能丰富的可编程游戏手柄。
本次任务选择的是任务二中的 2. 敲击按键,识别出按键组合对应的字符,在屏幕上打出自己的id。
根据微软MakeCode Arcade编辑器和直播课堂的讲解,思考的基础逻辑为:预设两个按键(或单键长短按)分别输入点和横,超时自动转换或者通过按键事件来转换,在撸代码过程中发现输入错误的话还需要删除,分别指定两个按键为清除已输入的摩斯码,和删除转换完成的文本最后一位,这样来完善操作失误带来的不良体验。
实现部分:
1. 首先还是用块编辑器将需要使用的功能(例如6个按键的按键命令,延时暂停,震动,设定玩家角色以及文字展现(角色说的命令))依次在块编辑器中生成,然后转换成python来完善。
2.每个游戏开始会有一个操作按键说明,这里内容可以先空着,后面完善之后再补充。
game.show_long_text("左=输入· 右=输入- 上=清空输入的摩斯码 下=(空白) B=转换到文本 A=删除文本末位",
DialogLayout.FULL)
3.这部分是直接转换生成的角色及位置描述,预定义了2个数组,分别存储摩斯码及对应的文本字符, 3个变量分别为输入的摩斯码 input_code;转换后的文本show_text;以及转换文本中临时变量show_text_temp。
player_: Sprite = None
scene.set_background_color(13)
input_code = ""
show_text = ""
show_text_temp = ""
dic_code_list = [".-", "-...", "-.-.", "-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----","..--..","-..-.","-....-"]
dic_text_list = ["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","?","/","-"]
player_ = sprites.create(img("""
. . . . . . . . . . b 5 b . . .
. . . . . . . . . b 5 b . . . .
. . . . . . b b b b b b . . . .
. . . . . b b 5 5 5 5 5 b . . .
. . . . b b 5 d 1 f 5 d 4 c . .
. . . . b 5 5 1 f f d d 4 4 4 b
. . . . b 5 5 d f b 4 4 4 4 b .
. . . b d 5 5 5 5 4 4 4 4 b . .
. b b d d d 5 5 5 5 5 5 5 b . .
b d d d b b b 5 5 5 5 5 5 5 b .
c d d b 5 5 d c 5 5 5 5 5 5 b .
c b b d 5 d c d 5 5 5 5 5 5 b .
c b 5 5 b c d d 5 5 5 5 5 5 b .
b b c c c d d d 5 5 5 5 5 d b .
. . . . c c d d d 5 5 5 b b . .
. . . . . . c c c c c b b . . .
"""),
SpriteKind.player)
player_.set_position(40, 70)
translate = sprites.create(img("""
. . . . . . . . . . . . . . . .
. . . . . . . 5 . 5 . . . . . .
. . . . . . f 5 5 5 f . . . . .
. . . . . f 6 2 5 5 6 f . . . .
. . . . f 6 6 6 6 1 6 6 f . . .
. . . . f 6 6 6 6 6 1 6 f . . .
. . . . f d f d 6 6 6 1 f . . .
. . . . f d f d 6 6 6 6 f f . .
. . . . f d 3 d d 6 6 6 f 6 f .
. . . . . f d d d f f 6 f f . .
. . . . . . f f 3 3 f f 6 6 f .
. . . . . f 5 3 3 d d f f f . .
. . . . . f 3 3 3 f d d f . . .
. . . . . . f 3 5 f f f . . . .
. . . . . f 3 3 3 3 f . . . . .
. . . . . . f f f f f . . . . .
"""),
SpriteKind.player)
translate.set_position(110, 70)
4.根据编辑器转换的代码补充填写每个按键的事件:
上--清除已输入的摩斯码(实现:直接将输入变量赋值为空,同时更新显示内容)
下--测试的震动模块代码,此案例中无实际操作。
左--输入· (实现:在输入变量的字符串后添加 · 字符,减去重新组合字符串的需求)
右--输入- (实现:同左按键)
def on_up_pressed():
#清除输入的摩斯码
global input_code
input_code = ""
player_.say(input_code)
controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)
def on_down_pressed():
#备用空白功能键,仅震动测试
controller.vibrate(100)
pause(200)
controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)
def on_left_pressed():
#输入.代码
global input_code
input_code = input_code + "."
player_.say(input_code)
pause(200)
controller.left.on_event(ControllerButtonEvent.PRESSED, on_left_pressed)
def on_right_pressed():
#输入-代码
global input_code
input_code = input_code + "-"
player_.say(input_code)
pause(200)
controller.right.on_event(ControllerButtonEvent.PRESSED, on_right_pressed)
5.同样补全按键A 和B 的事件:
A -- 将目前的show_text删除最后一位字符重新赋值,同时更新显示内容。
B -- 循环判断输入的摩斯码与第3条中预定义的数组内容是否一致,一致则将对应文本数组中同索引的字符赋值到show_text_temp变量,后组合到show_text,并更新显示内容。
每次按下B键均会响起提示音。
def on_a_pressed():
#删除转换后文本的最后一位
global show_text
show_text = show_text[:-1]
pause(200)
translate.say(show_text)
controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)
def on_b_pressed():
#转换摩斯码到文本
global input_code,show_text,show_text_temp
pause(200)
for index in range(len(dic_code_list)):
if input_code == dic_code_list[index]:
show_text_temp = dic_text_list[index]
pause(200)
break
show_text = show_text + show_text_temp #连接转换后的文本字符串
translate.say(show_text)
music.ba_ding.play()
controller.B.on_event(ControllerButtonEvent.PRESSED, on_b_pressed)
到这里基本游戏即可实现,实现效果如下;
- 心得体会
本次活动最先想体验的是微软的这个块编辑器,不需要那些语法,大小写等等,即可生成相应的程序文件,还是比较好玩。但是实际体验中,感觉还是没有代码界面那么灵活,不能完全按照自己的想法来“拖拽”代码到想要的位置上,还是有些欠缺。但是用于初始开发,定义好的函数等等还是特别方便,可以极大的减少难度。
通过这次活动,还是学到了很多,期待下一次Funpack,哈哈哈