2017-11-21 11 views
0

アセンブリ言語でティックタックトーを作ろうとしています。どのようにプレイヤーを切り替えることができますか? ここに私のコードです。ティックタックトーゲームアセンブリ言語

.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

どのようにしたいですか?あなたのコードは、結局のところ... –

+0

あなたのコードは、ほとんどの人が読むことができないほど長くなります。あなたのプログラムがどのように設計されているのかを英語で説明し、追加したい新機能がどのように機能するのかを正確に説明するなら、それは悪い質問ではないかもしれません。しかしこれは、非効率的なコードの非公式な混乱です。 –

+1

通常、プログラミングでは一般的な公式に物事を一般化しようとするので、一般的な数式を実装する小さなコードだけを書くことができ、実行時に特別な作業を行うためにデータで設定できます。あなたのケースでは、現在のプレイヤーがXマークやOマーク、勝敗、スコア表示などを作成する場合に、ある種の「currentPlayer」変数がある可能性があります。このような変数の内容は、私の最初の3つのアイデアは、「0」/「1」、「1」/「2」、「X」/「O」です。 – Ped7g

答えて

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

ヒントプレーヤーのスイッチング問題の解決策へのあなたの主なコードに既にあります!あなたのプログラムでは今のところ完全に不要なmov bl, 1命令に注目してください。 BXレジスタを使用して、現在のプレーヤーを表すことができます。最も簡単なあなたがxor bx, 1を使用して簡単に十分な、BXに値を切り替える必要がありますメインループの各反復でプレイヤー1についてBX=0、およびプレーヤーのためのBX=1 2.

です。あなたはパーソナライズされたプロンプトを表示し

  • に必要GAME手順で

    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 
    

    Player2メッセージはもう必要ありません。

    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 
    
  • 9つの別の機会に右のキャラクター(プレイヤー1またはプレイヤー2のための "O" の "X")を選択します。
    mov al, choiseと書いたところでは、mov al, [choise + bx]が必要です。