【问题标题】:Point and Array game Java点和数组游戏 Java
【发布时间】:2012-01-04 01:36:48
【问题描述】:

我要在 java 中用 cmd(不是 gui)创建一个游戏,它是一个更大的项目,但现在,我很想知道如何创建一个 12x12 网格,在 0,0 处生成一个玩家(左顶角)并使用按键移动他?

我试图创建一个数组,但似乎没有让运动起作用。我是新手,欢迎提出建议。

package hunters;
import java.io.*;
import java.util.*; 
import java.awt.*;


public class Hunters {

        private static int score;
       private static String player = "P";
       private static String move;
     private static   String emptyfield = "X";
     private static   String [][]a2 = new String [12][12];
 private static int pr,cr;

 public static void paint_board(){
for (int r = 0 ; r < a2.length; r++){
    for (int c= 0; c <a2[r].length; c++){
        a2 [r][c] = emptyfield;
        a2[pr][cr] = player;
        System.out.print(" "+a2[r][c]);
    }
  System.out.println("");

}
  }
  public static void main(String[] args){

      Scanner in = new Scanner(System.in);
score = 0;

 paint_board();
 do{
System.out.println("Input your move");

move = in.nextLine();
if (move.equalsIgnoreCase("w")){
 //move up
   a2[pr-1][cr]= player;
    //repaint
   paint_board();
    //check for collision
    //check for health

}else if(move.equalsIgnoreCase("s")){
    //move down
    a2[pr+1][cr]= player;
    //repaint
    paint_board();
      //check for collision
    //check for health

}else if(move.equalsIgnoreCase("d")){
    //move right
    a2[pr][cr+1] = player;
    //repaint
    paint_board();
      //check for collision
    //check for health

}else if(move.equalsIgnoreCase("a")){
    //move left
    a2[pr][cr-1]=player;
    //repaint
    paint_board();
      //check for collision
    //check for health

}
}while(score !=5);
}   
}

这是我希望它工作的方式。我试图创建一个单独的 Position 类,但我在这个过程中失败了......`

【问题讨论】:

  • 想想你的模型。您可能有类似 new Room[12][12] 数组的东西,其中 Room 可以有一个 Player 对象。移动将需要一些简单的算术和越界检查。发布一些您拥有的代码,我们可以帮助解决您的运动问题。
  • @ChrisArom:虽然您应该发布代码,但您应该发布最简洁地传达问题意图的代码。我建议尝试减少不必要的代码,以便更好地理解您的观点并提出更好的问题。

标签: java arrays cmd point


【解决方案1】:

创建一个二维数组,有办法在二维数组中绘制一个单元格(其中可能包含由单元格的值定义的不同对象)。因此,您可以检查要绘制的正方形,如果值为 HUMAN(预定义常量),则在屏幕上的该位置绘制一个人。

void paint_cell(int x, int y) {
  if (array[x][y] == HUMAN) {
   printf("H");
  } else if (array[x][y] == ENEMY) {
    printf("E");
  } else if (array[x][y] == EMPTY) {
    printf(" ");
  }
}

void paint_maze() {
   for (int j = 0; j < 12; j++) {
       printf("|");
       for (int i = 0; i < 12; i++) {
          paint_cell(i,j);
       }
       printf("|\n");
   }
}

当您收到关键事件时,请转到包含人类的单元格并根据关键将其移动到新目的地。然后再画迷宫。

【讨论】:

  • 我想我知道如何移动玩家,但是我不知道如何在每次移动后重新绘制数组。
  • 它可能只是 H 代表人类,空间代表空,E 代表敌人。您可以使用“-”绘制水平边,使用“|”绘制垂直边。
  • 我有P代表玩家,H代表猎人,空白是X(在主帖附上代码)
  • 我已经添加了paint_maze 示例,您可能还想在每次绘制之前清除屏幕。 JCurses 可能会有所帮助。
  • 我在 main 方法中有我的数组,一个好的解决方案是为板显示创建一个单独的类,并尝试使用类似 Board.display 的东西重新绘制它?还是我必须在每个移动事件中包含我的打印数组代码?谢谢
【解决方案2】:

“一个数组”绝对是正确的想法——我可能会用一个二维数组来包含网格的空间。但是——数组中会有什么?代表用户移动的空间的对象?这很酷;您将必须弄清楚如何定义这些空间,并弄清楚如何在屏幕上显示每个空间。

您可能无法使用KeyListener 来检查用户击键,因为KeyListener 是AWT/Swing 的一部分,但您需要一种从键盘获取输入的方法。从stdin 阅读是到这里的简单方法。您将需要运行一个循环来监听用户在键盘上的输入,并根据用户按下的键将用户的“游戏部件”从一个正方形移动到另一个正方形。

【讨论】:

  • 整个项目将由一名玩家组成,该玩家试图避开在 12,12 生成并使用预定义路径向 0,0 移动的 NPC(猎人)。当与猎人等发生碰撞时,玩家会损失生命值。
  • 这听起来不错——但您需要先完成最基本的部分。在您定义迷宫之前,您不能让猎人在迷宫中移动。
  • 迷宫已经被定义为一个 12x12 的数组。它打印 24 个 X,在 0,0 处打印一个 P。现在需要运动部分。
猜你喜欢
  • 2013-09-14
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多