问题描述:

两位选手通过键盘和输出窗口轮流交互操作,棋盘由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下汇编实现简易版四子棋的游戏相关推荐

  1. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

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

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

  3. 深圳大学 计系1实验四—四子棋实验

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

  4. 深圳大学计系汇编语言实验--四子棋游戏

    题面 四子棋是个双人游戏,两人轮流下棋,棋盘由行和列组成的网格,每个选手每次下一个子直到两人中有一人的棋子连成一条水平线.垂直线或者是对角线. 本实验需要在LC-3中实现简易版四子棋的游戏,两位选手通 ...

  5. 四子棋游戏--bingo game

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

  6. JAVA实现简易版【斗地主】小游戏

    JAVA实现简易版[斗地主]小游戏 gitee项目源码链接:https://gitee.com/xzq25_com/playcardtest 效果展示:快来人机对战吧 一 二 三

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

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

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

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

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

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

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

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

最新文章

  1. R语言使用ggradar包可视化基本雷达图(radar chart、蜘蛛图spider plot)、可视化单个数据对象的雷达图、自定义雷达图的线条类型、线条宽度、数据点大小、色彩等
  2. 请求https错误: unable to find valid certification
  3. 施工企业项目管理的系统修炼_施工企业项目亏损的11个主观因素
  4. Python 字符串笔记(转自木木)
  5. 不进化,则消亡——互联网时代企业管理的十项实践
  6. docker ubuntu 安装包_史上最全Docker环境安装指南
  7. 什么是序列化? 您需要通过示例解释的有关Java序列化的所有知识
  8. 来呀,快活呀。iOS 超级码农群:538549344
  9. 迪克逊准则matlab,浙江科技学院学报
  10. vue 获取验证码倒计时组件
  11. 源码安装Bind 9.10 正式版 开启DLZ数据库支持 和 数据库view查询
  12. 红橙Darren视频笔记 面试题 为什么view获取宽高为0 onCreate onResume view.post源码浅析(继承activity api27)
  13. 必须掌握的Python技巧(二)
  14. Linux系统磁盘阵列创建教程----------(better late than never. 只要开始,虽晚不迟。)...
  15. 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
  16. 李江涛:使用Sakai构建开放式教学平台
  17. IDEA SVN拉下来的项目import project 没反应 解决方案
  18. Star Way To Heaven 二分 + 并查集 + Prime
  19. ios怎么把电话号码存到android,如何将苹果手机的通讯录导入到安卓手机中?看这里...
  20. 视频画中画制作,一款简单好上手的软件

热门文章

  1. 论文笔记 · Symmetry and Group in Attribute-Object Compositions(CVPR 2020)
  2. 如何理解概率论中的“矩”?
  3. 三国演义人物词频统计 -- Python
  4. Integer计算保留小数点位数
  5. java页面展示_JAVA页面展示问题
  6. ASPCMS调用分类名称及链接
  7. linux类mac桌面,让Linux Mint看起来更像Mac桌面的主题
  8. Photoshop-水印的制作方法
  9. 程序员的职业规划_程序员如何能做好职业规划,走出迷惘呢?这个能力矩阵法要告诉你...
  10. 延续性动词与非延续性动词及其转换