深圳大学计系汇编语言实验--四子棋游戏
题面
四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线、垂直线或者是对角线。
本实验需要在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.
分析
子程序针对多复用内容:保存和恢复还有验证子程序
验证思路:当前点拓展
代码
;
; Mario Chan 2022/5/20 SZU "hahahahaha"
; ::
; :;J7, :, ::;7:
; ,ivYi, , ;LLLFS:
; :iv7Yi :7ri;j5PL
; ,:ivYLvr ,ivrrirrY2X,
; :;r@Wwz.7r: :ivu@kexianli.
; :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur
; ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17
; ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i
; :,, ,,: ,::ir@mingyi.irii:i:::j1jri7ZBOS7ivv,
; ,::, ::rv77iiiriii:iii:i::,rvLq@huhao.Li
; ,, ,, ,:ir7ir::,:::i;ir:::i:i::rSGGYri712:
; ::: ,v7r:: ::rrv77:, ,, ,:i7rrii:::::, ir7ri7Lri
; , 2OBBOi,iiir;r:: ,irriiii::,, ,iv7Luur:
; ,, i78MBBi,:,:::,:, :7FSL: ,iriii:::i::,,:rLqXv::
; : iuMMP: :,:::,:ii;2GY7OBB0viiii:i:iii:i:::iJqL;::
; , ::::i ,,,,, ::LuBBu BBBBBErii:i:i:i:i:i:i:r77ii
; , : , ,,:::rruBZ1MBBqi, :,,,:::,::::::iiriri:
; , ,,,,::::i: @arqiao. ,:,, ,:::ii;i7:
; :, rjujLYLi ,,:::::,:::::::::,, ,:i,:,,,,,::i:iii
; :: BBBBBBBBB0, ,,::: , ,:::::: , ,,,, ,,:::::::
; i, , ,8BMMBBBBBBi ,,:,, ,,, , , , , , :,::ii::i::
; : iZMOMOMBBM2::::::::::,,,, ,,,,,,:,,,::::i:irr:i:::,
; i ,,:;u0MBMOG1L:::i:::::: ,,,::, ,,, ::::::i:i:iirii:i:i:
; : ,iuUuuXUkFu7i:iii:i:::, :,:,: ::::::::i:i:::::iirr7iiri::
; : :rk@Yizero.i:::::, ,:ii:::::::i:::::i::,::::iirrriiiri::,
; : 5BMBBBBBBSr:,::rv2kuii:::iii::,:i:,, , ,,:,:i@petermu.,
; , :r50EZ8MBBBBGOBBBZP7::::i::,:::::,: :,:,::i;rrririiii::
; :jujYY7LS0ujJL7r::,::i::,::::::::::::::iirirrrrrrr:ii:
; ,: :@kevensun.:,:,,,::::i:i:::::,,::::::iir;ii;7v77;ii;i,
; ,,, ,,:,::::::i:iiiii:i::::,, ::::iiiir@xingjief.r;7:i,
; , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri::
; :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii:::.ORIG x3000
;=====设置棋盘=====LEA R0, ArrayLEA R1, First_Line
STR R1, R0, #0LEA R1, Second_Line
STR R1, R0, #1LEA R0, Array
LEA R1, Third_Line
STR R1, R0, #2LEA R0, Array
LEA R1, Forth_Line
STR R1, R0, #3LEA R0, Array
LEA R1, Fifth_Line
STR R1, R0, #4LEA R0, Array
LEA R1, Sixth_Line
STR R1, R0, #5;===========================================落棋区域,R6锁死==============================================
AND R6, R6, #0 ; R6表示当前是player1(z)还是2(n)JSR Display; 输出While ADD R6, R6, #0; 输入BRn Player_2_AskLEA R0, Ask_column1PUTS;BRnzp Player_Ask_FinishPlayer_2_Ask LEA R0, Ask_column2PUTS;Player_Ask_Finish IN ; 输入结果存在R0LD R1, ASC_NumberNOT R1, R1ADD R1, R1, #1ADD R0, R0, R1BRn Invalid; 判负ADD R1, R0, #-6 ;判是否超过6BRp InvalidLEA R1, Have ;找到对应的列ADD R0, R0, #-1ADD R1, R1, R0LDR R2, R1, #0BRn Invalid; 已经填满,非法BRnzp Valid; --输出不合法
Invalid LEA R0, Invalid_movePUTSBRnzp Player_Ask_Finish;--输入合法
Valid LEA R3, ArrayADD R3, R3, R2; R3此时是行首指针LDR R3, R3, #0ADD R3, R3, R0; 找到了改值地址ADD R4, R6, #0STR R4, R3, #0;R2是行(已经-1),R0是列,R3为当前地址ADD R2, R2, #-1STR R2, R1, #0 ; 让该列-1JSR Display; 输出JSR Check_Line; 返回0表示未定胜局LD R5, Return_valueBRz Check_ColumnBRnzp PUTS_WinnerCheck_Column JSR Check_column; 返回0表示未定胜局LD R5, Return_valueBRz Check_DiagonalBRnzp PUTS_WinnerCheck_Diagonal JSR Check_diagonal; 返回0表示未定胜局LD R5, Return_valueBRz Check_FillBRnzp PUTS_WinnerCheck_FillLD R5, left_fill; 检查是否填完了ADD R5, R5, #-1BRz DONEST R5, left_fillNOT R6, R6BRnzp WhilePUTS_Winner ADD R6, R6, #0BRn Winner_is_2 LEA R0, Win_1BRnzp PUT_WinWinner_is_2 LEA R0, Win_2PUT_Win PUTSHALTDONE LEA R0, Win_both; 平局PUTS HALT;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%数据以及子程序区域%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;--字符--player_one .FILL x004F
player_two .FILL x0058
no_chess .FILL x002D
change_line .FILL x000A
Space .FILL x0020
ASC_Number .FILL x0030
Ask_column1 .STRINGZ "Player 1, choose a column: "
Ask_column2 .STRINGZ "Player 2, choose a column: "
Invalid_move .STRINGZ "Invalid move. Try again."
Win_1 .STRINGZ "Player 1 Wins."
Win_2 .STRINGZ "Player 2 Wins."
Win_both .STRINGZ "Tie Game.";---保留字,注意R7---Save0 .FILL x0000
Save1 .FILL x0000
Save2 .FILL x0000
Save3 .FILL x0000
Save4 .FILL x0000
Save5 .FILL x0000
Save6 .FILL x0000
Return_value .FILL x0000
left_fill .FILL x0024;--棋盘--
Array .BLKW 6 #0
First_Line .BLKW 6 #1
Second_Line .BLKW 6 #1
Third_Line .BLKW 6 #1
Forth_Line .BLKW 6 #1
Fifth_Line .BLKW 6 #1
Sixth_Line .BLKW 6 #1
Have .BLKW 6 #5;----保存和恢复除了R7的所有寄存器------
;调用前面加上ST R7,save7,后面加上LD R7,save7SaveR ST R0,Save0ST R1,Save1ST R2,Save2ST R3,Save3ST R4,Save4ST R5,Save5ST R6,Save6RET
RecoverR LD R0,Save0LD R1,Save1LD R2,Save2LD R3,Save3LD R4,Save4LD R5,Save5LD R6,Save6RET;---------------判断横向是否连成4个--------------------Check_Line ST R7, Save7; 存值JSR SaveRLD R7, Save7; R2行,R0列,R3为当前地址, R4为值NOT R1, R4ADD R1, R1, #1AND R4, R4, #0; 计数器ADD R4, R4, #1ADD R5, R3, #1; 指针LOOP1 ADD R6, R5, #-6BRz LOOP1_DONELDR R2, R5, #0ADD R6, R1, R2BRnp LOOP1_DONEADD R4, R4, #1ADD R5, R5, #1BRnzp LOOP1LOOP1_DONEADD R5, R3, #-1; 指针LOOP2 ADD R5, R5, #0BRn LOOP2_DONELDR R2, R5, #0ADD R6, R1, R2BRnp LOOP2_DONEADD R4, R4, #1ADD R5, R5, #-1BRnzp LOOP2LOOP2_DONE ADD R4, R4, #-4BRzp SKIP1AND R0, R0, #0ST R0, Return_valueBRnzp SKIP2SKIP1 AND R0, R0, #0ADD R0, R0, #1ST R0, Return_valueSKIP2ST R7, Save7; 还原值JSR RecoverRLD R7, Save7RET;---------------判断纵向是否连成4个--------------------Check_column ST R7, Save7; 存值JSR SaveRLD R7, Save7; R2行(已经-1),R0列,R3为当前地址, R4为值 ADD R2, R2, #2ADD R1, R0, #0 ; R1为列, R2为行AND R5, R5, #0 ; 计数器ADD R5, R5, #1NOT R4, R4 ;值ADD R4, R4, #1LOOP3 ADD R0, R2, #-6BRz LOOP3_DONELEA R0, ArrayADD R0, R0, R2LDR R0, R0, #0ADD R0, R0, R1 ; 找到地址LDR R0, R0, #0ADD R0, R0, R4BRnp LOOP3_DONEADD R2, R2, #1ADD R5, R5, #1BRnzp LOOP3LOOP3_DONE ADD R5, R5, #-4BRn SKIP3AND R0, R0, #0ADD R0, R0, #1ST R0, Return_valueBRnzp SKIP4SKIP3AND R0, R0, #0ST R0, Return_valueSKIP4ST R7, Save7; 存值JSR RecoverRLD R7, Save7RET;-------------------判断斜线是否有4个----------------------Check_diagonal ST R7, Save7; 存值JSR SaveRLD R7, Save7; R2行(已经-1),R0列,R3为当前地址, R4为值 ADD R2, R2, #1ADD R1, R0, #0 ; R1为列, R2为行AND R5, R5, #0 ; R5计数器ADD R5, R5, #1NOT R6, R4 ; R6为值ADD R6, R6, #1ADD R3, R2, #1 ; R3表示行, R4表示列ADD R4, R1, #1LOOP5 ADD R0, R3, #-6BRz LOOP5_DONEADD R0, R4, #-6BRz LOOP5_DONELEA R0, ArrayADD R0, R0, R3LDR R0, R0, #0ADD R0, R0, R4LDR R0, R0, #0ADD R0, R0, R6BRnp LOOP5_DONEADD R5, R5, #1ADD R3, R3, #1ADD R4, R4, #1BRnzp LOOP5LOOP5_DONEADD R3, R2, #-1ADD R4, R1, #-1LOOP6 ADD R3, R3, #0BRn LOOP6_DONEADD R4, R4, #0BRn LOOP6_DONELEA R0, ArrayADD R0, R0, R3LDR R0, R0, #0ADD R0, R0, R4LDR R0, R0, #0ADD R0, R0, R6BRnp LOOP6_DONEADD R5, R5, #1ADD R3, R3, #-1ADD R4, R4, #-1BRnzp LOOP6LOOP6_DONEADD R5, R5, #-4BRzp YESAND R5, R5, #0ADD R5, R5, #1ADD R3, R2, #1ADD R4, R1, #-1LOOP7 ADD R0, R3, #-6BRz LOOP7_DONEADD R4, R4, #0BRn LOOP7_DONELEA R0, ArrayADD R0, R0, R3LDR R0, R0, #0ADD R0, R0, R4LDR R0, R0, #0ADD R0, R0, R6BRnp LOOP7_DONEADD R5, R5, #1ADD R3, R3, #1ADD R4, R4, #-1BRnzp LOOP7LOOP7_DONEADD R3, R2, #-1ADD R4, R4, #1LOOP8 ADD R3, R3, #0BRn LOOP8_DONEADD R0, R4, #-6BRn LOOP8_DONELEA R0, ArrayADD R0, R0, R3LDR R0, R0, #0ADD R0, R0, R4LDR R0, R0, #0ADD R0, R0, R6BRnp LOOP8_DONEADD R5, R5, #1ADD R3, R3, #-1ADD R4, R4, #1BRnzp LOOP8LOOP8_DONEADD R5, R5, #-4BRzp YESBRnzp RECYES AND R0, R0, #0ADD R0, R0, #1ST R0, Return_valueBRnzp RECAND R0, R0, #0ST R0, Return_valueRECST R7, Save7; 还原值JSR RecoverRLD R7, Save7RET;----------------------输出子程序--------------------------
;字符常量复刻
player_one2 .FILL x004F
player_two2 .FILL x0058
change_line2 .FILL x000A
Space2 .FILL x0020
no_chess2 .FILL x002DOutput_R7 .FILL x0000
Save7 .FILL x0000Display ST R7, Save7; 存值JSR SaveRLD R7, Save7LEA R1, ArrayLDR R2, R1, #0 ; 第一维指向第一行指针AND R3, R3, #0; 第一维计数器LOOP_Display1 ADD R5, R3, #-6BRz Display_Done; 六行扫描完AND R4, R4, #0; 第二维计数器LOOP_Display2 LDR R0, R2, #0; 字符放在R0BRz Player1BRp NoPlayerBRn Player2Player1 LD R0, player_one2BRnzp OUTPUTPlayer2 LD R0, player_two2BRnzp OUTPUTNoPlayer LD R0, no_chess2BRnzp OUTPUTOUTPUT ST R7, Output_R7OUTLD R7, Output_R7ADD R2, R2, #1ADD R4, R4, #1ADD R5, R4, #-6BRz Line_Finish; 如果最后一位,跳转LD R0, Space2ST R7, Output_R7OUTLD R7, Output_R7BRnzp LOOP_Display2Line_Finish LD R0, change_line2ST R7, Output_R7OUTLD R7, Output_R7ADD R1, R1, #1LDR R2, R1, #0ADD R3, R3, #1BRnzp LOOP_Display1Display_Done ST R7, Save7; 还原值JSR RecoverRLD R7, Save7RET
;------------------------------------------------------
.END;*********************************************
; _ooOoo_
; o8888888o
; 88" . "88
; (| -_- |)
; O\ = /O
; ____/`---'\____
; .' \\| |// `.
; / \\||| : |||// \
; / _||||| -:- |||||- \
; | | \\\ - /// | |
; | \_| ''\---/'' | |
; \ .-\__ `-` ___/-. /
; ___`. .' /--.--\ `. . __
; ."" '< `.___\_<|>_/___.' >'"".
; | | : `- \`.;`\ _ /`;.`/ - ` : | |
; \ \ `-. \_ __\ /__ _/ .-` / /
;======`-.____`-.___\_____/___.-`____.-'======
; `=---='
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Buddha Bless, No Bug !
深圳大学计系汇编语言实验--四子棋游戏相关推荐
- 深圳大学 计系1实验四—四子棋实验
实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...
- python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏
继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...
- 人机对战初体验:Python基于Pygame实现四子棋游戏
人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...
- 四子棋游戏--bingo game
最近自己编了一个四子棋的游戏.说明如下: 游戏简介: 一种常见的四子棋游戏,可以是人机对战,两人对战,或者网上对战. 游戏的双方轮流落子,每人持有21颗子.棋子共有6*7个位置,玩家的棋子总是落到 当 ...
- [源码和文档分享]基于蒙特卡洛信心上限搜索树UTC算法的四子棋游戏
1 实验任务简介 在M行N列的棋盘中,棋手每次只能在每一列当前的最底部落子,如果某一列已经落满,则不能在该列中落子,目标是在横向.纵向.两个斜向共四个方向中的任意一个方向上,使自己的棋子连成四个(或四 ...
- 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜
四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...
- 四子棋 java_java智能四子棋人机大战游戏设计(附项目,以及原创PSD,设计文档)...
本项目是使用java技术+自创"假设下子"算法开发的人机大战四子棋游戏客户端. 具体项目,以及原创PSD,设计文档,在文件末尾的百度云连接. 一. 小组说明: 组名:CST 组长: ...
- java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...
- 基于LC3模拟器的简单游戏设计:简易四子棋
一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...
最新文章
- Dialog源码分析
- 惊现试衣间照片流出??
- cuda笔记-GPU多线程的奇偶排序
- Memcache 和 Radis 比较
- e-006 matlab,基于MATLAB进行潮流计算
- 计算机数据类型误差怎么解决,误差分析与数据处理
- C盘扩容-Win10
- Linux查看电脑启动时间,几种常用的「查看Linux开机时间」的命令
- 云台山风景美如画,四大网红打卡景点等你来!
- 大数据信息资料采集:百度地图腾讯地图高德地图商家信息采集
- 英语语法汇总(4.数量词)
- Java基础-Lambda表达式基础练习
- Android手机在Windows下一键截屏
- ARM服务器安装docker-compose
- 细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)
- wps word文档生成目录的时候显示断裂会生成大纲怎么办_自从学会了Word自动排版,我的秀发浓密多了...
- linux中grep -E参数,linux中grep命令
- Java-009-数组和日期时间类(Date,Calendar)详解
- linux黄颜色文件,了解 Linux 文件的颜色代码
- 一个简单的Java程序:My first Java!
热门文章
- 使用FrameWork发布IQD文件
- 2009世界500强:《财富》全球五百家公司排名
- Android开发实用小工具十一——亲戚称呼计算器
- windows系统下MySQL中遇到1045问题
- 京东搜索框html,京东添加搜索框代码模块点击搜索按钮失效 提示您访问的页面失联啦的处理方法...
- Python——LeetCode刷题——【977. 有序数组的平方】
- 配置中心 SpringCloud Nacos Config
- 2018-09-03 KK日记,记一次JVM内存使用过多的诊断
- 魂斗罗(CONTRA EVOLUTION):进化革命PC版
- 大厂面试系列(七):数据结构与算法等