实验四和五 Nim游戏

 代码太长,LD和LEA会取不到,注意学习JSR和RET指令!!

JSR我主要用去跳到最后面来LD了

然后就是玩家选行如果错误我直接报错了,没法输后面那个数了,这个没有去处理。

运行结果:

代码思路是:开始先吧三个ABC打出来,之后的o(石头)用循环的方式去打,所以每次减完都记录剩余石头数目; 输入行号和数字时都进行判断是否合法;打印剩余石头界面前先判断三行是否都为零,为零则结束,当前玩家赢。

代码:

.ORIG x3200
;R1读-A和-0,R2读-B,R3读-C;计算结果存到R4;R6存最后面地址的第一个,一会读char和它减就可以得到int;
	JSR Tail;BRnzp Tail
BACK1	LDR R1,R6,#0 	;A
	NOT R1,R1
	ADD R1,R1,#1	;取反加一
	STR R1,R6,#0	;把-A覆盖原来的A,因为寄存器不够
	LDR R2,R6,#1	;B
	NOT R2,R2
	ADD R2,R2,#1	
	LDR R3,R6,#2	;C
	NOT R3,R3
	ADD R3,R3,#1	
	LDR R7,R6,#9	;Char0
	NOT R7,R7
	ADD R7,R7,#1
	STR R7,R6,#9;-0
;-----------------------------------------------------------
	JSR GETRA
	PUTS
	LDR R0,R6,#8;ENDL;换行
	OUT;换行
	JSR GETRB
BACK2	PUTS
	LDR R0,R6,#8;ENDL
	OUT
	;下面两句
	JSR GETRC
BACK3	PUTS
	LDR R0,R6,#8;ENDL
	OUT
;以上为游戏界面的初始化状态---------------------------------------
LOOP	LEA R0,P1
	PUTS
	LEA R0,CHOOSE
	PUTS
	GETC	;玩家一读数,分别与A,B,C相减,计算结果存到R4
	OUT
J1	LDR R1,R6,#0	;把-A读到R1
	ADD R4,R0,R1
	BRnp J2 ;看是不是A,不是就去J2
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int	       减0
	BRn E	;*的处理:如果减的是个负数呢!
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RAn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn E	;如果减完为负数,那么就报错		
	ST R4,RAn;正数的话就覆盖原来的值
	BRnzp PRINT1;
J2	ADD R4,R0,R2
	BRnp J3
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int
	BRn E
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RBn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn E	;如果减完为负数,那么就报错
	ST R4,RBn;正数的话就存起来
	BRnzp PRINT1;
J3	ADD R4,R0,R3
	BRnp E	;还不是的话就报错!!!
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int
	BRn E
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RCn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn E	;如果减完为负数,那么就报错
	ST R4,RCn;正数的话就存起来
	BRnzp PRINT1;
E	LD R0,ENDL;换行
	OUT;换行
	JSR GETER
	PUTS
	LD R0,ENDL;换行
	OUT;换行
	BRnzp LOOP;再次进行输入
;打印界面
PRINT1	LDR R0,R6,#8;ENDL;换行
	OUT;换行
	OUT;先换两行
WIN1	LD R0,RAn
	BRp PS1
	LD R0,RBn
	BRp PS1
	LD R0,RCn
	BRp PS1
	LEA R0,P1
	PUTS
	JSR GETW
	PUTS
	BRnzp EXIT
PS1	LEA R0,RAname
	PUTS
	LD R4,RAn
A1L	BRz PAE1
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp A1L
PAE1	LD R0,ENDL;换行
	OUT;换行
	LEA R0,RBname
	PUTS
	LD R4,RBn
B1L	BRz PBE1
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp B1L
PBE1	LD R0,ENDL;换行
	OUT;换行
	LEA R0,RCname
	PUTS
	LD R4,RCn
C1L	BRz PCE1
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp C1L
PCE1	LD R0,ENDL;换行
	OUT;换行
