我正在开发一个java中的蛇和梯子游戏,这是可配置的 - 也就是说,你可以为其中的蛇和梯子设置'头部'和'尾部'位置。我已经尝试加载蛇形图像并重新调整尺寸它们适合于适应头部和尾部位置的边界,但这似乎会影响图像的质量。 有谁能建议更好的方法/算法? 非常感谢。
答案 0 :(得分:4)
我建议将蛇图形分成几个部分 - 头部,尾部和一个或多个中间部分。然后,根据所需的蛇的长度,您可以根据需要绘制中间部分来构建它。
答案 1 :(得分:1)
您使用的方法有两个“问题”,可能会导致质量不佳:
你是(我假设)升级图形图像,这将导致阻塞。
如果改变x轴和y轴的比例(例如放大),长蛇将比短蛇更胖更宽,这不是人们期望看到的。
我会稍微修改fd的解决方案。请按以下步骤操作:
准备头部,尾部和中间单部分的图形,以便将任意数量的中间部分链接在一起。
当您需要画蛇时,计算它的长度。然后看看整条蛇需要多少个中间部分等于或大于这个计算的长度。
创建一个正确大小的位图缓冲区,以保存具有正确数量的中间部分的水平(或垂直!)蛇。将背景绘制为透明,然后将蛇绘制到此位图中。它通常会比您需要的时间略长。
缩放并旋转位图并将其放置在电路板上的正确位置。
你仍然会在某种程度上缩放,但比例因子应该小到不显而易见。例如,如果您需要5.5个中间部分来进行精确拟合,那么您将绘制6个中间部分,然后将整条蛇缩放约5.5 / 6以使其完全合适。这个变化不到10%,所以不应该是显而易见的。
这解决了上述问题:
它具有以下实际好处:
请注意,蛇中的“摆动”越多,缩放因子与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!!!!");
}
}
}