У меня в коде много проблем, которые я не знаю, как их решить: 1. Когда я нажимаю на квадрат, я не могу щелкнуть по другой, не щелкнув по крайней мере 8 раз.2. Когда игрок заканчивает свой первый ход, он не может нажать на другую пару квадратов.3. Я пытался решить проблему нажатия на существующий квадрат, но это не сработало.Большое спасибо, если вы можете помочь мне с этим, и я прошу прощения за плохой английский.
Игра работает так: Игрок один нажимает на квадрат.Процедура findColor просматривает координаты и проверяет, на какой квадрат щелкнули и какого цвета этот квадрат.Следующая краска showColor - это куб.Теперь я сравниваю InTurn (внутренний ход) с 1 - я хочу проверить количество квадратов, на которые нажал игрок.Если игрок нажал только на 1 клетку, то я прыгаю на waitMS, чтобы нарисовать другую.Когда игрок нарисовал два квадрата, я сравниваю цвет первого квадрата со вторым цветом.Я удаляю квадрат, если он не одного цвета с процедурой isSame.Наконец, я проверяю, были ли обнаружены все 8 пар ([очередь]).Если все 8 были обнаружены, я сравниваю две оценки, чтобы проверить, кто победил.Если не все 8 пар были обнаружены, я возвращаюсь к проге для следующего хода.Еще раз спасибо, если вы готовы мне помочь. Окно статуса, если два квадрата не одного цвета и должны быть удалены экран после одного нажатия экран в начале игры
IDEAL
MODEL small
STACK 0f500h
MAX_BMP_WIDTH = 320
MAX_BMP_HEIGHT = 200
SMALL_BMP_HEIGHT = 40
SMALL_BMP_WIDTH = 40
DATASEG
first_s db 'first_screen.bmp', 0
teco_s db 'teco.bmp', 0
win_1 db 'win_screen_1.bmp', 0
win_2 db 'win_screen_2.bmp', 0
sizeX dw 80d
sizeY dw 50d
x1 dw 3d ; temp x
y1 dw 3d
x dw 3d
y dw 3d
x2 dw ?
y2 dw ?
x3 dw ?
x4 dw ?
turn dw 0 ; number of pairs found
Score1 dw 0
Score2 dw 2
inTurn db 0
outTurn dw 0
tempX dw ?
tempY dw ?
board db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
num dw 49
color db 4
color2 db 8
OneBmpLine db MAX_BMP_WIDTH dup (0) ; One Color line read
buffer
ScreenLineMax db MAX_BMP_WIDTH dup (0) ; One Color line read
buffer
;BMP File data
FileHandle dw ?
Header db 54 dup(0)
Palette db 400h dup (0)
SmallPicName db 'zicaron.bmp',0
BmpFileErrorMsg db 'Error At Opening Bmp File .', 0dh,
0ah,'$'
ErrorFile db 0
BB db "BB..",'$'
BmpLeft dw ?
BmpTop dw ?
two db 2
BmpColSize dw ?
BmpRowSize dw ?
location db 0
location2 db 0
CODESEG
start:
mov ax, @data
mov ds, ax
mov ax,13h
int 10h
mov [BmpLeft],0
mov [BmpTop],0
mov [BmpColSize], 320
mov [BmpRowSize] ,200
mov dx,offset SmallPicName
call OpenShowBmp
prog:
mov [inTurn], 0
inc [outTurn]
mov ax, 0h
int 33h
mov ax, 1h
int 33h
waitMS:
mov ax, 1h
int 33h
mov ax, 3h
int 33h
cmp bx, 01h ; בדיקה אם כפתור שמאלי של העכבר הוקלק
jne waitMS
shr cx, 1 ; X ערך
sub dx, 1 ; Y ערך
call findColor ; find the box to draw
call showColor ; call to paint the box
;-----------------------
cmp [inTurn], 1
jne check
mov ah, [location]
mov [location2], ah
jmp waitMS
check:
call isSame
cmp [turn], 8
jge finalWinner
jmp prog
finalWinner:
push [Score1]
pop bx
cmp [Score2], bx
jg Screen_Win_2
cmp [Score2], bx
jl Screen_Win_1
tie:
mov dx, offset teco_s
call OpenShowBmp
mov ah,00h
int 16h
jmp exit
Screen_Win_1:
mov dx, offset win_1
call OpenShowBmp
mov ah,00h
int 16h
jmp exit
Screen_Win_2:
mov dx, offset win_2
call OpenShowBmp
mov ah,00h
int 16h
jmp exit
exit:
mov dx, offset BB
mov ah,9
;int 21h
mov ah,0
int 16h
mov ax,2
int 10h
mov ax, 4c00h
int 21h
proc showColor near
mov ax,2h
int 33h
push [x]
pop [tempX]
mov cx, 46
raw:
push cx
mov cx, 75
doit:
push cx
; Print one dot
mov bh,0h
mov cx, [x]
mov dx, [y]
mov al, [color]
mov ah,0ch
int 10h
inc [x]
pop cx
loop doit ;;;;;;;;;;;;;;;;;;;;
pop cx
inc [y]
push [tempX]
pop [x]
loop raw ;;;;;;;;;;;;;;;;;;;;
ret
endp showColor
proc timeDelay near
mov cx, 0Fh
mov dx, 4240h
mov ah, 86h
int 15h
ret
endp timeDelay
proc findColor near
mov bx, offset board
cmp cx, 80
jl firstC
cmp cx, 160
jl secondC
cmp cx, 240
jl thirdC
mov [x], 243
call fourthCP
jmp ext
thirdC:
mov [x], 163
call thirdCP
jmp ext
secondC:
mov [x], 83
call secondCP
jmp ext
firstC:
mov [x], 3
call firstCP
ext:
cmp [byte ptr bx + location], 0
je nxt
call callWaitMS
nxt:
mov [bx + location], 1
inc [inTurn]
cmp [inTurn], 1
jne timeToLeave
mov ah, [color]
mov [color2], ah
push [x]
pop [x1]
push [y]
pop [y1]
mov ah, [location]
mov [location2], ah
jmp plsExt
timeToLeave:
push [x]
pop [x2]
push [y]
pop [y2]
plsExt:
ret
endp findColor
proc callWaitMS near
jmp waitMS
ret
endp callWaitMS
proc fourthCP near
cmp dx, 50
jl oneL
cmp dx, 100
jl twoL
cmp dx, 150
jle thirdL
fourthL:
mov [location], 15
mov [y], 154
mov [color], 5h
jmp extD
thirdL:
mov [location], 14
mov [y], 104
mov [color], 3h
jmp extD
twoL:
mov [location], 13
mov [y], 54
mov [color], 2h
jmp extD
oneL:
mov [location], 12
mov[y], 4
mov [color], 9h
jmp extD
extD:
ret
endp fourthCP
proc thirdCP near
cmp dx, 50
jl oneLS
cmp dx, 100
jl twoLS
cmp dx, 150
jle thirdLS
fourthLS:
mov [location], 11
mov [y], 154
mov [color], 15h
jmp extT
thirdLS:
mov [location], 10
mov [y], 104
mov [color], 6h
jmp extT
twoLS:
mov [location], 9
mov [y], 54
mov [color], 14h
jmp extT
oneLS:
mov [location], 8
mov [y], 4
mov [color], 3h
jmp extT
extT:
ret
endp thirdCP
proc secondCP near
cmp dx, 50
jl oneLT
cmp dx, 100
jl twoLT
cmp dx, 150
jl thirdLT
fourthLT:
mov [location], 7
mov [y], 154
mov [color], 2h
jmp extS
thirdLT:
mov [location], 6
mov [y], 104
mov [color], 9h
jmp extS
twoLT:
mov [location], 5
mov [y], 54
mov [color], 14h
jmp extS
oneLT:
mov [location], 4
mov [y], 4
mov [color], 5h
jmp extS
extS:
ret
endp secondCP
proc firstCP near
cmp dx, 50
jl oneLA
cmp dx, 100
jl twoLA
cmp dx, 150
jl thirdLA
fourthLA:
mov [location], 3
mov [y], 154
mov [color], 12h
jmp extF
thirdLA:
mov [location], 2
mov [y], 104
mov [color], 15h
jmp extF
twoLA:
mov [location], 1
mov [y], 54
mov [color], 12h
jmp extF
oneLA:
mov [location], 0
mov [y], 4
mov [color], 6h
jmp extF
extF:
ret
endp firstCP
proc isSame near
mov bx, offset board
mov ah, [color2]
cmp [color], ah
jne calc
inc [turn]
push [outTurn]
pop ax
div [two]
cmp ah , 0
jne playerOne
cmp ah, 1
jne playerTwo
playerOne:
inc [turn]
inc [Score1]
jmp prog
playerTwo:
inc [turn]
inc [Score2]
jmp prog
calc:
call timeDelay
call timeDelay
mov [bx + location], 0
mov [bx + location2], 0
mov [color], 0
push [x2]
pop [x]
push [y2]
pop [y]
push [x2]
pop [tempX]
call showColor
push [x1]
pop [x]
push [y1]
pop [y]
push [x1]
pop [tempX]
call showColor
jmp prog
ret
endp isSame
;========================
;==========================
;===== Procedures Area ===
;==========================
;==========================
; input :
; 1.BmpLeft offset from left (where to start draw the picture)
; 2. BmpTop offset from top
; 3. BmpColSize picture width ,
; 4. BmpRowSize bmp height
; 5. dx offset to file name with zero at the end
proc OpenShowBmp near
push cx
push bx
call OpenBmpFile
cmp [ErrorFile],1
je @@ExitProc
call ReadBmpHeader
; from here assume bx is global param with file handle.
call ReadBmpPalette
call CopyBmpPalette
call ShowBMP
call CloseBmpFile
@@ExitProc:
pop bx
pop cx
ret
endp OpenShowBmp
; input dx filename to open
proc OpenBmpFile near
mov ah, 3Dh
xor al, al
int 21h
jc @@ErrorAtOpen
mov [FileHandle], ax
jmp @@ExitProc
@@ErrorAtOpen:
mov [ErrorFile],1
@@ExitProc:
ret
endp OpenBmpFile
proc CloseBmpFile near
mov ah,3Eh
mov bx, [FileHandle]
int 21h
ret
endp CloseBmpFile
; Read 54 bytes the Header
proc ReadBmpHeader near
push cx
push dx
mov ah,3fh
mov bx, [FileHandle]
mov cx,54
mov dx,offset Header
int 21h
pop dx
pop cx
ret
endp ReadBmpHeader
proc ReadBmpPalette near
; 4 bytes for each color BGR + null)
push cx
push dx
mov ah,3fh
mov cx,400h
mov dx,offset Palette
int 21h
pop dx
pop cx
ret
endp ReadBmpPalette
; Will move out to screen memory the colors
; video ports are 3C8h for number of first color
; and 3C9h for all rest
proc CopyBmpPalette near
push cx
push dx
mov si,offset Palette
mov cx,256
mov dx,3C8h
mov al,0 ; black first
out dx,al ;3C8h
inc dx ;3C9h
CopyNextColor:
mov al,[si+2] ; Red
shr al,2
out dx,al
mov al,[si+1] ; Green.
shr al,2
out dx,al
mov al,[si] ; Blue.
shr al,2
out dx,al
add si,4
loop CopyNextColor
pop dx
pop cx
ret
endp CopyBmpPalette
proc ShowBMP
; BMP graphics are saved upside-down.
; Read the graphic line by line (BmpRowSize lines in VGA format),
; displaying the lines from bottom to top.
push cx
mov ax, 0A000h
mov es, ax
mov cx,[BmpRowSize]
mov ax,[BmpColSize] ;
xor dx,dx
mov si,4
div si
mov bp,dx
mov dx,[BmpLeft]
@@NextLine:
push cx
push dx
mov di,cx ; Current Row at the small bmp (each time -1)
add di,[BmpTop] ; add the Y on entire screen
mov cx,di
shl cx,6
shl di,8
add di,cx
add di,dx
; small Read one line
mov ah,3fh
mov cx,[BmpColSize]
add cx,bp ; extra bytes to each row must be divided by 4
mov dx,offset ScreenLineMax
int 21h
; Copy one line into video memory
cld ; Clear direction flag, for movsb
mov cx,[BmpColSize]
mov si,offset ScreenLineMax
rep movsb ; Copy line to the screen
pop dx
pop cx
loop @@NextLine
pop cx
ret
endp ShowBMP
proc SetGraphic
mov ax,13h ; 320 X 200
int 10h
ret
endp SetGraphic
END start