2017-11-21 4 views
0

Ich versuche Tic Tac Toe in Assemblersprache zu machen Wie kann ich Spieler wechseln? Hier ist mein Code.Tic Tac Toe Spiel in Assembler Sprache

.686 
.MODEL flat, stdcall 
.STACK 
INCLUDE Irvine32.inc 

.data 
tic BYTE "TIC TAC TOE GAME" 
player BYTE "PLAYER 1 (X) : PLAYER 2 (O)" 
myarray1 BYTE '1' , ' ' , '|' , ' ' , '2' , ' ' , '|' ,' ' ,'3' 
myarray2 BYTE '4' , ' ' , '|' , ' ' , '5' , ' ' , '|' ,' ' ,'6' 
myarray3 BYTE '7', ' ' , '|' , ' ' , '8' , ' ' , '|' ,' ' ,'9' 
choise BYTE 'X','O' 
player1 BYTE "Player 1 select your position ",0 
player2 BYTE "Player 2 select your position ",0 
info byte ? 
turn BYTE 2 

.code 
main PROC 
mov bl,1 
mov ecx,9 
L13: 
push ecx   
call BOARD 
call GAME 
pop ecx 
call clrscr   
loop L13 

BOARD proc 


;TO DISPLAY TIC TAC TOE GAME 
mov ecx, LENGTHOF tic 
mov esi,Offset tic 
L0: 
mov al,[esi] 
call writechar 
inc esi 
loop l0 
call crlf 
call crlf 


;TO DISPLAY PLAYER INFO 
mov ecx,LENGTHOF player 
mov esi,OFFSET player 
l6: 
mov al,[esi] 
call writechar 
inc esi 
loop L6 
call crlf 
call crlf 


;LOOP TO DISPLAY FIRST ARRAY 
mov ecx,LENGTHOF myarray1 
mov esi,OFFSET myarray1 
L1: 
mov al,[esi] 
call writechar 
inc esi 
loop L1 
call crlf 

;LOOP TO DISPLAY SECOND ARRAY 
mov ecx,LENGTHOF myarray2 
mov esi,OFFSET myarray2 
L2: 
mov al,[esi] 
call writechar 
inc esi 
loop L2 
call crlf 

;LOOP TO DISPLAY THIRD ARRAY 
mov ecx,LENGTHOF myarray3 
mov esi,OFFSET myarray3 
L3: 
mov al,[esi] 
call writechar 
inc esi 
loop L3 
call crlf 
call crlf 

ret 
BOARD endp 

GAME proc 
mov ecx,LENGTHOF player1 
mov esi,OFFSET player1 
L4: 
mov al,[esi] 
call writechar 
inc esi 
loop L4 
call crlf 


call readint 
mov info,al 

cmp al,1 
je one 

cmp al,2 
je two 

cmp al,3 
je three 

cmp al,4 
je four 

cmp al,5 
je five 

cmp al,6 
je six 

cmp al,7 
je seven 

cmp al,8 
je eight 

cmp al,9 
je nine 

one: 
mov al,choise 
xchg al,[myarray1] 
ret 

two: 
mov al,choise 
xchg al,[myarray1+4] 
ret 

three: 
mov al,choise 
xchg al,[myarray1+8] 
ret 

four: 
mov al,choise 
xchg al,[myarray2] 
ret 

five: 
mov al,choise 
xchg al,[myarray2+4] 
ret 

six: 
mov al,choise 
xchg al,[myarray2+8] 
ret 

seven: 
mov al,choise 
xchg al,[myarray3] 
ret 

eight: 
mov al,choise 
xchg al,[myarray3+4] 
ret 

nine: 
mov al,choise 
xchg al,[myarray3+8] 
ret 


GAME endp 

exit 
main endp 
end main 
+0

Wie möchten Sie? Es ist schließlich Ihr Code ... –

+0

Ihr Code ist zu lang für die meisten Menschen zu lesen. Wenn Sie in Englisch beschrieben haben, wie Ihr Programm konzipiert ist und wie genau die neue Funktion, die Sie hinzufügen möchten, funktioniert, ist das vielleicht keine schlechte Frage. Aber das ist nur ein unkommentiertes Durcheinander von ineffizientem Code. –

+1

Normalerweise versuchen Sie bei der Programmierung, Dinge in universelle Formeln zu verallgemeinern, so dass Sie nur kleinen Code schreiben können, der die allgemeine Formel implementiert, und sie nach Daten konfigurieren, um die spezielle Aufgabe zur Laufzeit auszuführen. In deinem Fall hat eine der möglichen Konfigurationen eine Art "currentPlayer" -Variable - die beeinflusst, ob der aktuelle Spieler eine X- oder O-Markierung, eine Gewinn/Verlust-Prüfung, eine Punkteanzeige usw. erzeugt. Der Inhalt einer solchen Variablen kann alles sein Design, meine ersten drei Ideen wären: '0' /' 1', '1' /' 2' oder 'X'' /' 'O''. – Ped7g

Antwort

0
.code 
main PROC 
mov bl,1 
mov ecx,9 
L13: 
push ecx   
call BOARD 
call GAME 
pop ecx 
call clrscr   
loop L13 

Ein Hinweis auf die Lösung Ihrer Spieler Problem Schalten Sie Ihre Haupt-Code ist bereits in! Beachten Sie die mov bl, 1 Anweisung, die im Moment in Ihrem Programm völlig unnötig ist. Sie können das BX Register verwenden, um den aktuellen Spieler darzustellen. Einfachste ist BX=0 für Spieler 1 und BX=1 für Spieler 2.

Bei jeder Iteration der Haupt Schleifen Sie den Wert in BX wechseln müssen, einfach genug xor bx, 1 verwenden.

xor  bx, bx ;Sets BX=0, so player 1 starts 
    mov  ecx, 9 
L13: 
    push ecx 
    call BOARD 
    call GAME 
    pop  ecx 
    call clrscr 
    xor  bx, 1 ;This switches players, 0 becomes 1 and 1 becomes 0 
    loop L13 

Im GAME Verfahren Sie

  • Display eine persönliche Aufforderung zum

    benötigen. Sie brauchen die Player2 Nachricht nicht mehr.

    GAME proc 
        mov  ecx, LENGTHOF player1 
        mov  esi, OFFSET player1 
        lea  ax, ["1" + bx] 
        mov  [esi + 7], al  ;Modifies message to show "1" or "2" 
    L4: 
        mov  al, [esi] 
        call writechar 
        inc  esi 
        loop L4 
        call crlf 
    
  • wählen Sie die richtigen Zeichen ("X" für den Spieler 1 oder "O" für den Spieler 2) an 9 verschiedenen Gelegenheiten.
    Überall, wo Sie mov al, choise geschrieben haben, benötigen Sie jetzt mov al, [choise + bx].