1

我正在用java开发一个蛇和梯子游戏,它是可配置的——也就是说,你可以在其中设置蛇和梯子的“头”和“尾”位置。我已经尝试加载蛇图像并适当地调整它们的大小适合头部和尾部位置的范围,但这似乎会影响图像的质量。任何人都可以提出更好的方法/算法吗?非常感谢帮助。

4

3 回答 3

4

我建议将蛇形图形分成几个部分——一个头部、一个尾巴和一个或多个中间身体部分。然后,根据所需的蛇长度,您可以根据需要从中间部分绘制它。

于 2013-02-08T20:22:00.077 回答
1

您使用的方法有两个“问题”,可能会导致质量不佳:

  1. 您正在(我假设)升级图形图像,这将导致块状。

  2. 如果你改变 x 和 y 轴的比例(例如放大),长蛇会比短蛇更胖更宽,这不是人们期望看到的。

我会稍微修改 fd 的解决方案。进行如下操作:

为头部、尾部和中间的单个部分准备一个图形,这样您就可以将任意数量的中间部分链接在一起。

当你需要画一条蛇时,计算它的长度。然后看看整条蛇需要多少个中间部分才能等于或大于这个计算的长度。

创建一个正确大小的位图缓冲区,以容纳具有正确数量的中间部分的水平(或垂直!)蛇。将背景绘制为透明,然后将蛇绘制到此位图中。它通常会比您需要的时间稍长一些。

缩放和旋转位图并将其放置在板上的正确位置。

您仍会在一定程度上进行缩放,但比例因子应该足够小以至于不明显。例如,如果您需要 5.5 个中间部分来精确匹配,那么您将绘制 6 个中间部分,然后将整条蛇缩放大约 5.5/6 以使其长度完全正确。这不到 10% 的变化,所以应该不明显。

这样就解决了上面的问题:

  1. 蛇的宽度只会略有不同
  2. 你只低档,从不高档。

它具有以下实际好处:

  1. 您只需要水平(或垂直)布置蛇,这很容易做到
  2. 它应该非常有效。所有真正的工作都是由图形库完成的,它必须旋转、缩放和放置构建的蛇。在大多数平台上,这些操作被实现为在硬件中计算的转换矩阵,因此速度非常快。我在自己编写的 Android 应用程序中广泛使用了这种方法,而且速度非常快。

请注意,蛇中的“摆动”越多,您的比例因子与 1.0 的差异就越小,因此宽度的变化就越小。

于 2013-02-11T06:44:46.880 回答
0

公共类 SankesAndLadder {

static int turn = 0;
static int[] gameBoard = new int[100];
static Map<Integer, Integer> ladderPositionValue;
static Map<Integer, Integer> snakePositionValue;
static int userPosition = 0;
static int computerPosition = 0;


public static void populateBoard() {
    ladderPositionValue = new HashMap<>();
    snakePositionValue = new HashMap<>();
    // SUPPOSE WE HAVE 10 LADDERS AND 10 SNAKES
    for (int i = 0; i < 10; i++) {
        int ladderPositionKey = (int) (Math.random() * 85) + 10;
        if (!ladderPositionValue.keySet().contains(ladderPositionKey)) {
            ladderPositionValue.put((int) (Math.random() * 100) + 1, (int) (Math.random() * 10) + 5);
        } else {
            i--;
        }
        int snakePositionKey = (int) (Math.random() * 95) + 15;
        if (!ladderPositionValue.keySet().contains(ladderPositionKey) &&
                !snakePositionValue.keySet().contains(ladderPositionKey)) {
            snakePositionValue.put((int) (Math.random() * 100) + 1, (int) (Math.random() * 10) + 5);
        } else {
            i--;
        }
    }
}

public static int rollDice(int repeat) {
    System.out.println("ROLLING DICE...PRESS ANY KEY TO CONTINUE:");
    Scanner in = new Scanner(System.in);
    String cont = in.nextLine();
    int rolledNo = (int) (Math.random() * 6) + 1;
    if (rolledNo == 6) {
        System.out.println("NUMBER IS:" + rolledNo + ". ANOTHER CHANCE.");
        rollDice(repeat++);
    } else {
        System.out.println("NUMBER IS:" + rolledNo);
    }
    int finalCount = rolledNo + (repeat * 6);
    return finalCount;
}

public static boolean userTurn() {
    if (turn % 2 == 0) {
        turn++;
        return true;
    }
    turn++;
    return false;
}


public static void newUserPosition(int rolledNo) {
    userPosition = userPosition + rolledNo;
    System.out.println("YOUR NEW POSITION IS:" + userPosition);
    userPosition = checkSnakeOrLadder(userPosition);
}

public static void newComputerPosition(int rolledNo) {
    computerPosition = computerPosition + rolledNo;
    computerPosition = checkSnakeOrLadder(userPosition);
}

private static int checkSnakeOrLadder(int position) {
    if (snakePositionValue.keySet().contains(position)) {
        System.out.println("AAAAAAAAAAAHHHH ... BITTEN BY SNAKE");
        position = position - snakePositionValue.get(position);
    } else if (ladderPositionValue.keySet().contains(position)) {
        System.out.println("YAAAAAAAY.. GOT A LADDER");
        position = position + ladderPositionValue.get(position);
    }
    return position;
}

public static void main(String args[]) {
    System.out.println("WELCOME TO SNAKES & LADDER");
    System.out.println("***************************");
    populateBoard();
    while (userPosition != 100 && computerPosition != 100) {
        if (userTurn()) {
            System.out.println("YOUR TURN:");
            int rolledNo = rollDice(0);
            System.out.println("MOVING YOUR POSITION:");
            newUserPosition(rolledNo);
        } else {
            System.out.println("COMPUTER TURN:");
            int rolledNo = rollDice(0);
            System.out.println("MOVING COMPUTER POSITION:");
            newComputerPosition(rolledNo);
        }
    }
    if (userPosition == 100) {
        System.out.println("YOUR ARE THE WINNER!!!!");
    } else if (computerPosition == 100) {
        System.out.println("COMPUTER WON!!!!");
    }
}

}

于 2015-04-07T19:36:44.807 回答