本项目中,同学们需要使用 Java 编程语言,结合课堂知识、lab 内容,实现一个简单的、可以在命令行下玩的斗兽棋游戏,并按要求编写一份开发文档,介绍你的实现方式、开发思路等内容。
关于项目有任何疑问,可以在 Issue 中提出:github.com/java-a/project1/issues。
斗兽棋是一款小众益智游戏,游戏规则在不同版本中各有差别。
在本项目中,我们使用野兽争霸斗兽棋
的游戏规则(链接:www.doushouqi.net )。
对游戏不熟悉的同学可以在网页中进行几盘游戏来熟悉规则。
另附包含单人模式的野兽争霸斗兽棋
链接:http://flash.7k7k.com/cms/cms10/20120717/1546039028/95197/index.html 。
Project 1 只要求完成命令行版的斗兽棋。 Project 2 将完成图形化界面。
在 Project 1 中,同学们需要完成的项目样例是 example
文件夹下的 Jungle.jar
。
运行方式:
- 下载至自己电脑中。
- 在
example
文件夹中打开命令行。 - 运行命令
java -jar Jungle.jar
。
斗兽棋的基本要素是地图。我们首先需要完成地图的读取,并在命令行中输出地图。
斗兽棋的地图横七列,纵九行。地图分为地形地图和动物地图。
我们通过读取地图文件的方式来载入地图。
000000000
000111000
200111004
320000045
200111004
000111000
000000000
数字 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
含义 | 空地 | 小河 | 左方陷阱 | 左方兽穴 | 右方陷阱 | 右方兽穴 |
动物地图记录了动物的初始位置。
608000107
020000040
003000500
000000000
005000300
040000020
701000806
数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
含义 | 无动物 | 鼠 | 猫 | 狼 | 狗 | 豹 | 虎 | 狮 | 象 |
以地形地图为例,我们将 tile.txt
放到项目根目录下(在 IntelliJ IDEA 中,放到与 src
同级的目录下)。
首先,使用 Scanner
类来读取文件:
Scanner scanner = new Scanner(new File("tile.txt"));
然后,使用 Scanner
的 nextLine()
方法获取文件内容:
String firstLine = scanner.nextLine();
执行完这行语句后,firstLine
的值为字符串 "000000000"
,即地形地图的第一行。
然后,我们再次使用 nextLine()
方法:
String secondLine = scanner.nextLine();
这样我们就得到了地形地图的第二行,secondLine
的值是字符串 "000111000"
。
以此类推,我们可以获取到 tile.txt
中的所有数据。使用相同的方法可以再获得 animal.txt
中的数据。
最后,根据得到的数据,我们可以将地图输出到命令行中。
注:图片截取自 IntelliJ ,推荐同学们在写代码时使用 IntelliJ 编写、运行程序。
- 地形输出:空地输出空格,小河输出"水",陷阱输出"陷",兽穴输出"家"。
- 动物输出:动物输出名字和数字,左方动物的数字在左侧,右方动物的数字在右侧。
- 如果一个位置上有动物,输出动物信息,不输出地形信息。
由于同时使用了中文、数字和空格,地图的对齐并没有那么容易。
如果没有正确对齐,地图会变得奇怪,比如这样:
因此,正确对齐地图是必要的。
每个地图上的格子,无论是动物还是地形,我们的输出都采用相同的格式:
半角字符 + 全角字符 + 半角字符
半角字符:半角字符一般包括英文字母、英文符号、数字和空格。在本项目中,我们的半角字符是空格或者数字。
全角字符:中文字符一般都是全角字符。
举例:
- 地图最左上角的
6虎
,是由半角字符6
+ 全角字符虎
+ 半角字符 - 地图中的
水
,是由半角空格 + 全角字符水
+ 半角空格组成的。 - 地图中的空地,是由半角空格 + 全角空格 + 半角空格组成的。
我们平时按空格打出的都是半角空格,关于全角空格,参考 全角空格_百度百科 。
斗兽棋的棋盘 斗兽棋的棋盘横七列,纵九行,棋子放在格子中。双方底在线各有三个陷阱(作品字排)和一个兽穴(于品字中间)。 棋牌中部有两片水域,称之为小河。
斗兽棋的棋子 斗兽棋棋子共十六个,分为红蓝双方,双方各有八只一样的棋子(下称为:兽 或 动物),按照战斗力强弱排列为:象>狮>虎>豹>狗>狼>猫>鼠。
斗兽棋的走法 游戏开始时,红方先走,然后轮流走棋。每次可走动一只兽,每只兽每次走一方格,除己方兽穴和小河以外,前后左右均可。但是,狮、虎、鼠还有不同走法:
狮虎跳河法:狮虎在小河边时,可以纵横对直跳过小河,且能把小河对岸的敌方较小的兽类吃掉,但是如果对方老鼠在河里,把跳的路线阻隔就不能跳,若对岸是对方比自己战斗力前的兽,也不可以跳过小河;
鼠游过河法:鼠是唯一可以走入小河的兽,走法同陆地上一样,每次走一格,上下左右均可,而且,陆地上的其他兽不可以吃小河中的鼠,小河中的鼠也不能吃陆地上的象,鼠类互吃不受小河影响。
斗兽棋的吃法 斗兽棋吃法分普通吃法和特殊此法,普通吃法是按照兽的战斗力强弱,强者可以吃弱者。 特殊吃法如下: 1、鼠吃象法:八兽的吃法除按照战斗力强弱次序外,惟鼠能吃象,象不能吃鼠。 2、互吃法:凡同类相遇,可互相吃。 3、陷阱:棋盘设陷阱,专为限制敌兽的战斗力(自己的兽,不受限制),敌兽走入陷阱,即失去战斗力,本方的任意兽类都可以吃去陷阱里的兽类。 综合普通吃法和特殊吃法,将斗兽棋此法总结如下:
鼠可以吃象、鼠 猫可以吃猫、鼠; 狼可以吃狼、猫、鼠; 狗可以吃狗、狼、猫、鼠; 豹可以吃豹、狗、狼、猫、鼠; 虎可以吃虎、豹、狗、狼、猫、鼠; 狮可以吃狮、虎、豹、狗、狼、猫、鼠; 象可以吃象、狮、虎、豹、狗、狼、猫;
注:
本项目中,斗兽棋胜负判定只要求完成:
- 任何一方的兽走入敌方的兽穴就算胜利(自己的兽类不可以走入自己的兽穴);
- 任何一方的兽被吃光就算失败,对方获胜
- 任何一方所有活着的兽被对方困住,均不可移动时,就算失败,对方获胜;
本项目不要求做无赖长杀、武松长杀、刷分等斗兽棋违例处理
在命令行中,我们无法使用鼠标来控制,需要通过读取键盘输入来控制动物。
我们使用数字1-8来表示动物,wasd代表上下左右。
数字 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
含义 | 鼠 | 猫 | 狼 | 狗 | 豹 | 虎 | 狮 | 象 |
字母 | w | a | s | d |
---|---|---|---|---|
含义 | 向上 | 向左 | 向下 | 向右 |
举例:
指令 | 含义 |
---|---|
1d | 鼠向右走一格 |
3w | 狼向上走一格 |
6a | 虎向左走一格(或向左跳过河) |
7s | 狮向下走一格(或向下跳过河) |
9a | 错误指令:9不对应任何动物 |
2b | 错误指令:b不对应任何方向 |
1sd | 错误指令:多余字符 'd' |
识别指令之后,根据指令移动动物。
有时动物按照规则可能不能执行指令,这时需要打印出不能执行的原因,让玩家重新输入指令。
样例:
玩家可以在游戏中任何时候输入help
查看帮助。
样例:
玩家可以输入exit
退出游戏。
玩家可以输入restart
来重新开始游戏。
玩家可以输入undo
来悔棋。
样例:
玩家可以输入redo
来取消悔棋。
样例 (接上图):
本项目满分100分,包括三个部分:基础部分、进阶部分和综合评价部分。其中,基础部分70分,进阶部分10分,综合评价部分20分。
基础部分 | 分数 |
---|---|
游戏地图:游戏能够读取地图并输出初始地图 | 10 |
游戏地图:地图输出格式始终正确 | 5 |
游戏指令:分辨指令格式的对错 | 2 |
游戏指令:正确识别动物移动(攻击)指令 | 3 |
游戏功能:帮助、退出 | 2 |
游戏功能:重新开始 | 3 |
游戏规则:动物不能走出地图边界 | 3 |
游戏规则:动物能按照规则移动至相邻空地 | 3 |
游戏规则:只有鼠能进出小河 | 3 |
游戏规则:只有虎、狮可以跳河 | 3 |
游戏规则:敌方鼠在虎、狮跳河路线中时,虎、狮不能跳河 | 2 |
游戏规则:己方动物不能进入己方兽穴 | 2 |
游戏规则:己方动物不能进入友方单位所在的格子 | 2 |
游戏规则:动物按照规则消灭敌方动物 | 5 |
游戏规则:动物不允许送死 | 2 |
游戏规则:双方轮流走子 (左方先走) | 5 |
胜负判定:任何一方的兽走入敌方的兽穴 | 3 |
胜负判定:任何一方的兽被吃光 | 1 |
胜负判定:任何一方所有活着的兽被对方困住,均不可移动 | 1 |
游戏运行总体正常,符合相关描述,不会异常退出 | 10 |
总分 | 70 |
进阶部分 | 分数 |
---|---|
游戏功能:悔棋 | 6 |
游戏功能:取消悔棋 | 3 |
上传项目至GitHub个人仓库 | 1 |
总分 | 10 |
综合评价部分 | 分数 |
---|---|
设计文档(包括但不限于程序结构设计与分析,主要函数的功能,简要描述如何使用你的程序,编程中遇到的问题和解决策略) | 8 |
代码风格(包括但不限于命名规范,缩进与换行,代码可读性) | 6 |
面试情况(能否清晰地解释程序结构,能否回答助教的问题等) | 5 |
意见与建议(包括但不限于对PJ1,PJ2,Lab,课堂),可随设计文档一起提交 | 1 |
总分 | 20 |
本次课程项目提交截止时间为 2016 年 11 月 13 日 23:59。
建议同学们在截止时间前一周就将项目基本完成,以防来不及完成,或者来不及修正突然发现的 bug 。
请提交源代码、文档。源代码应以项目的形式提交。如有必要可以提交其他材料。
在截止时间之前将提交材料压缩并上传到:
ftp://10.142.141.33/classes/16/161 程序设计(戴开宇)/WORK_UPLOAD/PJ1
压缩包请重命名为:学号 + 姓名
。 如 16302010001陈雷远.rar
,16302010002李云帆.zip
。
如果发现之前提交的文件有问题,可以重新上传压缩包。ftp不允许删除或者覆盖文件,需要上传一个新的压缩包,命名格式为:学号 + 姓名 + 次数
, 如16302010002李云帆2.zip
。
每迟交一天,最终得分扣除20%。
如:11月14日 00:01 AM 提交,扣除20%,11月16日 11:30 PM 提交,扣除60%。
注:如果提交多次,以面试时选择的提交文件的提交时间为准。评分亦以此文件为准。
本次课程项目面试时间为2016年 11月 15日 上午第三四节课,地点为机房,即Lab课组织面试。如有调整会提前通知。
原则上面试时不允许现场Debug,请确保你的程序能正常运行。
严禁任何形式的抄袭。
助教将检查每个同学的代码、文档等材料,如有发现抄袭现象,将严肃处理。
抄袭同学零分处理。被抄袭同学将视情况作出惩罚。