;P2就是和P1一样的操作
Player2	LEA R0,P2
	PUTS
	LEA R0,CHOOSE
	PUTS
	GETC	;玩家一读数,分别与A,B,C相减,计算结果存到R4
	OUT
Jn1	LDR R1,R6,#0	;把-A读到R1
	ADD R4,R0,R1
	BRnp Jn2;看是不是A,不是就去J2
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int
	BRn E
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RAn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn En	;如果减完为负数,那么就报错
	ST R4,RAn;正数的话就覆盖原来的值
	BRnzp PRINT2;
Jn2	ADD R4,R0,R2
	BRnp Jn3
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int
	BRn E
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RBn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn En	;如果减完为负数,那么就报错
	ST R4,RBn;正数的话就存起来
	BRnzp PRINT2;
Jn3	ADD R4,R0,R3
	BRnp En	;还不是的话就报错!!!
	GETC	;读数,看移除几个,还要减0
	OUT	;直接回显
	LDR R1,R6,#9	;把-0读到R1
	ADD R0,R0,R1;char->int
	BRn E
	NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
	ADD R0,R0,#1
	LD R5,RCn;		    R5存被减数即石头数
	ADD R4,R5,R0;
	BRn En	;如果减完为负数,那么就报错
	ST R4,RCn;正数的话就存起来
	BRnzp PRINT2;
En	LD R0,ENDL;换行
	OUT;换行
	LEA R0,ERROR
	PUTS
	LD R0,ENDL;换行
	OUT;换行
	BRnzp Player2;再次进行输入
PRINT2	LDR R0,R6,#8;ENDL;换行
	OUT;换行
	OUT
WIN2	LD R0,RAn
	BRp PS2
	LD R0,RBn
	BRp PS2
	LD R0,RCn
	BRp PS2
	LEA R0,P2
	PUTS
	LEA R0,W
	PUTS
	BRnzp EXIT
PS2	LEA R0,RAname
	PUTS
	LD R4,RAn
A2L	BRz PAE2
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp A2L
PAE2	LD R0,ENDL;换行
	OUT;换行
	LEA R0,RBname
	PUTS
	LD R4,RBn
B2L	BRz PBE2
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp B2L
PBE2	LD R0,ENDL;换行
	OUT;换行
	LEA R0,RCname
	PUTS
	LD R4,RCn
C2L	BRz PCE2
	LD R0,o
	OUT
	ADD R4,R4,#-1
	BRp C2L
PCE2	LD R0,ENDL;换行
	OUT;换行
	BRnzp LOOP
Tail	LEA R6,A
	RET;BRnzp BACK1
GETRA	LEA R0,RA
	RET
GETRB 	LEA R0,RB	
	RET
GETRC	LEA R0,RC	
	RET
GETER	LEA R0,ERROR
	RET
GETW	LEA R0,W
	RET
EXIT	HALT
;
A	.FILL x41	;0	
B	.FILL x42	;1					
C	.FILL x43	;2					
RAn	.FILL #3	;3					
RBn	.FILL #5	;4					
RCn	.FILL #8	;5				
o	.FILL x6F	;6					
ZERO	.FILL x0	;7					
ENDL	.FILL x0A	;8
Char0	.FILL x30	;9
P1	.STRINGZ "Player 1"					; 
P2	.STRINGZ "Player 2"					;
CHOOSE	.STRINGZ ", choose a row and number of rocks: "		; (9
RA	.STRINGZ "ROW A: ooo"					; (37
RAname	.STRINGZ "ROW A: "					; (7
RB	.STRINGZ "ROW B: ooooo"					; (39
RBname	.STRINGZ "ROW B: "					; (7
RC	.STRINGZ "ROW C: oooooooo"				; (42
RCname	.STRINGZ "ROW C: "					; (8						
ERROR	.STRINGZ "Invalid move. Try again."
W	.STRINGZ " Wins."							
.END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值