题目:
三消除宝石游戏匹配 算法,
算法题, 不要图形界面, 用print打印在命令行,编程语言不限,包括伪代码
请回想常见三消除宝石游戏规则
| |||
三消除游戏举例 |
地图大小n x m , 地图数据是一个二位数组 如map[m][n]
请编程实现
1. 随机填入1到4的数字到map, 表示4种不同的宝石,格式化打印出地图内容, 让地图内容肉眼可读。
2. 计算出符合条件的格子(横着或者竖着连续三个或三个以上相同)消除掉后的地图变化 ,消除掉宝石的空格子设置成0, 格式化打印地图。
3. 计算宝石下落,填满空格子后的地图变化(最上方一排格子可以随机生成宝石), 格式化打印地图。
其核心实现逻辑代码如下:
import java.util.ArrayList;import java.util.List;/** * @author WangWeiwei * @version 1.0 * @sine 17-2-26 * 游戏逻辑控制类 */public class JewelGame { /**m*n大小的地图*/ Jewel[][] map; MapController mapController = new MapController(); JewelController jewelController = new JewelController(); public JewelGame(int m,int n){ map = new Jewel[m][n]; } /**地图 坐标 类*/ static class Coordinate{ int x; int y; public Coordinate(int x, int y){ this.x = x; this.y = y; } } /** * 宝石类 * */ static class Jewel{ //宝石的值 int value; //宝石横向是否已经被消除 boolean xHaveEliminate; //宝石纵向是否已经被删除 boolean yHaveEliminate; //宝石已被添加到待删除 boolean haveEliminate; public Jewel(int value){ this.value = value; this.xHaveEliminate = false; this.yHaveEliminate = false; this.haveEliminate = false; } } public static void main(String[] args){ JewelGame jewelGame = new JewelGame(10,5); jewelGame.startGame(); } /**开始游戏方法 * 持续进行消除游戏,直到地图上没有再可消除的资源为止 * */ public void startGame() { System.out.println("游戏开始"); mapController.init(map); /**查找地图上 可消除 的宝石个数*/ int i = 1; while (jewelController.canEliminateList(map)){ System.out.println("第" + i + "次消除"); mapController.eliminate(map); System.out.println("第" + i++ + "次消除后的地图"); mapController.newMap(map); } System.out.println("游戏结束"); }}/**宝石操作类*/class JewelController{ /**生成一个新的宝石 * @return 新宝石的编号 1-4之间的整数 * */ public static int newJewel() { return (int) (1 + Math.random()*4); } /** * 检测地图上是否有可以消除的宝石 * @param map * */ public boolean canEliminateList(JewelGame.Jewel[][] map) { return eliminateX(map) | eliminatey(map); } /**消除从当点位置开始算起纵向上可以消除的点 * @param map 当前的地图 * @return true 地图上有可消除的点 */ private boolean eliminateX(JewelGame.Jewel[][] map) { boolean have = false; for (int j = 0; j < map[0].length; j++){ //横坐标上可消除的宝石坐标集合 ListxEliminate = new ArrayList (); for(int x = 0; x < map.length - 1; x++){ /**如果地图上当前点纵向没有被访问计算过*/ if (!map[x][j].xHaveEliminate){ if (map[x][j].value == map[x+1][j].value){ xEliminate.add(new JewelGame.Coordinate(x,j)); xEliminate.add(new JewelGame.Coordinate(x+1,j)); }else { if (xEliminate.size() > 2){ for (JewelGame.Coordinate coord: xEliminate) { /**将宝石标记为纵向已被访问*/ if(!map[coord.x][coord.y].xHaveEliminate){ map[coord.x][coord.y].xHaveEliminate = true; } /**将坐标添加到总体待删除列表*/ if (!map[coord.x][coord.y].haveEliminate){ map[coord.x][coord.y].haveEliminate = true; } } have = true; }else { xEliminate = new ArrayList (); } } } } } return have; } /**消除从当点位置开始算横向上可以消除的点 * @param map 当前的地图 * @return true 地图上有可消除的点 * */ private boolean eliminatey(JewelGame.Jewel[][] map) { boolean have = false; for (int x = 0; x < map.length; x++) { //纵向上可消除的宝石坐标集合 List xEliminate = new ArrayList (); for (int j = 0; j < map[0].length - 1; j++) { /**如果地图上当前点横向没有被访问计算过*/ if (!map[x][j].yHaveEliminate) { if (map[x][j].value == map[x][j + 1].value) { xEliminate.add(new JewelGame.Coordinate(x, j)); xEliminate.add(new JewelGame.Coordinate(x, j + 1)); } else { if (xEliminate.size() > 2) { for (JewelGame.Coordinate coord : xEliminate) { /**将宝石标记为横向已被访问*/ if (!map[coord.x][coord.y].yHaveEliminate) { map[coord.x][coord.y].yHaveEliminate = true; } /**将坐标添加到总体待删除列表*/ if (!map[coord.x][coord.y].haveEliminate) { map[coord.x][coord.y].haveEliminate = true; } } have = true; } else { xEliminate = new ArrayList (); } } } } } return have; }}/**地图控制器类*/class MapController{ /**初始化一个地图 * @param map 要进行初始化的地图*/ public void init(JewelGame.Jewel[][] map) { for (int i = 0; i < map.length; i++){ for (int j = 0; j < map[0].length; j++){ map[i][j] = new JewelGame.Jewel(JewelController.newJewel()); } } printMap(map); } /**打印当前地图信息 * @param map*/ private void printMap(JewelGame.Jewel[][] map) { System.out.println("****************************************"); for (int i = 0; i < map.length; i++){ for (int j=0; j < map[i].length; j++){ System.out.print(" " + map[i][j].value + " "); } System.out.println(); } System.out.println("****************************************"); } /** * 消除指定地图上可消除的点 * */ public void eliminate(JewelGame.Jewel[][] map) { for (int i = 0; i < map.length; i++){ for (int j = 0; j < map[i].length; j++){ if (map[i][j].haveEliminate){ map[i][j].value = 0; } } } printMap(map); } /**将已消除的元素移除,并生成新的地图*/ public void newMap(JewelGame.Jewel[][] map) { for (int i = 0; i < map[0].length; i++){ for (int j = 0; j < map.length; j++){ if (map[j][i].haveEliminate){ //将当前列之上的所有元素下移 for (int x = j; x > 0; x--){ map[x][i] = map[x - 1][i]; } //当前列第0行则直接生成一个新元素 map[0][i] = new JewelGame.Jewel(JewelController.newJewel()); } } } printMap(map); }}