四子棋是一款普遍流行的简易型桌面游戏,据说,虎克船长曾因专注于此游戏而长期隐身在住所,当船员们发现船长的这一专长之后,他们称这个游戏为“船长的情妇”。
四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线、垂直线或者是对角线。
本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成。
游戏规则如下:
两位选手依次轮流落子;
选手不能悔棋;
有子的地方不能继续落子;
直到有一方的四个棋子能够连成一条水平线、垂直线或者是对角线;
如果棋盘已满,无人获胜,则平局。
游戏最初时应该打印空的棋盘,可以用ASCII码"-" (即ASCII 码 x002D)来表示该处为空,“O”(ASCII 码 x004F)表示第一位选手的棋子,“X” (ASCII 码 x0058)来表示第二位选手的棋子,为了让棋盘更易于观察,在各列间加一个空格,第6列之后不要添加,初始棋盘应该如下:
- - - - - -
- - - - - -
- - - - - -
- - - - - -
- - - - - -
- - - - - -
LC—3 汇编语言实现:
.ORIG x3000
;初始化棋盘
AND R1,R1,0
ADD R1,R1,#12
ADD R1,R1,#12
ADD R1,R1,#12
AND R2,R2,0
ADD R2,R2,#12
ADD R2,R2,#12
ADD R2,R2,#12
ADD R2,R2,#12
ADD R2,R2,#-3
LD R0,arr
LoopArr STR R2,R0,0
ADD R0,R0,#1
AND R6,R6,0
ADD R6,R6,#12
ADD R6,R6,#12
ADD R6,R6,#12
ADD R1,R1,#-1
BRz TEMP
Brnzp LoopArr
;-----------------P1输入-------------
TEMP
JSR Print
P1
LEA R0,P1Begin
TRAP x22
GETC
OUT
JSR Valid ;0不合法,1合法
ADD R1,R1,#0
BRz Invalid1
JSR xie1
ADD R6,R6,-1
BRz PJ
JSR IsWin1 ;R1为0 --win,否则继续(平局)
ADD R1,R1,#0
BRz DONE1
LD R0,endl
OUT
JSR Print
BRnzp P2
Invalid1
LD R0,endl
OUT
LEA R0,ErrorIn
TRAP x22
BRnzp P1
;-------------P2输入------------------------
P2 LEA R0,P2Begin
TRAP x22
GETC
OUT
JSR Valid ;0不合法,1合法
ADD R1,R1,#0
BRz Invalid2
JSR xie2
ADD R6,R6,-1
BRz PJ ;写入arr
JSR IsWin2 ;R1为0 --win,否则继续(平局)
ADD R1,R1,#0
BRz DONE2
LD R0,endl
OUT
JSR Print
BRnzp P1
Invalid2 LD R0,endl
OUT
LEA R0,ErrorIn
TRAP x22
BRnzp P2
PJ
LD R0,endl
OUT
JSR Print
LEA R0,pj
TRAP x22
HALT
DONE1 LD R0,endl
OUT
JSR Print
LEA R0,WIN1
TRAP x22
HALT
DONE2 LD R0,endl
OUT
JSR Print
LEA R0,WIN2
TRAP x22
HALT
;----------------主函数数据-----------------------
WIN1 .STRINGZ "Player 1 Wins.\n"
WIN2 .STRINGZ "Player 2 Wins.\n"
kong .STRINGZ " "
P1Begin .STRINGZ "Player 1, choose a column: "
P2Begin .STRINGZ "Player 2, choose a column: "
ErrorIn .STRINGZ " Invalid move. Try again. \n"
endl .STRINGZ "\n"
pj .STRINGZ " \n Tie Game. \n"
;-----------------子函数------------------------------------
;---------- 判断输入是否合法-------------
Valid ;1~6,这一列还有空位为1,否则为0,返回R1
ST R0,saveR0
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
ST R6,saveR6
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R1,R0,#-6
BRp NO
ADD R1,R0,#-1
BRn NO
LD R1,arr
ADD R1,R1,R0
ADD R1,R1,#-1
LDR R2,R1,0
AND R3,R3,#0
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#3
ADD R3,R3,R2
BRnp NO
AND R1,R1,0
ADD R1,R1,1
BRnzp DONEV
NO AND R1,R1,0
DONEV
LD R0,saveR0
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R6,saveR6
RET
arr .FILL x5000
;--------P1输入-----------
xie1 ;将第R0-1列写入arr中
ST R0,saveR0
ST R1,saveR1
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
ST R6,saveR6
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
AND R3,R3,#0
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#3
LD R1,arr
ADD R1,R1,R0
ADD R1,R1,#-1
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
LoopXie1
LDR R2,R1,0
ADD R2,R2,R3
BRz DONExie
ADD R1,R1,#-6
BRnzp LoopXie1
DONExie LD R2,xie0
STR R2,R1,0
LD R0,saveR0
LD R1,saveR1
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R6,saveR6
RET
xie0 .FILL x0030
;-------------P2输入---------------------
xie2 ;将第R0列写入arr中
ST R0,saveR0
ST R1,saveR1
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
ST R6,saveR6
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
ADD R0,R0,#-12
AND R3,R3,#0
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#-12
ADD R3,R3,#3
LD R1,arr
ADD R1,R1,R0
ADD R1,R1,#-1
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
ADD R1,R1,#6
LoopXie2
LDR R2,R1,0
ADD R2,R2,R3
BRz DONExie2
ADD R1,R1,#-6
BRnzp LoopXie2
DONExie2 LD R2,xiex
STR R2,R1,0
LD R0,saveR0
LD R1,saveR1
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R6,saveR6
RET
xiex .FILL x0058
saveR0 .FILL x0000
saveR1 .FILL x0000
saveR2 .FILL x0000
saveR3 .FILL x0000
saveR4 .FILL x0000
saveR5 .FILL x0000
saveR7 .FILL x0000
saveR6 .FILL x0000
;--------------打印子函数--------------------
Print
ST R0,saveR0
ST R1,saveR1
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
ST R7,saveR7
ST R6,saveR6
AND R3,R3,0
ADD R3,R3,#12
ADD R3,R3,#12
ADD R3,R3,#12
AND R4,R4,0
LD R1,arr
LoopPrint LDR R0,R1,0
OUT
LEA R0,kong
TRAP x22
ADD R4,R4,#1
ADD R3,R3,#-1
BRz DONE
ADD R5,R4,#-6
BRnp next
LD R0,endl
ADD R4,R4,#-6
OUT
next
ADD R1,R1,#1
BRnzp LoopPrint
DONE
LD R0,endl
OUT
LD R0,saveR0
LD R1,saveR1
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R7,saveR7
LD R6,saveR6
RET
;--------------------判断P1是否获胜--------------------------------------------
IsWin1
ST R6,saveR6
ST R0,saveR0
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
LD R1,arr
AND R2,R2,0
ADD R2,R2,12
ADD R2,R2,12
ADD R2,R2,12
LoopWin1 LDR R3,R1,0
ADD R2,R2,#-1
BRz NOWin
LD R5,start
AND R6,R6,0
NOT R5,R5
ADD R5,R5,1
ADD R5,R5,R1
ADD R5,R5,1;
pre ADD R4,R5,-6
BRnz OK
ADD R5,R5,-6
ADD R6,R6,1 ;第R5列,第R6行
BRnzp pre
OK
ADD R6,R6,1
ST R6,saveRR6
ST R5,saveRR5
LD R4,neg0
ADD R3,R4,R3
BRz NEXTLoop
ADD R1,R1,1
BRnzp LoopWin1
NEXTLoop
ADD R4,R5,-3
BRp NextNo1
AND R3,R3,0
LDR R4,R1,1
ADD R3,R4,R3
LDR R4,R1,2
ADD R3,R4,R3
LDR R4,R1,3
ADD R3,R4,R3
LD R4,sum
ADD R3,R3,R4
BRz YESWIN
NextNo1
LD R5,saveRR5
LD R6,saveRR6
AND R3,R3,0
LDR R4,R1,6
ADD R3,R4,R3
LDR R4,R1,12
ADD R3,R4,R3
LDR R4,R1,18
ADD R3,R4,R3
LD R4,sum
ADD R3,R3,R4
BRz YESWIN
LD R5,saveRR5
LD R6,saveRR6
ADD R4,R5,#-3
BRp NextNo2
ADD R4,R6,#-3
BRp NextNo2
AND R3,R3,0
LDR R4,R1,7
ADD R3,R4,R3
LDR R4,R1,14
ADD R3,R4,R3
LDR R4,R1,21
ADD R3,R4,R3
LD R4,sum
ADD R3,R3,R4
BRz YESWIN
NextNo2
LD R5,saveRR5
LD R6,saveRR6
ADD R4,R5,-3
BRp NextNo3
ADD R4,R6,-3
BRnz NextNo3
AND R3,R3,0
LDR R4,R1,#-5
ADD R3,R4,R3
LDR R4,R1,-10
ADD R3,R4,R3
LDR R4,R1,-15
ADD R3,R4,R3
LD R4,sum
ADD R3,R3,R4
BRz YESWIN
NextNo3
ADD R1,R1,1
BRnzp LoopWin1
YESWIN
AND R1,R1,0
BRnzp Downp1
NOWin
ADD R1,R1,1
Downp1
LD R0,saveR0
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R6,saveR6
RET
saveRR5 .FILL x0000
saveRR6 .FILL x0000
start .FILL x5000
neg0 .FILL xFFD0
sum .FILL xFF70
;--------------------判断P2是否获胜--------------------------------------------
IsWin2
ST R0,saveR0
ST R2,saveR2
ST R3,saveR3
ST R4,saveR4
ST R5,saveR5
ST R6,saveR6
LD R1,arr
AND R2,R2,0
ADD R2,R2,12
ADD R2,R2,12
ADD R2,R2,12
LoopWin2 LDR R3,R1,0
ADD R2,R2,#-1
BRz NOWin2
LD R5,start
AND R6,R6,0
NOT R5,R5
ADD R5,R5,1
ADD R5,R5,R1
ADD R5,R5,1;
pree ADD R4,R5,-6
BRnz OK2
ADD R5,R5,-6
ADD R6,R6,1 ;第R5列,第R6行
BRnzp pree
OK2
ADD R6,R6,1
ST R6,saveRR6
ST R5,saveRR5
LD R4,negx
ADD R3,R4,R3
BRz NEXTLoop2
ADD R1,R1,1
BRnzp LoopWin2
NEXTLoop2
ADD R4,R5,-3
BRp NextNo22
AND R3,R3,0
LDR R4,R1,1
ADD R3,R4,R3
LDR R4,R1,2
ADD R3,R4,R3
LDR R4,R1,3
ADD R3,R4,R3
LD R4,sum2
ADD R3,R3,R4
BRz YESWIN2
NextNo22
LD R5,saveRR5
LD R6,saveRR6
AND R3,R3,0
LDR R4,R1,6
ADD R3,R4,R3
LDR R4,R1,12
ADD R3,R4,R3
LDR R4,R1,18
ADD R3,R4,R3
LD R4,sum2
ADD R3,R3,R4
BRz YESWIN2
LD R5,saveRR5
LD R6,saveRR6
ADD R4,R5,#-3
BRp NextNo222
ADD R4,R6,#-3
BRp NextNo222
AND R3,R3,0
LDR R4,R1,7
ADD R3,R4,R3
LDR R4,R1,14
ADD R3,R4,R3
LDR R4,R1,21
ADD R3,R4,R3
LD R4,sum2
ADD R3,R3,R4
BRz YESWIN2
NextNo222
LD R5,saveRR5
LD R6,saveRR6
ADD R4,R5,-3
BRp NextNo33
ADD R4,R6,-3
BRnz NextNo33
AND R3,R3,0
LDR R4,R1,#-5
ADD R3,R4,R3
LDR R4,R1,-10
ADD R3,R4,R3
LDR R4,R1,-15
ADD R3,R4,R3
LD R4,sum2
ADD R3,R3,R4
BRz YESWIN2
NextNo33
ADD R1,R1,1
BRnzp LoopWin2
YESWIN2
AND R1,R1,0
BRnzp Downp2
NOWin2
ADD R1,R1,1
Downp2
LD R0,saveR0
LD R2,saveR2
LD R3,saveR3
LD R4,saveR4
LD R5,saveR5
LD R6,saveR6
RET
negx .FILL xFFA8
sum2 .FILL xFEF8
;-------------------------
.END