📄 24_points_game.asm
字号:
;*-----------------------------------------------------------------------------------------------------------------------*
;* 24点游戏(编写简单的菜单程序) *
;* Copyright 2009 by KunYang *
;* 运行程序,屏幕上会随机显示4张纸牌,通过不同的命令可实现手动和自动运算24点,并将结果显示在纸牌下方 *
;* 命令提示: A-AUTO,H-HAND,SP-RESTART,ESC-QUIT *
;* 自动部分:若有解,则显示运算表达式,若无解,则显示' NO ANSWEWR ! ' *
;* 手动部分:输入表达式后,按'='即可显示运算结果,若为24,则在其下方显示显示'^-^ RIGHT ^-^',若不等于24,则显示'): WRONG :( ' *
;*-----------------------------------------------------------------------------------------------------------------------*
DATA segment
;///////////////////////////显示部分数据段//////////////////////////////////////////
;***************************定义欢迎界面*******************************************
NOTE1 DB 0AH,0DH,' WELCOME TO THE 24 POINTS GAME ','$'
NOTE2 DB 0AH,0DH,' A-AUTO,H-HAND,SP-RESTART,ESC-QUIT,=-ANSER','$'
NOTE3 DB 0AH,0DH,' NO ANSWEWR ! ','$'
;******************定义光标位置**************************************************
X_POS DB 10 ;行
Y_POS DB 10 ;列
;******************定义方框******************************************************
ypos dw ? ;定义列起始位置
xpos dw ? ;定义行起始位置
color db ? ;0-无色,1-绿,2-红,3-橘黄,4-橙红,5-紫红,7-白,8*-灰,9-蓝,10-绿,11-青绿,12-粉红,14-黄,15-白
cnt1 DW 0 ;定义方框宽度
cnt2 DW 0 ;定义方框长度
len db 0
dat_disp db 4 dup(' ') ;显示的牌的数字
dat_g dw 4 dup(?) ;生成的随机数组
random_d dw ? ;生成的随机数
card_ran db ?
card db 4 dup (?) ;牌的花色
;//////////////////////////////自动24点部分数据段/////////////////////////////////////
dat dw 4 dup(?)
i db 0 ;i,j,k循环变量
j db 0
k db 0
t1 dw ? ;临时计算结果
t2 dw ?
t3 dw ?
trans_val dw ? ;运算结果
docal_1 dw ? ;树的计算结果
docal_2 dw ?
docal_3 dw ?
docal_4 dw ?
docal_5 dw ?
buff1 db 11 dup(?),0dh,0ah,'$' ;各树输出结果缓存
buff2 db 11 dup(?),0dh,0ah,'$'
buff3 db 11 dup(?),0dh,0ah,'$'
buff4 db 11 dup(?),0dh,0ah,'$'
buff5 db 11 dup(?),0dh,0ah,'$'
opstr db '+','-','*','/'
nosolve_flag db 0 ;nosolve标志
;/////////////////////////////////手动计算部分数据段////////////////////////////////
COUNT DB 0
X DW 100 DUP(?)
SYMBOL DB 20 DUP(?)
WW DB 0DH,0AH,'$'
DISPINF00 DB ' WRONG INPUT!','$'
DISPINFO1 DB ' NOT YUNSUAN CHAR!','$'
DISPINF02 DB 0dh,0ah,' ^-^ RIGHT ^-^ ','$'
DISPINF03 DB 0dh,0ah,' ): WRONG :( ','$'
solve_buff1 db 10 dup('$')
divid dw 10
data ends
;///////////////////////////////////界面显示部分//////////////////////////////////////
code segment
ASSUME CS:code,DS:data
start:
MOV AX,data
MOV DS,AX
;***********************************设置BIOS调色板************************************
mov ah, 00h ;设置绘图模式
mov al, 12h ;16色图形模式
int 10h
mov ah, 0bh ;设置调色板
mov bh, 0Fh ;调色板ID
mov bl, 02h ;颜色
int 10h
;*************************************显示欢迎语句*************************************
LEA DX,NOTE1
MOV AH,09H
INT 21H
LEA DX,NOTE2
MOV AH,09H
INT 21H
;*************************************生成随机数牌号及花色***************************************
lea si,dat_g
lea di,card
mov cx,4
random_loop:
call_again:
call random_g
push cx
MOV CX,9000
DONE1: MOV BX,0FFFFH ;延时,以产生不同的随机数
DONE: DEC BX
JNE DONE
LOOP DONE1
pop cx
MOV BX,random_d
cmp bx, 0 ;若生成的随机数<=0,则重新生成
jle call_again
cmp bx,13 ;若生成的随机数>13,则重新生成
jg call_again
mov word ptr[si],bx ;生成的随机数
mov al,card_ran
mov byte ptr[di],al
inc si
inc si
inc di
loop random_loop
call deal_data
call FRAME1
call FRAME2
;**************************输入命令:A-AUTO,H-HAND,SP-RESTART,ESC-QUIT*****************************
wait_key:
MOV AH,08H
INT 21H
cmp al,'A'
JZ AUTO
cmp al,'H'
jz hand
cmp al,1bh
jz exit
cmp al,20h
jz start
jmp wait_key
;///////////////////////////////////自动24点显示/////////////////////////////////////////////////////////
AUTO:
part_24: MOV X_POS,12 ;行,定义光标位置,显示24点算式
MOV Y_POS,24 ;列
CALL POSITION
mov cx,4
lea si,dat_g ;将随机数放入dat_g和dat中
lea di,dat
copy_data: mov ax,word ptr [si]
mov word ptr[di],ax
inc si
inc si
inc di
inc di
loop copy_data
loop1: ;显示自动运算结果
loop2:
loop3:
call docal1 ;调用各树并产生结果与24比较,相等则显示该运算表达式
cmp docal_1,24
jz disp1
call docal2
cmp docal_2,24
jz disp2
call docal3
cmp docal_3,24
jz disp3
call docal4
cmp docal_2,24
jz disp4
call docal5
cmp docal_5,24
jz disp5
jmp no_solve
disp1: call display1 ;显示运算表达式并返回到wait_key处
jmp wait_key
disp2: call display2
jmp wait_key
disp3: call display3
jmp wait_key
disp4: call display4
jmp wait_key
disp5: call display5
jmp wait_key
loop1_2: jmp loop1
no_solve:inc k ;遍历各运算符以确定是否有解,无解则显示NO ANSWER
cmp k,4
jnz loop3
inc j
mov k,0
cmp j,4
jnz loop2
inc i
mov j,0
mov k,0
cmp i,4
jnz loop1_2
LEA DX,NOTE3
MOV AH,09H
INT 21H
mov nosolve_flag,1
jmp wait_key
;/////////////////////////////////////手动输入显示并判断//////////////////////////////////////////
hand:
start_1:jmp hand_in
hand_in: MOV X_POS,14 ;行,定义光标位置,显示24点算式
MOV Y_POS,24 ;列
CALL POSITION
AGAIN2: MOV SI,OFFSET SYMBOL
MOV AL,'=' ;数据段底为‘=’以便结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -