《《打字练习程序》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《打字练习程序》PPT课件.ppt(27页珍藏版)》请在三一办公上搜索。
1、打字练习程序,电气0701尤烁、吴亚君、孟德才,实现效果从屏幕上方下落字母,从键盘输入字母,若输入正确,字母消失,效果如下。,任务分工,孟德才主要负责查找各种资料,并且搜集类似程序。吴亚军主要负责编写程序。尤烁主要负责调试及编写最后总结ppt。,设计思路,程序要求建立一个打字游戏,在运行程序时可以自行判断输入按键的真确性。从而加快使用者熟悉键盘的过程。一开始拿到题目时感觉无从着手,特别对于程序中随机部分不知道怎么处理。总认为随机就是要处理一个很复杂的程序,让计算机本身自动生成毫无规律的随机乱码。这让我思考了好长一段时间。后来了解到,就算是随机也是有规律可以追寻的。就26个字母乱序而言,可以自己
2、编写一组乱序存储到计算机中,然后设置一个加数,从起始位置起每次与加数相加这样依次选取后一个字母,这样就可以达到随机生成字母乱序的目的。采用一些简单而巧妙的方法可以方便的完成许多看似困难的问题。考虑到设计程序的复杂性,可以将程序分为几个不同的部分加以设计和思考。比如分为游戏准备部分、随机显示字母部分、字母下落部分、字母消失和显示部分、检测按键正确与否部分、输入错误计数部分等。这样一个一个部分分别思考,最后再将所有部分有机的结合起来,这样可以让程序设计思路清晰化和简明化。对于程序中的输入与输出及光标设置等问题可以通过DOS功能调用及BIOS功能调用加以解决。程序中需要重复输入的成段的指令可以使用宏
3、定义以减少工作量。,程序流程图,主程序,Init_game macro op1,op2,op3,op4,op5,op6;屏幕初始化 mov cx,00h mov dh,op1 mov dl,op2op6:mov ah,02h;int10h调用,功能号02h,设置光标位置 mov bh,00h;页号 int 10h push cx;将原操作数推入ss为段基址,sp为偏移地址的栈中 mov ah,0ah;int10h调用,功能号0ah,仅写字符 mov al,op3;字符 mov bh,00h;页号 mov cx,01h;字符数 int 10h pop cx;将以ss为段基址,sp为偏移地址的栈顶
4、内容,传送到目的操作数 inc cx;自减运算 inc op4;自减运算 cmp cx,op5;做减,仅影响标志位 jne op6;跳转到op6 endm;宏定义结束,与macro对应clear_screen macro op1,op2,op3,op4;清屏宏定义 mov ah,06h;int10h调用,功能号06h,窗口上卷 mov al,00h;上卷行数 mov bh,07h;上卷行属性(颜色)mov ch,op1;左上角行号 mov cl,op2;左上角列号 mov dh,op3;右下角行号,mov dl,op4;右下角列号 int 10h mov ah,02h;int10h调用,功能号
5、02h,设置光标位置 mov bh,00h;页号 mov dh,00h;行号 mov dl,00h;列号 int 10hendm;宏定义结束,与macro对应menu macro op1,op2,op3;菜单显示宏定义 mov ah,02h;int10h调用,功能号02h,设置光标位置 mov bh,00h;页号 mov dh,op1;行号 mov dl,op2;列号 int 10h mov ah,09h;int21h调用,功能号09h,输出字符串送显示器 lea dx,op3;输出字符串的偏移 int 21hendm;宏定义结束,与macro对应cursor macro op1,op2;置光
6、标宏定义 mov ah,02h;int10h调用,功能号02h,设置光标位置 mov bh,00h;页号 mov dh,op1;行号 mov dl,op2;列号 int 10hendm;宏定义结束,与macro对应hidden macro;字母消隐宏定义。在当前光标位置写空格 mov ah,0ah;int10h调用,功能号0ah,仅写字符 mov al,;字符 mov bh,00h;页号,mov cx,01h;字符数 int 10hendm;宏定义结束,与macro对应display macro;显示字母宏定义mov ah,0ah;int10h调用,功能号0ah,仅写字符 mov bh,00h
7、;页号 mov cx,01h;字符数 int 10hendm;宏定义结束,与macro对应data segment;数据段 字节型数据,学号 姓名,$结束 meg db press Enter key to continue.$;字节型数据,说明,$结束meg1 db when a letter is dropping,please hit it!$;字节型数据,说明,$结束meg2 db press ESC key to return main interface!$;字节型数据,说明,$结束meg3 db press letter shift+E to exit!$;字节型数据,说明,$结
8、束speed dw 600d;字型数据,字母下落速度letters db jwmilzoeucgpravskntxhdyqfb;字节型数据,字母乱码 db iytpkwnxlsvxrmofzhgaebudjq;字节型数据,字母乱码 db nwimzoexrphysfqtvdcgljukda;字节型数据,字母乱码letters_bak db jwmilzoeucgpravskntxhdyqfb;字节型数据,字母乱码,内存内容已经改变,重新初始化 db iytpkwnxlsvxrmofzhgaebudjq;字节型数据,字母乱码 db nwimzoexrphysfqtvdcgljukda;字节型数据
9、,字母乱码letter_counter db 0 life_flag db 78 dup(0);当字母数等于78的时候,清零position_flag db 78 dup(0);位置状态数组 present_position db 1;字母位置当前值 data ends;堆栈段stack segment para stack stack db 64 dup(0),stack endscode segment main proc far assume cs:code,ds:data,ss:stackstart:mov ax,data mov ds,ax clear_screen 00d,00d,
10、24d,79d;清屏 Init_game 00d,00d,0ah,dl,80d,nextsign1;屏幕初始化 Init_game 24d,00d,0ah,dl,80d,nextsign2 Init_game 00d,00d,0ah,dh,25d,nextsign3 menu 05d,15d,ZK;菜单信息的宏调用 menu 09d,15d,meg menu 11d,15d,meg1 menu 13d,15d,meg2 menu 15d,15d,meg3 cursor 22,33;设置光标位置 mov ah,00h lea si,life_flag mov cx,00hinit_life_fl
11、ag:mov si,ah inc si inc cx cmp cx,78d jne init_life_flag mov cx,00h mov ah,01h or ch,00010000b int 10h,mov ah,01h;从键盘输入任意字符 int 21h cmp al,0dh;回车开始 je gamebeginexit:mov ah,4ch;其它键结束 int 21h gamebegin:mov ax,speed+12 mov speed,ax clear_screen 01d,01d,23d,78d;清屏宏调用 Init_game 23d,01d,01h,dl,78d,nextsig
12、n5;最下一行显示小花脸 cursor 1,1;设置光标位置 mov cx,00h lea si,lettersnextletter:mov ah,02h;逐个显示最上面一行字母 mov dl,si int 21h inc si inc cx cmp cx,78d je nextcycle jmp nextletternextcycle:;字母下落过程 lea di,letters lea si,position_flag add present_position,31d;随机选择下一个字母 cmp present_position,78 ja from_front,gobackto_si:a
13、dd si,word ptr present_position dec si mov ah,si cmp ah,01h je find_zerogobackto_di:mov ah,01h mov si,ah add di,word ptr present_position dec di cursor 1,present_position;设置光标位置 mov cx,00hnextrow:push cx mov cx,00hout_cycle:;延迟 push cx mov cx,00hin_cycle:inc cx cmp cx,1000 jne in_cycle push dx mov a
14、h,06h;从键盘输入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,45H;如果键入ESC,则返回主菜单,je to_start1 cmp al,di;输入字母正确!则字母消失 je disappearpass:pop cx inc cx cmp cx,speed je print jmp out_cycleto_start1:;返回主菜单 jmp startdisappear:;击中字母后输出空格 pop cx pop cx hidden;消隐 jmp hit from_front:sub present_position,78d jmp goba
15、ckto_sifind_zero:cmp letter_counter,78d je recycle cmp present_position,78d je from_one mov ah,00hnextsi:add present_position,01h inc si cmp si,ah je equl cmp present_position,78d,je from_one jmp nextsi equl:jmp gobackto_difrom_one:mov present_position,01h jmp gobackto_sirecycle:mov letter_counter,0
16、0h mov present_position,01d lea si,position_flag mov cx,00h mov ah,00hclearsi:mov si,ah inc cx cmp cx,78d jne no_equl jmp nextcycleno_equl:inc si jmp clearsi print:hidden;消隐 inc dh cursor dh,present_position;改变光标位置 mov al,di;在当前光标位置显示字母 display;显示该字母 pop cx inc cx cmp cx,21d je print_next_letter jmp
17、 nextrow;下一行print_next_letter:;字母落到底部,lea si,life_flag add si,word ptr present_position dec si hidden;消隐 inc dh cursor dh,present_position;改变光标位置 hidden;消隐 mov ah,1 mov si,ah hit:cursor 1,present_position;光标位置回到第1行 mov al,di;出现下一个新字母 add al,7;刚敲的字母加7,生成新字母 cmp al,7ah;超过小写字母z?ja convey_letter display
18、;显示该字母 mov di,al add letter_counter,01h jmp nextcycle convey_letter:sub al,7ah;使该字母a add al,61h display;显示该字母 mov di,al add letter_counter,01h jmp nextcycle main endpcode endsend start,部分程序说明,清屏宏定义:clear_screen macro op1,op2,op3,op4;清屏宏定义 mov ah,06h mov al,00h mov bh,0bh mov ch,op1 mov cl,op2 mov dh
19、,op3 mov dl,op4 int 10h mov ah,02h mov bh,00h mov dh,00h mov dl,00h int 10hendm清屏宏定义中采用了INT 10H的6号功能。令al为00h,bh为0bh,设置上卷行数为零,颜色为浅青色。对于文本框中各行各列的标号可以通过形式参量op1,op2,op3,op4设置。INT 10H的2号功能定义了光标的起始位置为0行0列。,置光标宏定义:cursor macro op1,op2;置光标宏定义 mov ah,02h mov bh,00h mov dh,op1 mov dl,op2 int 10hendm为了在程序中能快速的
20、设置当前光标的所在位置,便于程序的书写。把INT 10H的2号功能设置为宏定义,光标的行号和列号用形式参量op1和op2代替。这样在写程序是酒可以通过宏调用快速设置光标位置。菜单显示宏定义:menu macro op1,op2,op3;菜单显示宏定义 mov ah,02h mov bh,00h mov dh,op1 mov dl,op2 int 10h mov ah,09h lea dx,op3 int 21hendm通过设置光标的位置和需要输入字符的首地址,可以快速地在想要的地方显示所需要的字符。,字母处理宏定义:hidden macro;字母消隐宏定义。mov ah,0ah mov al,
21、mov bh,00h mov cx,01h int 10hendmdisplay macro;;显示字母宏定义 mov ah,0ah mov bh,00h mov cx,01h int 10hendm让字母消失就是通过INT 10H的0aH号功能在当前光标位置输出空格字符,这样字母就“消失”了。显示字母就是通过INT 10H的0aH号功能在当前光标位置输出字符。,显示随机字母序列:cursor 1,1;逐个显示最上面一行字母 mov cx,00h lea si,lettersnextletter:mov ah,02h mov dl,si int 21h inc si inc cx cmp cx
22、,78d je nextcycle jmp nextletter首先设置光标起始位置,预计在第一行显示一排3组共78个字母乱序。通过INT 21H的02H号功能以cx为计数器采用je条件转移指令,将预先设置好的字母乱序表ASCII码通过寄存器间接寻址送入dl中一个一个的将字母显示出来。,字母下落过程:字母下落时限随机选择一个字母(设置光标列号,让光标列号依次加以个设定好的数值。再选取光标所指字母即可)然后依次在当前光标位置输出空格紧接着在下一行输出该字母就可以达到字母下落的目的。字母下落时要加入延时程序:out_cycle:;延迟 push cx mov cx,00hin_cycle:inc
23、cx cmp cx,2000 jne in_cycle 这样可以让字母以一定的速度下落。在下落过程中不断地检测键盘的输入,如果键盘输入正确就跳转程序让字母消失并重新开始下一字母的下落过程,如果输入Q则终止程序的执行,输入不正确则继续检测。,push dx mov ah,06h;从键盘输入字符 mov dl,0ffh int 21h pop dx jz pass cmp al,51h;如果键入Q,则退出 je to_start1 cmp al,di;输入字母正确!则字母消失 je disappearpass:pop cx inc cx cmp cx,speed je print jmp out_
24、cycleto_start1:;返回主菜单 jmp exitdisappear:;击中字母后输出空格 pop cx pop cx hidden;消隐 jmp hit 在程序执行中由于程序循环运行,许多加法运算可能超出预定数值,这时可以采用条件转移指令进行一次减法运算再继续执行程序。比如随机从78字母乱序中选择下一字母时没次加39,用cmp指令检测到超过78后跳转程序减去78再执行。,add present_position,39d;随机选择下一个字母 cmp present_position,78 ja from_frontgobackto_si:add si,word ptr present
25、_position.from_front:sub present_position,78d jmp gobackto_si,输入错误计数:inc bl;输入错误计数 cmp bl,0ah jne C mov bl,gaowei inc bl mov gaowei,bl mov bl,00hC:menu 24d,1d,meg4 menu 24d,50d,meg3 cursor 24,18 mov cl,bl add cl,30h mov ch,gaowei add ch,30h mov ah,02h mov dl,ch int 21h当字母下落至最后一行时还没有输入正确的按键这时可运行程序,利用inc自加功能进行加计数统计输入错误的次数。同时将其转变成对应的ASCII码利用INT 21H的02H号功能在屏幕上同步显示出来。,运行结果,程序开始,字母下落,输入错误计数及按键提示,程序特色,吴亚君:设计了计数程序,可以统计错误个数尤烁:设计了速度切换程序,可以改变字母下落速度孟德才:设计了暂停程序。,谢谢观看,
链接地址:https://www.31ppt.com/p-5514063.html