CS61B项目练习笔记(一)--Proj0
本人项目链接CS61B-Tutorial/proj0/game2048 at main · xxbaizero0/CS61B-Tutorial (github.com)
我的任务仅驻留在 Model.java
并且仅限于四个方法:
public static boolean emptySpaceExists(Board b)
public static boolean maxTileExists(Board b)
public static boolean atLeastOneMoveExists(Board b)
public boolean tilt(Side side)
前置工作
配置项目cdk,导入库
我们想要使用 javalib
文件夹中的这些 .jar
文件。仍然在“项目结构”中,单击左侧名为“库”的项目设置部分。如果您看到已添加, javalib
则无事可做。否则,我们将单击“+”按钮,然后单击“Java”,这将启动我们操作系统的文件浏览器,然后单击该 javalib
文件夹。然后,在屏幕的右下角,点击“应用”,然后点击蓝色的“确定”按钮。
修改项目文件
游戏运行的上下左右移动键为英语语言下的按键,我们需要修改GUISource.java
代码答案
public static boolean emptySpaceExists(Board b)
1 | /** Returns true if at least one space on the Board is empty. |
public static boolean maxTileExists(Board b)
1 | /** |
public static boolean atLeastOneMoveExists(Board b)
1 | public static boolean atLeastOneMoveExists(Board b) { |
调用了emptySpaceExists()
函数,实际上增加了无所谓的时间,但是如果要完善的话if条件句还需要加长,可读性不高,因此没有修改。
如果有任何有效的移动,则应返回 true。所谓“有效移动”,是指如果用户在玩 2048 时可以按下一个按钮(UP、DOWN、LEFT 或 RIGHT),导致至少一个图块移动,那么这样的按键被视为有效移动。
有两种方法可以进行有效移动:
- 棋盘上至少有一个空白区域。
- 有两个相邻的图块具有相同的值。
例如,对于下面的板,我们应该返回 true,因为至少有一个空白区域。
1 | | 2| | 2| | |
对于下面的板子,我们应该返回 false。无论你在 2048 年按下什么按钮,都不会发生任何事情,即没有两个相邻的瓷砖具有相等的值。
1 | | 2| 4| 2| 4| |
对于下面的棋盘,我们将返回 true,因为向右或向左移动将合并两个 64 个图块,并且向上或向下移动将合并 32 个图块。或者换句话说,至少存在两个值相等的相邻图块。
1 | | 2| 4| 64| 64| |
public boolean tilt(Side side)
倾斜方法的工作是实际移动所有瓷砖。如:
1 | | 2| | 2| | |
然后按 up,将修改 board
实例变量, tilt
使游戏的状态现在为:
1 | | 2| 8| 4| 2| |
除了修改板之外,还必须发生另外两件事:
- 必须更新评分实例变量,以反映所有图块合并的总值(如果有)。在上面的例子中,我们将两个 4 合并成一个 8,将两个 2 合并成一个 4,因此分数应该增加 8 + 4 = 12。
- 如果板发生任何变化,我们必须将
changed
局部变量设置为true
。这是因为在 的tilt
框架代码的末尾,您可以看到我们调用了一个setChanged()
方法:这通知 GUI 有一些东西要绘制。您不会对自己setChanged
进行任何调用:只需修改changed
局部变量。
示例:
tip
- 我们可以只专注于一个方向的实现,然后通过数组的旋转来实现多方向的实现。
- 由上图可知,我们最好从每列顶部开始遍历,这样才能符合游戏逻辑
答案
1 | public boolean tilt(Side side) { |