大家好我是冈坂日川。最近临近期末,很多计算机系的学生肯定有课程设计,包括汇编啊,java啊,python啊这些,我今天给大家分享一个比较完善的汇编程序,是从 GitHub 上 转载并修改的代码,小细节,乱码问题我都解决了,你只需要复制黏贴,就可以执行了!同时,代码可以用于学习,但切记不可抄袭做作业!!!
转载 GitHub ASMTypingGame
- 项目简介 / 设计思路
- 代码片
- 执行结果视图
一、项目简介
ASMTypingGame
简述
这是一个用x86 MASM写的打字游戏,是我计算机组成原理与汇编语言课程的课程设计。
实现功能
老师给的要求如下:
- 游戏开始后,从屏幕的顶部不断生成字符往下掉,值随机,位置随机。
- 按下对应按键后,屏幕上对应的字符高亮显示
- 按下按键后,蜂鸣器发声
- 统计分数
我在老师的要求上做了一定的扩展,把程序写成了类似DOS窗口游戏的东西:
- 首先有做了初始界面,游戏界面,设置界面和积分界面等界面,并提供跳转的接口。
- 按下按键后,蜂鸣器发出有声调的声音,组合起来就是一首曲子,在设置界面提供修>改的接口。
- 提供字符生成速度和下落速度的修改,提供字符的配色选择。
不足与改进
这个程序还有很多可以修改的地方,比如界面可以做的更精美,音调可以调得更准等。
一、代码
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA1,SS:STACKS,ES:EXS
MAIN PROC FAR
MOV AX,DATA1
MOV DS,AX
MOV AX,EXS
MOV ES,AX
;S:BP
INITIAL:
CALL INIT
CMP flag,0
JE NEWGAME
CMP flag,2
JE END_MAIN
CALL SETTING
JMP INITIAL
NEWGAME:
CALL INIT_GAME
CALL GAME
JMP INITIAL
END_MAIN:
MOV AH,4CH
INT 21H
MAIN ENDP
;**********************************************************
;*********************************************************
PUSH_REG MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
ENDM
;**********************************************************
;**********************************************************
POP_REG MACRO
POPF
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
ENDM
;**********************************************************
;*******************************************************
WRITE MACRO PAGE,ROW,COL,COLOR,CHAR
PUSH_REG
MOV BH,PAGE
MOV DH,ROW
MOV DL,COL
MOV AH,02H
INT 10H
MOV AL,CHAR
MOV BL,COLOR
MOV CX,1
MOV AH,09H
INT 10H
POP_REG
ENDM
;**********************************************************
;**********************************************************
MV_CUR MACRO PAGE,ROW,COL
PUSH_REG
MOV BH,PAGE
MOV DH,ROW
MOV DL,COL
MOV AH,02H
INT 10H
POP_REG
ENDM
;**********************************************************
;**********************************************************
MODULUS MACRO NUM1,NUM2
PUSH_REG
MOV AX,NUM1
MOV BX,NUM2
ADD AX,BX
MOV DX,0
DIV BX
MOV NUM1,DX
POP_REG
ENDM
;**********************************************************
;*********************************************************
RING MACRO WAIT
PUSH_REG
GET_FREQUENCE:
LEA DI,music_key
MOV AX,56
MUL music
ADD DI,AX
ADD DI,music_ptr
MOV AL,[DI]
DEC AL
SAL AL,1
XOR AH,AH
LEA SI,music_freq
ADD SI,AX
MOV DI,[SI]
INC music_ptr
MODULUS music_ptr,56
SOUND:
MOV AL,0B6H
OUT 43H,AL
MOV DX,12H
MOV AX,348CH
DIV DI
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
MOV BX,WAIT
WAIT1:
MOV CX,2800
DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
RING_END:
POP_REG
ENDM
;**********************************************************
;
;Print String
;**********************************************************
P_STR MACRO PAGE,ROW,COL,STR,LEN,COLOR
MOV BP,STR
MOV AH,13H
MOV BH,PAGE
MOV DH,ROW
MOV DL,COL
MOV CX,LEN
MOV AL,1
MOV BL,COLOR
INT 10H ;CALL BIOS
ENDM
;**********************************************************
;**********************************************************
FIND MACRO CHAR
LOCAL LOOP1,LOOP2,NEXT1,NEXT2,FIND_END
PUSH_REG
add CHAR,'A'
sub CHAR,'a'
mov aim,CHAR
MOV CH,24
LOOP1:
MOV CL,79
LOOP2:
MOV BH,2
MOV DH,CH
MOV DL,CL
MOV AH,02H
INT 10H
MOV BH,2
MOV AH,08H
INT 10H
CMP AH,spec_color
JE NEXT2
CMP AL,aim
JNE NEXT2
WRITE 2,CH,CL,spec_color,aim
INC hit
RING 100
JMP FIND_END
NEXT2:
DEC CL
CMP CL,0
JGE LOOP2
NEXT1:
DEC CH
CMP CH,0
JGE LOOP1
FIND_END:
POP_REG
ENDM
;**********************************************************
;**********************************************************
INIT PROC NEAR
PUSH_REG
SET:
MOV AH,05H
MOV AL,0
INT 10H ;CALL BIOS
MOV flag,0
LEA AX,init_msg
P_STR 0,7,0,AX,603,base_color
LEA AX,msg1
P_STR 0,18,0,AX,65,spec_color
LEA AX,msg2
P_STR 0,19,0,AX,65,base_color
LEA AX,msg3
P_STR 0,20,0,AX,65,base_color
CHOOSE:
MOV AH,00H
INT 16H
CMP AL,0DH
JE SET_END
CMP AL,'w'
JE UP
CMP AL,'s'
JE DOWN
JMP CHOOSE
UP:
DEC flag
JMP NEXT
DOWN:
INC flag
NEXT:
LEA AX,msg1
P_STR 0,18,0,AX,65,base_color
LEA AX,msg2
P_STR 0,19,0,AX,65,base_color
LEA AX,msg3
P_STR 0,20,0,AX,65,base_color
MODULUS flag,3 ;flag=(flag+3)%3
CMP flag,0
JE P_NEWGAME
CMP flag,1
JE P_SET
;P_EXIT
LEA AX,msg3
P_STR 0,20,0,AX,65,spec_color
JMP CHOOSE
P_NEWGAME:
LEA AX,msg1
P_STR 0,18,0,AX,65,spec_color
JMP CHOOSE
P_SET:
LEA AX,msg2
P_STR 0,19,0,AX,65,spec_color
JMP CHOOSE
SET_END:
POP_REG
RET
INIT ENDP
;**********************************************************
;**********************************************************
SETTING PROC NEAR
PUSH_REG
SETINIT:
MOV AH,05H
MOV AL,1
INT 10H ;CALL BIOS
LEA AX,set_msg
P_STR 1,7,0,AX,603,base_color
MOV BX,10
MOV DX,0
MOV AX,roll_gap
DIV BX
DEC AX
MOV roll_gap,AX
MOV DX,0
MOV AX,char_gap
DIV BX
DEC AX
MOV char_gap,AX
MOV BX,char_gap
ADD BL,'0' ;int 2 char
WRITE 1,9,44,spec_color,BL
MOV BX,roll_gap
ADD BL,'0' ;int 2 char
WRITE 1,10,44,base_color,BL
LEA BX,music_name
MOV AX,music
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,11,38,BX,25,base_color
LEA BX,color_name
MOV AX,color
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,12,38,BX,25,base_color
MOV flag,0
CHOOSE:
MOV AH,00H
INT 16H
CMP AL,0DH ;enter?
JE SET_END
CMP AL,'w'
JE UP
CMP AL,'s'
JE DOWN
CMP AL,'a'
JE DECREASE
CMP AL,'d'
JE INCREASE
UP:
DEC flag
MODULUS flag,4 ;flag=(flag+3)%3
JMP NEXT
DOWN:
INC flag
MODULUS flag,4 ;flag=(flag+3)%3
JMP NEXT
INCREASE:
CMP flag,0
JE INC_CHAR
CMP flag,1
JE INC_ROLL
CMP flag,3
JE INC_COLOR
INC music
MODULUS music,5
JMP NEXT
INC_CHAR:
INC char_gap
MODULUS char_gap,9
JMP NEXT
INC_ROLL:
INC roll_gap
MODULUS roll_gap,9
JMP NEXT
INC_COLOR:
INC color
MODULUS color,5
JMP NEXT
DECREASE:
CMP flag,0
JE DEC_CHAR
CMP flag,1
JE DEC_ROLL
CMP flag,3
JE DEC_COLOR
DEC music
MODULUS music,5
JMP NEXT
DEC_CHAR:
DEC char_gap
MODULUS char_gap,9
JMP NEXT
DEC_ROLL:
DEC roll_gap
MODULUS roll_gap,9
JMP NEXT
DEC_COLOR:
DEC color
MODULUS color,5
JMP NEXT
NEXT:
LEA DI,color_num
MOV AX,color
SAL AX,1
ADD DI,AX
MOV BX,[DI]
MOV spec_color,BH
MOV base_color,BL
LEA AX,set_msg
P_STR 1,7,0,AX,603,base_color
MOV BX,char_gap
ADD BL,'0' ;int 2 char
WRITE 1,9,44,base_color,BL
MOV BX,roll_gap
ADD BL,'0' ;int 2 char
WRITE 1,10,44,base_color,BL
LEA BX,music_name
MOV AX,music
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,11,38,BX,25,base_color
LEA BX,color_name
MOV AX,color
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,12,38,BX,25,base_color
CMP flag,0
JE P_CHAR
CMP flag,1
JE P_ROLL
CMP flag,3
JE P_COLOR
;P_MSC:
LEA BX,music_name
MOV AX,music
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,11,38,BX,25,spec_color
JMP CHOOSE
P_CHAR:
MOV BX,char_gap
ADD BL,'0' ;int 2 char
WRITE 1,9,44,spec_color,BL
JMP CHOOSE
P_ROLL:
MOV BX,roll_gap
ADD BL,'0' ;int 2 char
WRITE 1,10,44,spec_color,BL
JMP CHOOSE
P_COLOR:
LEA BX,color_name
MOV AX,color
MOV CX,25
MUL CX
ADD BX,AX
P_STR 1,12,38,BX,25,spec_color
JMP CHOOSE
SET_END:
MOV BX,10
MOV AX,roll_gap
INC AX
MUL BX
MOV roll_gap,AX
MOV AX,char_gap
INC AX
MUL BX
MOV char_gap,AX
POP_REG
RET
SETTING ENDP
;**********************************************************
;**********************************************************
INIT_GAME PROC NEAR
PUSH_REG
SET:
MOV AH,05H
MOV AL,2
INT 10H ;CALL BIOS
MOV music_ptr,0
MOV AH,07H
MOV AL,0
MOV BH,base_color
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H ;CALL BIOS
MOV AH,2CH
INT 21H
AND DH,DH
MOV roll_last,DX
MOV char_last,DX
MOV sum,0
MOV hit,0
MOV AH,0CH
MOV AL,00H
INT 21H
INIT_END:
POP_REG
RET
INIT_GAME ENDP
;**********************************************************
;**********************************************************
GAME PROC FAR
PUSH_REG
MOV CX,10
GAMING:
CALL ROLL_DOWN
CALL NEW_CHAR
CALL LISTEN
JMP GAMING
GAME_END:
POP_REG
RET
GAME ENDP
;**********************************************************
;**********************************************************
ROLL_DOWN PROC NEAR
PUSH_REG
GET_GAP:
MOV AH,2CH
INT 21H
AND DH,DH
SUB DX,roll_last
CMP DX,0
JGE JUDGE
ADD DX,100
JUDGE:
CMP DX,roll_gap
JB ROLL_END
DO_ROLL:
MOV AH,07H
MOV AL,1
MOV BH,base_color
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H ;CALL BIOS
MOV AH,2CH
INT 21H
AND DH,DH
MOV roll_last,DX
ROLL_END:
POP_REG
RET
ROLL_DOWN ENDP
;**********************************************************
;**********************************************************
NEW_CHAR PROC NEAR
PUSH_REG
GET_GAP:
MOV AH,2CH
INT 21H
AND DH,DH ;get current time
SUB DX,char_last
CMP DX,0
JGE JUDGE
ADD DX,100
JUDGE:
CMP DX,char_gap
JB CHAR_END
DO_NEWCHAR:
MOV LEFT,1
MOV RIGHT,81
CALL RAND
MOV AX,RANDOM
DEC AX
MOV LEFT,1
MOV RIGHT,26
CALL RAND
MOV CX,RANDOM
DEC CX
ADD CX,'A'
WRITE 2,0,AL,base_color,CL ;
INC sum ;
MOV AH,2CH
INT 21H
AND DH,DH ;get current time
MOV char_last,DX ;
CHAR_END:
POP_REG
RET
NEW_CHAR ENDP
;**********************************************************
;**********************************************************
LISTEN PROC NEAR
PUSH_REG
GET_STATUS:
MOV AH,01H
INT 16H
JZ LISTEN_END
MOV AH,07H
INT 21H
CMP AL,1BH ;Esc?
JE DO_PAUSE
CMP AL,'a' ;a-z?
JB NEXT_STATUS
CMP AL,'z'
JG NEXT_STATUS
FIND AL
JMP GET_STATUS ;other
DO_PAUSE:
CALL PAUSING
NEXT_STATUS:
JMP GET_STATUS
LISTEN_END:
POP_REG
RET
LISTEN ENDP
;**********************************************************
;**********************************************************
PAUSING PROC NEAR
PUSH_REG
MOV AH,05H
MOV AL,3
INT 10H ;CALL BIOS
LEA AX,pause_msg
P_STR 3,7,0,AX,603,base_color
MOV BX,sum
MV_CUR 3,9,30
CALL PRINT
MOV BX,hit
MV_CUR 3,9,46
CALL PRINT
MV_CUR 3,10,39
MOV AX,hit
MOV BX,100
MUL BX
MOV BX,sum
CMP BX,0
JE P3
DIV BX
MOV BX,AX
P3:
CALL PRINT
MV_CUR 3,16,0
MOV AH,00H
INT 16H
CMP AL,1BH
JNE CONTINUE
EXIT:
CALL MAIN
CONTINUE:
MOV AH,05H
MOV AL,2
INT 10H ;CALL BIOS
POP_REG
RET
PAUSING ENDP
;**********************************************************
;*********************************************************
RAND PROC NEAR
PUSH_REG
GET_RAND:
MOV AX, 233
MOV DX, 41H
OUT DX, AX
IN AL, DX
MUL SEED
SET_RAND:
MOV BX,LEFT
MOV CX,RIGHT
SUB CX,BX
INC CX
DIV CX
ADD DX,BX
MOV RANDOM,DX
MOV SEED,DX
RAND_END:
POP_REG
RET
rand ENDP
;**********************************************************
;**********************************************************
PRINT PROC NEAR
PUSH_REG
MOV AX,BX
MOV BX,10
MOV CX,0
CMP AX,0
JNE LOOP1
PUSH AX
INC CX
JMP LOOP2
LOOP1:
CMP AX,0
JE LOOP2
MOV DX,0
DIV BX
PUSH DX
INC CX
JMP LOOP1
LOOP2:
POP DX
ADD DL,30H ;int 2 char
MOV AH,0EH
MOV AL,DL
MOV BL,base_color
INT 10H ;CALL BIOS
LOOP LOOP2
PRINT_END:
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H
POP_REG
RET
PRINT ENDP
;**********************************************************
CODE1 ENDS
;----------------------------------------------------------
;----------------------------------------------------------
STACKS SEGMENT
stk db 1000 dup(?)
STACKS ENDS
;----------------------------------------------------------
;----------------------------------------------------------
DATA1 SEGMENT
seed dw ?
random dw ?
left dw ?
right dw ?
char_gap dw 90
roll_gap dw 90
char_last dw ?
roll_last dw ?
sum dw 0
hit dw 0
aim db ?
flag dw ?
music dw 0
music_freq dw 262
dw 294
dw 330
dw 349
dw 392
dw 440
dw 494
music_key db 1,1,5,5,6,6,5,4,4,3,3,2,2,1,1,1,5,5,6,6,5,4,4,3,3
db 2,2,1,1,1,5,5,6,6,5,4,4,3,3,2,2,1,1,1,5,5,6,6,5,1,1,1,1,1,1,1
db 3,1,6,5,6,6,1,6,6,6,3,1,2,5,3,2,5,6,1,6,2,3,1,6,5
db 3,1,6,5,6,3,1,6,6,5,6,1,6,2,3,1,6,5,3,1,6,5,6,3,1,6,6,1,1,1,1
db 1,3,3,2,1,3,2,1,3,3,2,1,1,1,1,6,1,2,3,3,3,0,5,6,1
db 1,1,6,1,2,3,2,3,5,5,6,1,1,6,1,2,3,2,3,2,2,1,2,1,1,1,1,1,1,1,1
db 5,3,2,2,1,1,1,1,1,1,1,6,5,5,6,6,6,6,1,2,3,5,5,5,5
db 1,1,2,2,2,1,1,7,1,1,1,1,6,5,5,6,6,6,6,1,1,2,3,5,5,5,5,3,2,2,2
db 1,3,3,2,1,3,2,1,3,3,2,1,1,1,1,6,1,2,3,3,3,0,5,6,1
db 3,3,2,3,2,1,1,1,2,2,1,1,5,5,6,5,6,5,7,6,6,5,6,1,3,2,1,1,1,1,1
music_ptr dw ?
color dw 0
base_color db 07H
spec_color db 04H
color_num dw 0407H
dw 0402H
dw 0207H
dw 8407H
dw 0704H
DATA1 ENDS
;----------------------------------------------------------
;----------------------------------------------------------
EXS SEGMENT
pause_msg db ' *************************************************',0ah,0dh
db ' * *',0ah,0dh
db ' * sum: score: *',0ah,0dh
db ' * your rate is % *',0ah,0dh
db ' * *',0ah,0dh
db ' * press esc to exit *',0ah,0dh
db ' * or other key to continue *',0ah,0dh
db ' * *',0ah,0dh
db ' *************************************************',0ah,0dh
init_msg db ' *************************************************',0ah,0dh
db ' * *',0ah,0dh
db ' * A little word game *',0ah,0dh
db ' * *',0ah,0dh
db ' * Produced by _Backl1ght *',0ah,0dh
db ' * *',0ah,0dh
db ' * press w,s and enter to choose *',0ah,0dh
db ' * *',0ah,0dh
db ' *************************************************',0ah,0dh
msg1 db ' New Game ',0ah,0dh
msg2 db ' Settings ',0ah,0dh
msg3 db ' Exit ',0ah,0dh
set_msg db ' *************************************************',0ah,0dh
db ' * *',0ah,0dh
db ' * new char speed : *',0ah,0dh
db ' * roll down speed: *',0ah,0dh
db ' * game music : *',0ah,0dh
db ' * game color : *',0ah,0dh
db ' * press wsad and enter to choose *',0ah,0dh
db ' * *',0ah,0dh
db ' *************************************************',0ah,0dh
music_name db 'little star '
db 'hong yan '
db 'xiao qing ge '
db 'lightest star '
db 'ai pin cai hui ying '
color_name db 'white(red) '
db 'green(red) '
db 'white(green) '
db 'white(s_red) '
db 'red(white) '
EXS ENDS
;----------------------------------------------------------
END
三、执行结果视图
四、总结
- 代码可以用于学习,切记不可抄袭做作业之类的!
- 祝大家学习愉快!