LC-3下汇编实现简易版四子棋的游戏
问题描述:
两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成。
游戏规则如下:
两位选手依次轮流落子;
选手不能悔棋;
有子的地方不能继续落子;
直到有一方的四个棋子能够连成一条水平线、垂直线或者是对角线;
如果棋盘已满,无人获胜,则平局。
游戏最初时应该打印空的棋盘,可以用ASCII码"-" (即ASCII 码 x002D)来表示该处为空,"O"(ASCII 码 x004F)表示第一位选手的棋子,"X" (ASCII 码 x0058)来表示第二位选手的棋子,为了让棋盘更易于观察,在各列间加一个空格,第6列之后不要添加,初始棋盘应该如下:
- - - - - -
- - - - - -
- - - - - -
- - - - - -
- - - - - -
- - - - - -
选手一始终先下第一步棋,然后两者轮流落子,在每次落子之后,应该打印该选手的信息,提示他落子,以选手一为例,应该打印信息如下:
Player 1, choose a column:
为了明确选手的落子的位置,该选手应该输入数字1-6,然后回车,数字1-6指示在落子所在的列,从左到右,无需输入行号,程序应默认从行号6到行号1递减的顺序填入该棋子,若前后输入的列号相同,则行号减一。例如,如果选手第一次在左起第二列落子,应该输入2,然后回车,则该棋子落在行6列2处,当后面输入的列号再次为2时,则将棋子落子行5列2处,以此类推,详情见后续示例输出。程序应该确保选手输入的数字对应正确的列的范围,如果输入不合理,应该输出一条错误信息,提示该选手继续输入,例如,如果对于选手一:
Player 1, choose a column: D
Invalid move. Try again.
Player 1, choose a column: 7
Invalid move. Try again.
Player 1, choose a column:
程序应该一直提示该选手,知道输入正确的数字,当用户输入完成,程序应通过显示回馈给选手,然后通过换行符(ASCII 码 x000A)换行。
当选手输入成功后,程序应打印更新后的棋盘,并检查是否有人获胜,如果没人获胜,则轮到下一位输入。
当其中一位获胜或平局时,游戏结束,程序显示最后的棋盘情况并终止(Halt)。例如,如果选手二有四子相连,应该输出:
Player 2 Wins.
如果平局,程序应该输出:
Tie Game.
整体设计思路:
1.棋盘数据存放在x4000 – x4024中,其中数值0代表该位置为空,数值1(即正数)代表玩家1下的棋子,数值-1(即负数)代表玩家2下的棋子。
2.子程序OUTCB(棋盘输出)可根据棋盘数据为正负零输出O、X或 - 。
3.子程序JUDGEMENT(判断下棋位置)首先定位玩家下棋位置,再判断该位置是否为空,若为数值0,则可下棋,根据下棋玩家赋值1或-1。否则返回0。
4.子程序IFWIN(判断输赢),首先将棋盘分配好坐标,根据坐标的值范围[ (0,0)<=(x , y)<=(5,5) ] 来判断是否溢出。然后判断下棋位置的纵列是否连成4个,若能,返回结束。否则继续依次执行判断横列,斜列能否连成4子。
5.主程序在执行下棋循环超过18次(玩家1、2各下18个棋子),则结束程序,平局输出。
流程图表示:
汇编代码实现:
; The code is designed by Li Mingzhao.
; Program is a game named Connect Four.
; PLAY1 plays chess first. R6=1 represents the PLAY1. R6=-1 represents the PLAY2.
; The subprogram JUDGEMENT to judge whether the chess piece is legal.
; The subprogram IFWIN to judge whether there is a winner.
; The subprogram OUTCB to output the ChessBoard.
; ChessBoard to save at x4000-x4024.
; .ORIG x3000
;LD R4,FULL ; R4 is counter, initialize to 18JSR OUTCB ; Output the empty chessboard
NEXTLOOP LD R6,PLAY1 ; Now R6 represents PLAY1's turn
AGAIN JSR OUTP1IN ; Hint to PLAY1's inputTRAP x20TRAP X21JSR JUDGEMENT ; Judge the location.JSR OUTNewLineADD R5,R5,#0 ; R5=1 means right inputBRnp REPLAY2 ; If match, it turns to PLAY2JSR OUTERROR BRnzp AGAIN ; If no match, do AGAINREPLAY2 JSR OUTCBJSR IFWIN ADD R3,R3,#0 ; R3 means win or not BRp ONEWIN ; If match, PLAY1 winsLD R6,PLAY2 ; PLAY2's turn
AGAIN2 JSR OUTP2IN ; Hint to PLAY2's inputTRAP x20TRAP X21JSR JUDGEMENT ; Judge the location.JSR OUTNewLineADD R5,R5,#0BRnp IFFULL ; If match, judge full or notJSR OUTERROR BRnzp AGAIN2 ; If no match, do AGAIN2
;
IFFULL JSR OUTCBJSR IFWINADD R3,R3,#0BRp TWOWIN ; If match, PLAY2 winsADD R4,R4,#-1BRp NEXTLOOP ; If match, the next roundJSR OUTTIE ; If match, output tie hintBRnzp STOP ; Jump to HALT
;
ONEWIN JSR OUTP1WIN ; output PLAY1 winsBRnzp STOP
;
TWOWIN JSR OUTP2WIN ; output PLAY2 wins
;
STOP HALT
;
;
;
;
;
;
OUTP1IN ST R7,SaveR7 LEA R0,P1IN ; Get the address of P1INTRAP x22 LD R7,SaveR7RET
;
OUTP2IN ST R7,SaveR7LEA R0,P2IN ; Get the address of P2INTRAP x22LD R7,SaveR7RET
;
OUTERROR ST R7,SaveR7ST R0,SaveR0LEA R0,ERROR ; Get the first address of ERRORTRAP x22LD R0,ASCIINewLine ; Output newlineTRAP x21LD R0,SaveR0LD R7,SaveR7RET
;
OUTP1WIN ST R7,SaveR7 LEA R0,P1WIN ; Get the address of P1WINTRAP x22LD R0,ASCIINewLine ; Output newlineTRAP x21LD R7,SaveR7RET
;
OUTP2WIN ST R7,SaveR7LEA R0,P2WIN ; Get the address of P2WINTRAP x22LD R0,ASCIINewLine ; Output newlineTRAP x21LD R7,SaveR7RET
;
OUTTIE ST R7,SaveR7LEA R0,TIE ; Get the address of TIETRAP x22LD R0,ASCIINewLine ; Output newlineTRAP x21LD R7,SaveR7RET
;
OUTX ST R7,SaveR7LD R0,ASCIIXTRAP x21LD R7,SaveR7RET
;
OUTO ST R7,SaveR7LD R0,ASCIIOTRAP x21LD R7,SaveR7RET
;
OUTNull ST R7,SaveR7LD R0,ASCIINullTRAP x21LD R7,SaveR7RET
;
OUTSpace ST R7,SaveR7LD R0,ASCIISpaceTRAP x21LD R7,SaveR7RET
;
OUTNewLine ST R7,SaveR7ST R0,SaveR0LD R0,ASCIINewLineTRAP x21LD R0,SaveR0LD R7,SaveR7 RET
;
;
PLAY1 .FILL #1
PLAY2 .FILL #-1
FULL .FILL #18
SaveR00 .FILL #0
SaveR0 .FILL #0
SaveR1 .FILL #0
SaveR2 .FILL #0
SaveR3 .FILL #0
SaveR4 .FILL #0
SaveR5 .FILL #0
SaveR6 .FILL #0
SaveR7 .FILL #0
SaveR07 .FILL #0THIRDSIX .FILL #36
ASCII .FILL #-48
ChessBoard .FILL x4000
LASTLINE .FILL x401E
P1IN .STRINGZ "Player 1, choose a column:"
P2IN .STRINGZ "Player 2, choose a column:"
ERROR .STRINGZ "Invalid move. Try again."
P1WIN .STRINGZ "Player 1 Wins."
P2WIN .STRINGZ "Player 2 Wins."
TIE .STRINGZ "Tie Game."
ASCIIX .FILL x0058
ASCIIO .FILL x004F
ASCIINull .FILL x002D
ASCIISpace .FILL x0020
ASCIINewLine .FILL x000A
;
;
;Judge the location. If match, R5=1, else R5=0; R6 represent the PLAY1 or PLAY2.
JUDGEMENT ST R1,SaveR1ST R2,SaveR2ST R3,SaveR3ST R7,SaveR07AND R3,R3,#0 ADD R3,R3,#6 ; R3 count for the line, initialize to 6LD R1,ASCII ADD R1,R1,R0 ; Convert from ASCII to number valueLD R0,LASTLINE ; Count the first locationADD R1,R1,#-1BRn BACK ADD R2,R1,#-5BRp BACK ADD R0,R0,R1
CheckNext LDR R1,R0,#0BRnp NEXTLINE ; Judge the next lineSTR R6,R0,#0 AND R5,R5,#0 ; R5 means the right or wrong locationADD R5,R5,#1 BRnzp BACK2 ; If match, right locationNEXTLINE ADD R0,R0,#-6ADD R3,R3,#-1BRnz BACKBRnzp CheckNext ; If match, jump to check next lineBACK AND R5,R5,#0
BACK2 LD R1,SaveR1LD R2,SaveR2LD R3,SaveR3LD R7,SaveR07RET
;
;
; Output the ChessBoard.
OUTCB ST R0,SaveR00ST R1,SaveR1ST R2,SaveR2ST R3,SaveR3ST R7,SaveR07AND R1,R1,#0 ; Clear R1AND R2,R2,#0 ; Clear R2LD R1,THIRDSIX ; R1 is a counter, initialize to 36LD R3,ChessBoard
NEXT3 ADD R3,R3,#1 ; R3 is a counter for newline LDR R0,R3,#-1BRp OBRz NULL BRn X
O JSR OUTO ; If postive, output 'O'BRnzp NEXT
NULL JSR OUTNull ; If zero, output '-'BRnzp NEXT
X JSR OUTX ; If negtive, output 'O'
NEXT ADD R2,R2,#1 ; Increment countADD R0,R2,#-6BRz NewLineJSR OUTSpace ; If match, output ' 'BRnzp NEXT2
NewLine AND R2,R2,#0 ; Clear R2JSR OUTNewLine
NEXT2 ADD R1,R1,#-1 ; Discrement countBRp NEXT3 LD R0,SaveR00LD R1,SaveR1LD R2,SaveR2LD R3,SaveR3LD R7,SaveR07 RET
;
;
;WIN OR FAIL. If win, R3=1, else R3=0; R6 represent the PLAY1 or PLAY2.R0 is the location.
IFWIN ST R1,SaveR11ST R2,SaveR22ST R4,SaveR44ST R5,SaveR55ST R6,SaveR66 ST R7,SaveR77 AND R1,R1,#0 ; R1 is a counter for four, initialize to 0AND R3,R3,#0 ; Clear R3AND R4,R4,#0 ; Clear R4AND R2,R2,#0 ; Clear R2ADD R7,R0,#0
;Calculate the coordinate position. R2 for list. R4 for row.LD R5,LOAC ; Load R5 -x4000ADD R5,R7,R5
DELETE6 ADD R5,R5,#-6BRn ROWSUMADD R4,R4,#1 ; R4 to count for rowBRnzp DELETE6
ROWSUM ADD R2,R5,#6 ; R2 to count for listST R4,SaveROW ; Save the data of row.ST R2,Savelist ; Save the data of list.NOT R6,R6ADD R6,R6,#1 ; If add -R6 to zero, match
; Up-column
CHECKNEXT ADD R4,R4,#-1 ; To check whether it's flow or notBRn DIRECTIONADD R7,R7,#-6 LDR R5,R7,#0ADD R5,R5,R6BRnp DIRECTIONADD R1,R1,#1 ; If match, increment countBRnzp CHECKNEXT
; Down-column
DIRECTION LD R4,SaveROWADD R7,R0,#0 ; Initialize the R7
CHECKNEXT1 ADD R4,R4,#1 ; To check whether it's flow or notBRn JUDGEFOURADD R7,R7,#6LDR R5,R7,#0ADD R5,R5,R6BRnp JUDGEFOURADD R1,R1,#1 ; If match, increment countBRnzp CHECKNEXT1JUDGEFOUR ADD R5,R1,#-3 ; If R5>=3, someone wins the gameBRn CROW ; Else to check the next group ADD R3,R3,#1BRnzp SOMEONEWIN CROW AND R1,R1,#0 ; R1 is a counter for four, initialize to 0ADD R7,R0,#0 ; Initialize the R7LD R2,Savelist
CHECKNEXT2 ADD R2,R2,#-1 ; To check whether it's flow or notBRn CROW1ADD R7,R7,#-1LDR R5,R7,#0ADD R5,R6,R5BRnp CROW1ADD R1,R1,#1 ; If match, increment countBRnzp CHECKNEXT2CROW1 ADD R7,R0,#0 ; Initialize the R7LD R2,Savelist
CHECKNEXT3 ADD R2,R2,#1 ; To check whether it's flow or notADD R5,R2,#-6BRzp JUDGEFOUR2 ADD R7,R7,#1LDR R5,R7,#0ADD R5,R5,R6BRnp JUDGEFOUR2ADD R1,R1,#1 ; If match, increment count BRnzp CHECKNEXT3 JUDGEFOUR2 ADD R5,R1,#-3 ; If R5>=3, someone wins the gameBRn INCLINED ; Else to check the next groupADD R3,R3,#1BRnzp SOMEONEWIN INCLINED AND R1,R1,#0 ; R1 is a counter for four, initialize to 0ADD R7,R0,#0 ; Initialize the R7LD R2,SavelistLD R4,SaveROWNEXTINCL ADD R4,R4,#-1 ; To check whether it's flow or notBRn INCLINED2ADD R2,R2,#-1 ; To check whether it's flow or notBRn INCLINED2ADD R7,R7,#-7LDR R5,R7,#0ADD R5,R5,R6BRnp INCLINED2ADD R1,R1,#1 ; If match, increment countBRnzp NEXTINCLINCLINED2 ADD R7,R0,#0 ; Initialize the R7LD R2,SavelistLD R4,SaveROWNEXTINCL1 ADD R4,R4,#1 ; To check whether it's flow or notADD R5,R4,#-6BRzp JUDGEFOUR3 ADD R2,R2,#1 ; To check whether it's flow or notADD R5,R2,#-6 BRzp JUDGEFOUR3ADD R7,R7,#7LDR R5,R7,#0ADD R5,R5,R6BRnp JUDGEFOUR3ADD R1,R1,#1 ; If match, increment countBRnzp NEXTINCL1 JUDGEFOUR3 ADD R5,R1,#-3 ; If R5>=3, someone wins the gameBRn BIAS ; Else to check the next group ADD R3,R3,#1BRnzp SOMEONEWIN BIAS AND R1,R1,#0 ; R1 is a counter for four, initialize to 0ADD R7,R0,#0 ; Initialize the R7LD R2,SavelistLD R4,SaveROWNEXTBIAS ADD R4,R4,#1 ; To check whether it's flow or notADD R5,R4,#-6BRzp NEXTBIAS2ADD R2,R2,#-1 ; To check whether it's flow or notBRn NEXTBIAS2ADD R7,R7,#5LDR R5,R7,#0ADD R5,R5,R6BRnp NEXTBIAS2ADD R1,R1,#1 ; If match, increment countBRnzp NEXTBIASNEXTBIAS2 ADD R7,R0,#0 ; Initialize the R7LD R2,SavelistLD R4,SaveROWNEXTBIAS1 ADD R4,R4,#-1 ; To check whether it's flow or notBRn JUDGEFOUR4ADD R2,R2,#1 ; To check whether it's flow or notADD R5,R2,#-6BRzp JUDGEFOUR4ADD R7,R7,#-5LDR R5,R7,#0ADD R5,R5,R6BRnp JUDGEFOUR4ADD R1,R1,#1 ; If match, increment countBRnzp NEXTBIAS1 JUDGEFOUR4 ADD R5,R1,#-3 ; If R5>=3, someone wins the gameBRn SOMEONEWIN ; Else end this subprogramADD R3,R3,#1BRnzp SOMEONEWIN SOMEONEWIN LD R1,SaveR11LD R2,SaveR22LD R4,SaveR44LD R5,SaveR55LD R6,SaveR66LD R7,SaveR77RET
;
SaveR11 .FILL #0
SaveR22 .FILL #0
SaveR44 .FILL #0
SaveR55 .FILL #0
SaveR66 .FILL #0
SaveR77 .FILL #0Savelist .FILL #0
SaveROW .FILL #0
LOAC .FILL xC001
;.END
LC-3下汇编实现简易版四子棋的游戏相关推荐
- 基于Python pygame简易版斗兽棋小游戏源代码
基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...
- 基于LC3模拟器的简单游戏设计:简易四子棋
一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...
- 深圳大学 计系1实验四—四子棋实验
实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...
- 深圳大学计系汇编语言实验--四子棋游戏
题面 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线.垂直线或者是对角线. 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通 ...
- 四子棋游戏--bingo game
最近自己编了一个四子棋的游戏.说明如下: 游戏简介: 一种常见的四子棋游戏,可以是人机对战,两人对战,或者网上对战. 游戏的双方轮流落子,每人持有21颗子.棋子共有6*7个位置,玩家的棋子总是落到 当 ...
- JAVA实现简易版【斗地主】小游戏
JAVA实现简易版[斗地主]小游戏 gitee项目源码链接:https://gitee.com/xzq25_com/playcardtest 效果展示:快来人机对战吧 一 二 三
- 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜
四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...
- 四子棋 java_java智能四子棋人机大战游戏设计(附项目,以及原创PSD,设计文档)...
本项目是使用java技术+自创"假设下子"算法开发的人机大战四子棋游戏客户端. 具体项目,以及原创PSD,设计文档,在文件末尾的百度云连接. 一. 小组说明: 组名:CST 组长: ...
- java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...
- python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏
继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...
最新文章
- R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图、自定义雷达图的线条类型、线条宽度、数据点大小、色彩等
- 请求https错误: unable to find valid certification
- 施工企业项目管理的系统修炼_施工企业项目亏损的11个主观因素
- Python 字符串笔记(转自木木)
- 不进化,则消亡——互联网时代企业管理的十项实践
- docker ubuntu 安装包_史上最全Docker环境安装指南
- 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
- 来呀,快活呀。iOS 超级码农群:538549344
- 迪克逊准则matlab,浙江科技学院学报
- vue 获取验证码倒计时组件
- 源码安装Bind 9.10 正式版 开启DLZ数据库支持 和 数据库view查询
- 红橙Darren视频笔记 面试题 为什么view获取宽高为0 onCreate onResume view.post源码浅析(继承activity api27)
- 必须掌握的Python技巧(二)
- Linux系统磁盘阵列创建教程----------(better late than never. 只要开始,虽晚不迟。)...
- 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
- 李江涛:使用Sakai构建开放式教学平台
- IDEA SVN拉下来的项目import project 没反应 解决方案
- Star Way To Heaven 二分 + 并查集 + Prime
- ios怎么把电话号码存到android,如何将苹果手机的通讯录导入到安卓手机中?看这里...
- 视频画中画制作,一款简单好上手的软件
热门文章
- 论文笔记 · Symmetry and Group in Attribute-Object Compositions(CVPR 2020)
- 如何理解概率论中的“矩”?
- 三国演义人物词频统计 -- Python
- Integer计算保留小数点位数
- java页面展示_JAVA页面展示问题
- ASPCMS调用分类名称及链接
- linux类mac桌面,让Linux Mint看起来更像Mac桌面的主题
- Photoshop-水印的制作方法
- 程序员的职业规划_程序员如何能做好职业规划,走出迷惘呢?这个能力矩阵法要告诉你...
- 延续性动词与非延续性动词及其转换