proj0. 2048 of CS61B of UCB
2022/1/31 6:04:23
本文主要是介绍proj0. 2048 of CS61B of UCB,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Intro
在这个项目中, 我们需要解决四个任务. 我会谈到我是怎么处理这四个问题的.
Task 1. public static boolean emptySpaceExists(Board b)
这个任务要求我们检查 2048 的是否存在空格子. 解决办法很容易想到: 遍历一边所有的格子看看是否有空的即可. 查看其他文件就可以知道要用到什么 API 来完成这个功能. 比如我们可以通过 board.tile(col, row)
来获取对应的格子. 通过返回的状态就可以知道是不是空的.
/** Returns true if at least one space on the Board is empty. * Empty spaces are stored as null. * */ public static boolean emptySpaceExists(Board b) { int size = b.size(); for (int col = 0; col < size; col++) { for (int row = 0; row < size; row++) { if (b.tile(col, row) == null) { return true; } } } return false; }
Task 2. public static boolean maxTileExists(Board b)
这个其实跟任务一很类似, 只是此时我们不是要判断格子是否为空, 我们是要判断格子的值是否为一个特定的值, 这其实还是很容易想到的. 因为我们还是通过遍历来解决这个问题, 只是判断的条件变为: t.values() == MAX_PIECE
.
/** * Returns true if any tile is equal to the maximum valid value. * Maximum valid value is given by MAX_PIECE. Note that * given a Tile object t, we get its value with t.value(). */ public static boolean maxTileExists(Board b) { int size = b.size(); for (int col = 0; col < size; col++) { for (int row = 0; row < size; row++) { Tile t = b.tile(col, row); // only when t != null should we check t.value() if (t != null && t.value() == MAX_PIECE) { return true; } } } return false; }
Task 3. public static boolean atLeastOneMoveExists(Board b)
确实, 这个问题对新手来说会比较有挑战性. 问题的关键在于如何判断出 2048 的方格上是否能继续玩下去, 主要有两种情形
- 2048 的所有方格中至少有一个是空的. 这个可以用前面实现的
emptySpaceExists()
- 如果移动的方向上有相邻而且值一样的格子, 此时我们可以进行合并. 显然每个格子我们需要检查 4 个方向. 这是通过
dx
和dy
实现的, 他们表示不同方向上的增量.
/** * Returns true if there are any valid moves on the board. * There are two ways that there can be valid moves: * 1. There is at least one empty space on the board. * 2. There are two adjacent tiles with the same value. */ public static boolean atLeastOneMoveExists(Board b) { if (emptySpaceExists(b)) { return true; } // 4 directions, LEFT/UP/RIGHT/DOWN int[] dx = {0, -1, 0, 1}; int[] dy = {-1, 0, 1, 0}; int size = b.size(); for (int col = 0; col < size; col++) { for (int row = 0; row < size; row++) { // Because we have checked emptySpace, t.values() must exist int curTileValue = b.tile(col, row).value(); for (int move = 0; move < 4; move++) { int colNew = col + dx[move]; int rowNew = row + dy[move]; // make sure the tile is within the boundary if (colNew > 0 && colNew < size && rowNew > 0 && rowNew < size) { Tile newTile = b.tile(colNew, rowNew); if (newTile.value() == curTileValue) { return true; } } } } } return false; }
Task 4. Building the Game Logic
解决这个任务还是花了我不少时间的
这篇关于proj0. 2048 of CS61B of UCB的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享