⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24_points_game.asm

📁 算24点”作为一种扑克牌智力游戏
💻 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 + -