LC-3 汇编语言实现简易四子棋

四子棋是一款普遍流行的简易型桌面游戏,据说,虎克船长曾因专注于此游戏而长期隐身在住所,当船员们发现船长的这一专长之后,他们称这个游戏为“船长的情妇”。

​ 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线、垂直线或者是对角线。

​ 本实验需要在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




  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值