我正在用java开发一个蛇和梯子游戏,它是可配置的 - 也就是说,你可以在其中设置蛇和梯子的“头”和“尾”位置。我尝试加载蛇图像并适当地重新调整它们的大小用于拟合头部和尾部位置的边界,但这似乎会影响图像的质量。 谁能建议更好的方法/算法? 非常感谢帮助。
我建议将蛇图形分成几个部分 - 头部、尾巴和一个或多个中间身体部分。然后,根据所需蛇的长度,您可以根据需要绘制中间部分来构造它。
您使用的方法有两个“问题”,可能会导致质量差:
您(我认为)放大了图形图像,这会导致块状现象。
如果你同时改变x轴和y轴的比例(例如放大),长蛇会比短蛇更粗更宽,这不是人们期望看到的。
我会稍微修改fd的解决方案。进行如下操作:
为头部、尾部和中间的单个部分准备一个图形,以便您可以将任意数量的中间部分链接在一起。
当你需要画一条蛇时,计算它的长度。然后看看需要多少个中间部分才能使整条蛇等于或大于这个计算出的长度。
创建正确大小的位图缓冲区,以容纳具有正确数量的中间部分的水平(或垂直!)蛇。将背景绘制为透明,然后将蛇绘制到该位图中。它通常会比您需要的稍长。
缩放并旋转位图并将其放置在板上的正确位置。
您仍会进行一定程度的缩放,但比例因子应该足够小,以免不明显。例如,如果您需要 5.5 个中间部分才能精确配合,那么您将绘制 6 个中间部分,然后将整条蛇缩放约 5.5/6,使其长度恰好合适。这个变化不到 10%,所以应该不明显。
这解决了上述问题:
它具有以下实际好处:
请注意,蛇的“摆动”越多,缩放因子与 1.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!!!!");
}
}
}
我这周有同样的问题解决方案,并将尝试在您的代码下发布我的答案,很高兴有机会看到您的解决方案!!!