Я играю в крестики-нолики и при создании функции проверяю, выиграл ли игрок. В целях тестирования я заставил программу просто выйти, когда игрок выиграл. Просто для запуска я заставил программу проверить только 1-ю строку:
0, 0, 0 ==> эту строку
0, 0, 0
0, 0, 0
Я столкнулся с проблемой, что программа существует каждый раз, когда я меняю позицию A на X или O, за исключением , когда я выбираю одну из позиций, которые проверяются программой (поэтому, если я выберу любую позицию в 1-й строке).
Код функции находится в конце
Я не хочу включать весь код, потому что я не просто печатаю его вна экране, но рисую его в графическом режиме (ах = 13h и 10h). Я просто покажу вам основной цикл и функцию checkIfWon, которые я отфильтровал только для важных вещей. Это код: определение платы:
.data
board db 0,0,0
db 0,0,0
db 0,0,0
Функция CheckIfWon:
checkIfWon proc
; check rows
; Equal to: if (board[0] == board[1] && board[1] == board[2])
movsx eax, byte ptr [board]
movsx ecx, byte ptr [board+1]
cmp eax, ecx
jne cont
movsx eax, byte ptr [board]
movsx ecx, byte ptr [board+2]
cmp eax, ecx
jne cont
mov ax, 4c00h
int 21h
cont:
ret
ret
endp checkIfWon
.386
; mainloop
mainloop:
; check for exit button (ESC)...
; get mouse button and cursor position...
;;;;;;;;;;;;;;;;;;;;;;; Check if mouse is on one of the positions
box0:
; check if it got clicked...
drawXplayer0:
; draw X
jmp boxHitten
drawOplayer0:
; draw o
jmp boxHitten
box1:
; check if it got clicked...
drawXplayer1:
; draw X
jmp boxHitten
drawOplayer1:
; draw o
jmp boxHitten
box2:
; check if it got clicked...
drawXplayer2:
; draw X
jmp boxHitten
drawOplayer2:
; draw o
jmp boxHitten
box3:
; check if it got clicked...
drawXplayer3:
; draw X
jmp boxHitten
drawOplayer3:
; draw o
jmp boxHitten
box4:
; check if it got clicked...
drawXplayer4:
; draw X
jmp boxHitten
drawOplayer4:
; draw o
jmp boxHitten
box5:
; check if it got clicked...
drawXplayer5:
; draw X
jmp boxHitten
drawOplayer5:
; draw o
jmp boxHitten
box6:
; check if it got clicked...
drawXplayer6:
; draw X
jmp boxHitten
drawOplayer6:
; draw o
jmp boxHitten
box7:
; check if it got clicked...
drawXplayer7:
; draw X
jmp boxHitten
drawOplayer7:
; draw o
jmp boxHitten
box8:
; check if it got clicked...
drawXplayer8:
; draw X
jmp boxHitten
drawOplayer8:
; draw o
jmp boxHitten
boxHitten:
; Fix overdrawn borders
call drawBoard
; set cursor position
mov dl, 1
mov dh, 1
mov bh, 0 ;Display page
mov ah, 02h ;SetCursorPosition
int 10h
;
; change player
; if player='x': player='O' else player=x'
; here im playing a sound that tells the user he clicked
; delay
push 500 ; 0.5 secs
call delay
call checkIfWon
jmp mainloop
takenError:
push 14000 ; frequency for bad answer
push 200 ; duration milliseconds
call play
; delay
push 1000
call delay
jmp mainloop
Программа не выходит (как я и хотел): Существует (не то, что я хотел):
В чем может быть причина того, что программа пропускает его?
РЕДАКТИРОВАТЬ:
Я нашел решение, см. комментарий