汇编语言中的井字游戏

Posted

技术标签:

【中文标题】汇编语言中的井字游戏【英文标题】:Tic Tac Toe Game in Assembly Language 【发布时间】:2017-11-21 17:25:00 【问题描述】:

我正在尝试用汇编语言制作井字游戏 如何切换播放器? 这是我的代码。

.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

【问题讨论】:

你想怎么做?毕竟是你的代码…… 您的代码太长,大多数人都不想阅读。如果您用英语描述了您的程序是如何设计的,以及您想要添加的新功能应该如何工作,那么这可能不是一个坏问题。但这只是一堆没有注释的低效代码。 通常在编程中你试图将事物概括为通用公式,因此你可以只编写实现通用公式的小代码,并通过数据配置它以在运行时完成特殊任务。在您的情况下,其中一种可能的配置是具有某种“currentPlayer”变量 - 影响当前玩家是否会创建 X 或 O 标记、输赢检查、分数显示等...此类变量的内容可以是您的任何内容设计,我的前三个想法是:0/11/2'X'/'O' 要在两个值之间交替,您可以使用 if-else 代码,或单个 xor(如 xor al,23)将 'X' 翻转到 'O' 并返回(0x4F xor 0x17 = 0x580x58 xor 0x17 = 0x4F) . ...对于 0/1 交替,还有其他常见的成语:flipped = 1 - current; ...(适用于任何 0/x 交替)。 1/2 可以通过(3-current)实现......问题是,您应该考虑一段时间,您想要实现什么,以及如何概括它。你的代码充满了硬编码的丑陋东西,没有展示这样的思考过程...... 顺便说一句,如果您已经包含 Irvine32 库,请尝试更多地使用它?像 programming.msjc.edu/asm/help/source/irvinelib/writestring.htm ... 检查库 API 以查看可用的内容,从而为您节省更多工作。 (player1 字符串甚至已经包含了 nul 终止符,但是您通过writeChar 打印它,同时输出零字节(当前代码中的某种错误)...也许您应该尝试启动第二个版本从头开始,看看你是否可以做得更好,以更通用/合乎逻辑的方式编写它,为下一个功能做准备(获胜检查)。 【参考方案1】:
.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 寄存器来代表当前玩家。最简单的是BX=0 用于播放器 1,BX=1 用于播放器 2。

main 循环的每次迭代中,您必须切换 BX 中的值,使用 xor bx, 1 很容易。

    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

GAME过程中你需要

显示个性化提示。您不再需要 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 个不同的场合选择正确的字符(“X”代表玩家 1,“O”代表玩家 2)。 你写mov al, choise的所有地方,现在都需要mov al, [choise + bx]

【讨论】:

以上是关于汇编语言中的井字游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现井字棋小游戏

C语言小项目——井字棋游戏(升级版)

C语言实战小游戏:井字棋(三子棋)大战!文内含有源码

三子棋(井字棋)如何用C语言实现

C语言实现井字棋

C语言实现三子棋(井字棋)