简单游戏设计

计算机系统 实验4

实验目的:

设计6 X 6的网格棋盘下的四子游戏:

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

实验内容与实验要求:

实验内容:

本实验需要在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.

示例输出

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

Player 1, choose a column: 1

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

O - - - - -

Player 2, choose a column: 2

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- - - - - -

O X - - - -

Player 1, choose a column: 2

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- O - - - -

O X - - - -

Player 2, choose a column: 3

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- O - - - -

O X X - - -

Player 1, choose a column: 3

- - - - - -

- - - - - -

- - - - - -

- - - - - -

- O O - - -

O X X - - -

Player 2, choose a column: 1

- - - - - -

- - - - - -

- - - - - -

- - - - - -

X O O - - -

O X X - - -

Player 1, choose a column: 4

- - - - - -

- - - - - -

- - - - - -

- - - - - -

X O O - - -

O X X O - -

Player 2, choose a column: 4

- - - - - -

- - - - - -

- - - - - -

- - - - - -

X O O X - -

O X X O - -

Player 1, choose a column: 3

- - - - - -

- - - - - -

- - - - - -

- - O - - -

X O O X - -

O X X O - -

Player 2, choose a column: 4

- - - - - -

- - - - - -

- - - - - -

- - O X - -

X O O X - -

O X X O - -

Player 1, choose a column: 4

- - - - - -

- - - - - -

- - - O - -

- - O X - -

X O O X - -

O X X O - -

Player 1 Wins.

----- Halting the processor -----

参考程序在内存中分配36个空间来表示棋盘的每个位置,最简单的遍历棋盘的方法为:如果该位置为空,则存放0,如果该位置为选手一的棋子,则存放1,如果为选手二的棋子,则存放-1,这样可以最大程度的使用状态码。

记得所有的输入和输出使用ASCII字符,必要时自己转换。

从键盘接收输入时使用TRAP x20 (GETC),显示字符时使用TRAP x20 和TRAP x21 (OUT),合适的地方使用子例程,每次子例程都应暂存和恢复要使用的寄存器,这样有利于调试程序。

程序首行指定第一条指令的地址,即.ORIG x3000。

最后提交的文件为connect4.asm,并提交试验报告。

实验步骤

1.对整个游戏进行分析,并将任务规划分为不同的模块,设计子程序(代码可以见附件):

(1)设计名为QIPANSHUCHU的子程序,来实现对棋盘内容的输出棋盘内容为1表示是棋手一下的棋,为-1表示是棋手二下的棋(要求棋盘存储空间预设为36个连续的空间)该子程序无需传数接口但是:要求在设计子程序前事先了解棋盘位置和标签

(2)设计名为PlayerQIAN1的子程序输出“Player 1, choose a column:”(无需传数接口)

(3)设计名为PlayerQIAN2的子程序输出“Player 2, choose a column:” (无需传数接口)

(4)设计名为TIANCHONG的子程序,对棋手的输入进行棋盘的填充----棋手一下的棋子填充1,棋手二下的棋子填充-1

子程序接口设计:

要求R0存储填充人,第一位player为1,第二位player为2——R0中只支持1和2

    R1存储填充列数——只支持1—6 (以R1返回7为正确操作,否则需要进行重新输入)

对于错误的操作,这句话提示“Invalid move. Try again.”以及换行符,由该子程序输出

(5)设计名为DUAN的子程序用于判断所取4个内存数的大小是否相等且不为0——实际上是作为LOSEORWIN的子程序帮助其进行结果的判断(要求内存数也与棋盘数据表示方式一致1表示是棋手一下的棋,为-1表示是棋手二下的棋)

该子程序无需传数接口,但是:要求在设计子程序前事先了解内存中4个数的位置和标签

     对于4个内存数的大小相等且不为0,由该子程序输出游戏结果:“Player 1 W   ins.”或“Player 2 Wins.”

(6)设计名为LOSEORWIN的子程序实现对棋盘胜负的判断(平局由主程序实现)

该子程序无需传数接口,但是:要求在设计子程序前事先了解棋盘位置和标签

实现算法是枚举——主要是分HENG、ZONG、XIE61、XIE62、XIE51、XIE52、XIE41、XIE42、XIE43、XIE44这几种情况从棋盘中取数,存入规定的4个连续内存之中调用DUAN子程序进行4个内存数的判断——没有结果直接返回,有结果直接输出,然后终止程序。

2.由主程序进行调用串联子程序的功能实现游戏的正常运行

代码如下:

;主函数中一直使用R6存储轮流到谁,R5记录轮流次数

.ORIG                  x3000

                        JSR         QIPANSHUCHU

          AND         R6,R6,0

          AND         R5,R5,0

          ADD         R5,R5,12

          ADD         R5,R5,12

          ADD         R5,R5,12

ZHSXH                ADD         R5,R5,-1

                        BRZP         PINGJUTIAO

                        LEA           R0, PINJUSHU

                     PUTS

                     HALT

PINGJUTIAO            ADD         R6,R6,1

AND         R6,R6,1

BRZ          Player2QIANJ

                        JSR           PlayerQIAN1

                     BRNZP       QIANHUI

LIN                 .FILL       x0030;           表示0

PINJUSHU             .STRINGZ   “Tie Game.”;     为平局的输出准备

Player2QIANJ           JSR          PlayerQIAN2

QIANHUI                IN

                         LD           R1,LIN

                         NOT        R1,R1

                         ADD        R1,R1,1

                         ADD        R1,R0,R1

                        AND          R0,R6,1

                         BRP         TIAO

                         ADD        R0,R0,2

TIAO                    JSR         TIANCHONG

                         AND        R0,R0,0

                         ADD        R0,R0,7

                         NOT        R0,R0

                         ADD        R0,R0,1

                         ADD        R1,R1,R0

                         BRZ          TIANCHONGHUI

                         BRNP        ZHSXHHUI

ZHSXHHUI             ADD         R5,R5,1

                         ADD         R6,R6,1

                         BRNZP     ZHSXH

TIANCHONGHUI          JSR      QIPANSHUCHU

                       ADD        R0,R0,-11

                       ADD        R0,R0,-11

          ADD        R0,R5,R0

          BRP        ZHSXH

          JSR           LOSEORWIN

          BRNZP       ZHSXH

实验结论:

输赢判断

平局判断

报错判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值