• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 问题清单 > 正文

    深圳大学 计算机系统(1) 实验报告4:四子棋

    时间:2020-08-31 20:19:53 来源:勤学考试网 本文已影响 勤学考试网手机站

    深 圳 大 学 实 验 报 告

    课程名称 计算机系统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指令向该地址填入某个选手的棋子。

    判断:判断氛围四个判断:水平方向,竖直方向,对角线方向以及斜对角线方向。

    以水平方向为例:将填子地址水平前移3位,如a[i][j]向前移得到a[i][j-3] 。然后以a[i][j-3]为起点,判断水平四个棋子是否一致,一致则判断返回YES,从a[i][j-2]开始判断连续四个棋子是否相同,一直到从a[i][j]开始。如果都没有,则进行另外的判断。最后没有得到YES的话,就返回NO。

    整个程序的函数如下:

    3) 编写汇编代码

    就按照模块细化的要求逐条编辑指令,最后得到汇编程序。汇编程序见附件。

    4) 调试

    错误1:

    经检查,是标号错误,一个用的是sum,一个用的是SUM,将他们都改成SUM就行了。

    错误二:

    本想输出棋盘,结果显示下面左图,相关代码在右边:

    经修改后如下:

    错误三:

    如下图,发现R1和r1其实是一个东西,于是r1改名成rR1,编译通过。

    错误5:输出换行之前没有将R0中的值保存,改正之后就好了。

    错误6:偏移量超出指令范围。

    对此,只能改变rR1到rR7的内存地址,使其偏移不超过指令要求的偏移范围。

    在编写程序时,除了以上错误外,还有其他错误,经过一一改正后,最终得到正确程序。

    四、实验结论或体会

    程序应调试完成后,需经过多次测试,分别检验水平线、垂直线、对角线、斜对角线、平局,以及各种意外情况。

    测试一:测试水平线

    测试序列数:1,1,2,2,3,3,4.

    符合实验预期。

    测试二:测试垂直线

    测试序列数: 1,2,1,2,1,2,1.

    符合实验预期。

    测试三:测试对角线

    测试序列数:1,1,1,1,2,6,2,2,3,3,6,4

    符合实验预期。

    测试四:测试斜对角线

    测试序列数:1,2,2,3,3,1,4,4,3,4,4.

    符合实验预期。

    测试五:平局

    测试序列数:1,2,2,3,3,1,4,4,3,4,4.

    符合实验预期。

    测试六:错误输入

    1)当输入的不是1—6的字符时,

    2)当一列已经填子填满时

    经过上面的各种测试,所编写程序都与预期功能一致,故本程序满足实验要求。

    实验体会

    1) 编写的四子棋程序用C语言都有一点难,何况是用汇编语言呢。在编写本程序时,我断断续续地编写了近三周才完工,除了说明我比较懒之外,也说明程序比较难。

    2) 本程序我共编写了四百多行(算上各个输出语句所占内存,实际指令两百左右吧),本来是准备按标准模式来写(即先后顺序:主函数 -> 子函数 -> 数据区),但是这样写有些指令加载地址时发现偏移量已经超限,没办法,只有将数据放在离该指令比较近的地方,于是就造成了数据区被分成了许多块。

    3) 写汇编是会用到很多跳转,感觉跳转和C语言中的goto语句非常相似。程序一旦比较大,标签名就容易取重,为了避免这一点,我取得标签名就比较怪,可能过了一段时间自己都不知道是怎么取的了。在以后写程序,要注意标签名的选取。

    4)汇编语言相比高级语言来讲,更加接近于底层,因此细节考虑得更多,写的程序也更加繁杂,然后就造成了这么一个情况:我写的程序,过一段时间后,让我读这个程序,虽然是我自己写的,但仍然需要大量时间来理清思路。

    5) 总之一句话,多写。当初开学时,我可不认为我能写出本次试验的程序,感觉太难了。但是随着程序越写越多,从简单到复杂,虽然还是比较难,但自己已能克服了。

    指导教师批阅意见:

    成绩评定:

    指导教师签字:

    2017年 5月 1日

    备注:

    注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

    2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问