深 圳 大 学 实 验 报 告
课程名称 计算机系统1
项目名称 简易版四子棋游戏设计
学 院 计算机与软件学院
专 业
指导教师
报 告 人 学号
实验时间 2017年5月8日
提交时间 2017年6月4日星期日
教务处制
一、实验目的与要求
(1)分析和理解试验指定的问题;
(2)掌握子函数的编写与使用;
(3)利用LC-3的汇编代码设计实现比较复杂程序。
二、实验内容与方法
实验内容:在LC-3中实现简易版四子棋的游戏,两位选手通过键盘和输出窗口轮流交互操作,棋盘由6 * 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.
实验分为4个步骤:
1) 分解任务
2) 模块细化
3) 编写汇编代码
4) 调试
三、实验步骤与过程
1) 分解任务
分析题目要求,得到初步流程图,如下:
在本四子棋游戏中,最多填子36次,故设置循环变量,是填子、显示棋盘、判断循环36次,若中间有人赢了,就跳出循环。
虽然双方在输入前三颗子时必定不会谁输谁赢,但是为了流程简单,在下完每颗子后都判断一下是否有人已经赢了。
显然,显示棋盘,填子,判断这三个模块要多次用到,故应该写成子函数格式。
2) 模块细化
为了简化实验,先按照上述流程编写一个C语言程序实现功能,然后对照C语言程序进行汇编程序的细化。
输出棋盘:该子函数十分简单,不需要从主函数中传递任何参数。只需要在子函数中加载存放棋子的首地址,然后用两层循环输出。
用C语言表示如下,但用汇编不需要传参数,因为可以用LEA指令直接加载a的地址。
填子:在填子中,需要判断a[i][j]是否已经有棋子了,在C语言中a[i][j]可以直接表示,但在汇编中却需要大费周章。于是再编写一个为子函数服务的子函数:返回a[i][j]的地址与值。如果值表示为空(即还没填子),那就用ST指令向该地址填入某个选手的棋子。