题面

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

本实验需要在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. 深圳大学 计系1实验四—四子棋实验

    实验要求 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 X 6的网格组成. 游戏规则如下: 两位选手依次轮流落子: 选手不能悔棋: 有子的地方不能继续 ...

  2. python人机对战的实验步骤_人机对战初体验:Python实现四子棋游戏

    继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩,展现出的围棋技艺已经到了人 ...

  3. 人机对战初体验:Python基于Pygame实现四子棋游戏

    人机对战初体验-四子棋游戏 继去年3月人机大战引发全球瞩目以来,围棋AI(人工智能)再度引发跨领域的关注:一个叫Master的围棋AI,几天时间,面对中日韩顶尖职业围棋选手,已取得60胜0败的恐怖战绩 ...

  4. 四子棋游戏--bingo game

    最近自己编了一个四子棋的游戏.说明如下: 游戏简介: 一种常见的四子棋游戏,可以是人机对战,两人对战,或者网上对战. 游戏的双方轮流落子,每人持有21颗子.棋子共有6*7个位置,玩家的棋子总是落到 当 ...

  5. [源码和文档分享]基于蒙特卡洛信心上限搜索树UTC算法的四子棋游戏

    1 实验任务简介 在M行N列的棋盘中,棋手每次只能在每一列当前的最底部落子,如果某一列已经落满,则不能在该列中落子,目标是在横向.纵向.两个斜向共四个方向中的任意一个方向上,使自己的棋子连成四个(或四 ...

  6. 【华为OD】社招算法真题:四子棋连,下棋后,棋子会落到最底部,实现一行、一列或者一条对角线 上有四个相同颜色的棋子,获胜

    四子棋 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个m行n列的垂直悬挂的 网格中,如下所示. 这个游戏的目的是在对手实现一行.一列或者一条对角线 上有四个 ...

  7. 四子棋 java_java智能四子棋人机大战游戏设计(附项目,以及原创PSD,设计文档)...

    本项目是使用java技术+自创"假设下子"算法开发的人机大战四子棋游戏客户端. 具体项目,以及原创PSD,设计文档,在文件末尾的百度云连接. 一. 小组说明: 组名:CST 组长: ...

  8. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  9. 基于LC3模拟器的简单游戏设计:简易四子棋

    一.实验目的 分析和理解指定的需解决问题. 利用LC-3的汇编代码设计实现相关程序. 通过LC-3仿真器调试和运行相关程序并得到正确的结果. 二.实验内容 四子棋是一款普遍流行的简易型桌面游戏,据说, ...

最新文章

  1. Dialog源码分析
  2. 惊现试衣间照片流出??
  3. cuda笔记-GPU多线程的奇偶排序
  4. Memcache 和 Radis 比较
  5. e-006 matlab,基于MATLAB进行潮流计算
  6. 计算机数据类型误差怎么解决,误差分析与数据处理
  7. C盘扩容-Win10
  8. Linux查看电脑启动时间,几种常用的「查看Linux开机时间」的命令
  9. 云台山风景美如画,四大网红打卡景点等你来!
  10. 大数据信息资料采集:百度地图腾讯地图高德地图商家信息采集
  11. 英语语法汇总(4.数量词)
  12. Java基础-Lambda表达式基础练习
  13. Android手机在Windows下一键截屏
  14. ARM服务器安装docker-compose
  15. 细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)
  16. wps word文档生成目录的时候显示断裂会生成大纲怎么办_自从学会了Word自动排版,我的秀发浓密多了...
  17. linux中grep -E参数,linux中grep命令
  18. Java-009-数组和日期时间类(Date,Calendar)详解
  19. linux黄颜色文件,了解 Linux 文件的颜色代码
  20. 一个简单的Java程序:My first Java!

热门文章

  1. 使用FrameWork发布IQD文件
  2. 2009世界500强:《财富》全球五百家公司排名
  3. Android开发实用小工具十一——亲戚称呼计算器
  4. windows系统下MySQL中遇到1045问题
  5. 京东搜索框html,京东添加搜索框代码模块点击搜索按钮失效 提示您访问的页面失联啦的处理方法...
  6. Python——LeetCode刷题——【977. 有序数组的平方】
  7. 配置中心 SpringCloud Nacos Config
  8. 2018-09-03 KK日记,记一次JVM内存使用过多的诊断
  9. 魂斗罗(CONTRA EVOLUTION):进化革命PC版
  10. 大厂面试系列(七):数据结构与算法等