如何在java Snake and Ladder游戏中设置蛇和梯子的位置?

时间:2013-02-08 20:18:29

标签: java algorithm swing user-interface

我正在开发一个java中的蛇和梯子游戏,这是可配置的 - 也就是说,你可以为其中的蛇和梯子设置'头部'和'尾部'位置。我已经尝试加载蛇形图像并重新调整尺寸它们适合于适应头部和尾部位置的边界,但这似乎会影响图像的质量。 有谁能建议更好的方法/算法? 非常感谢。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

  1. 你是(我假设)升级图形图像,这将导致阻塞。

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

  3. 我会稍微修改fd的解决方案。请按以下步骤操作:

    准备头部,尾部和中间部分的图形,以便将任意数量的中间部分链接在一起。

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

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

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

    你仍然会在某种程度上缩放,但比例因子应该小到不显而易见。例如,如果您需要5.5个中间部分来进行精确拟合,那么您将绘制6个中间部分,然后将整条蛇缩放约5.5 / 6以使其完全合适。这个变化不到10%,所以不应该是显而易见的。

    这解决了上述问题:

    1. 蛇的宽度只会略有不同
    2. 你只会缩小规模,永远不会升级。
    3. 它具有以下实际好处:

      1. 你只需要水平(或垂直)布置蛇,这很容易做到
      2. 应该非常有效率。所有实际工作都由图形库完成,图形库必须旋转,缩放和放置构造的蛇。在大多数平台上,这些操作被实现为变换矩阵,其在硬件中计算并因此非常快。我在我编写的Android应用程序中广泛使用这种方法,而且速度非常快。
      3. 请注意,蛇中的“摆动”越多,缩放因子与1.0的差异越小,因此宽度变化越小。

答案 2 :(得分: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!!!!");
    }
}

}