Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的2D游戏Sokoban正在运行,但我想知道我是否改进了设计_Java - Fatal编程技术网

Java 我的2D游戏Sokoban正在运行,但我想知道我是否改进了设计

Java 我的2D游戏Sokoban正在运行,但我想知道我是否改进了设计,java,Java,我用两个类制作了一个Sokoban,logic和SokobanGUI 基本上,logicpart从输入字符串数组构建ArrayList>,f.ex: String[] level1 = {"*###########*", "# #", "# ... ... #", "# *$$ $.$ #", "# $*+$ $*$$

我用两个类制作了一个Sokoban,logic和SokobanGUI

基本上,logicpart从输入字符串数组构建ArrayList>,f.ex:

String[] level1 = 
              {"*###########*",
               "#           #",
               "#  ... ...  #",
               "#  *$$ $.$  #",
               "# $*+$ $*$$ #",
               "#  *$$ $.$  #",
               "#  ...  .   #",
               "#           #",
               "*###########*"};
其中“+”是玩家的位置

无论如何,随着游戏的进行,ArrayList会在逻辑类中更新(玩家在移动,角色在交互等)

游戏的图形部分通过将图片分配给每个角色并在arraylist>中循环来解决。然后在无限while循环中更新,这样当逻辑部分中的arraylist>更新时,它将再次打印

如果这很难理解,我已经打印了下面的代码

问题1:我不认为这是输出游戏的最佳方式(使用一段时间的lopp),因为我一直在以图形方式输出游戏,即使没有进行任何更改。这通常是如何处理的?Swing能帮med解决这个问题吗

问题2:另外,在下面的代码中,我不使用main方法,而是使用run()。main方法不喜欢我创建非静态引用,run有效,所以我使用它。。。我应该如何使用主要方法使游戏正常运行

也许更容易看到我的代码:

逻辑类

package Sokoban2;

import java.util.ArrayList;

public class Logic {


int player_x;
int player_y;
int nextMove_x;
int nextMove_y;
ArrayList<ArrayList<Boolean>> targets;
ArrayList<ArrayList<Character>> grid;
Boolean canMove;


public Logic(){
    buildGrid();
    buildTargets();
    findPlayer();
}

    public void move(int dx, int dy){
    if(CheckCanMove(dx, dy)){
    moveBox(dx, dy);
    movePlayer(dx, dy);
    } 


}


public void movePlayer(int dx, int dy){

    boolean boxAhead = (getChar(dx,dy) == '#');

    if(!boxAhead){

    char pChar = grid.get(player_x ).get(player_y);
    char pCharNext = grid.get(player_x +dx).get(player_y +dy);

    if(pChar == '@'){
        if(pCharNext == ' ' || pCharNext == '$'){
            grid.get(player_x + dx).set(player_y + dy, '@');
            grid.get(player_x).set(player_y, ' ');
        }
        if(pCharNext == '.' || pCharNext == '*'){
            grid.get(player_x + dx).set(player_y + dy, '+');
            if(pChar == '+'){
                grid.get(player_x).set(player_y, '.');
            }
            else{
                grid.get(player_x).set(player_y, ' ');
            }
        }
    }

    else if(pChar == '+'){
        if(pCharNext == ' ' || pCharNext == '$'){
            grid.get(player_x + dx).set(player_y + dy, '@');
            grid.get(player_x).set(player_y, '.');
        }
        if(pCharNext == '.' || pCharNext == '*'){
            grid.get(player_x + dx).set(player_y + dy, '+');
            grid.get(player_x).set(player_y, '.');


        }
    }




    player_x += dx;
    player_y += dy;

    }



}


public void buildGrid(){
    char c = '"';


    grid = new ArrayList<ArrayList<Character>>();

    String[] level1 = 
              {"*###########*",
               "#           #",
               "#  ... ...  #",
               "#  *$$ $.$  #",
               "# $*+$ $*$$ #",
               "#  *$$ $.$  #",
               "#  ...  .   #",
               "#           #",
               "*###########*"};



    int length_i = level1.length;
    System.out.println(length_i);
    int length_i_j = level1[length_i-1].length();



    for(int i = 0; length_i>i; i++){
        grid.add(i, new ArrayList<Character>());
        for(int j = 0; length_i_j>j; j++){
            c = level1[i].charAt(j);                
            grid.get(i).add(c);
        }
    }


}


public void buildTargets(){


    targets = new ArrayList<ArrayList<Boolean>>();

    char c = ' ';
    int length_i = grid.size();

    for(int i = 0; length_i>i; i++){
        targets.add(i, new ArrayList<Boolean>());
        for(int j = 0; grid.get(i).size()>j; j++){
            c = grid.get(i).get(j);
            if(c == '.'){
                targets.get(i).add(false);
            }
            else{
                targets.get(i).add(true);
            }

        }
    }

}

public void findPlayer(){
    char c = ' ';
    int length_i = grid.size();

    for(int i = 0; length_i>i; i++){
        for(int j = 0; grid.get(i).size()>j; j++){
            c = grid.get(i).get(j);
            if(c == '@' || c == '+'){
                player_x = i;
                player_y = j;
            }
        }
    }


}

public Character getChar(int dx, int dy){

    char c = ' ';
    c = grid.get(player_x + dx).get(player_y + dy);
    return c;

}



public void moveBox(int dx, int dy){
    char c1 = getChar((dx),(dy));
    char c2 = getChar((2*dx),(2*dy));


    if(c1 == '*' || c1 == '$'){
        if(c2 == '.'){
            grid.get(player_x +2*dx).set(player_y +2*dy, '*');
        }
        if(c2 == ' '){
            grid.get(player_x +2*dx).set(player_y +2*dy, '$');
        }
    }




}

public boolean CheckCanMove(int dx, int dy){
    canMove = true;

    boolean boxAhead = (getChar(dx,dy) == '#');
    boolean boxAhead2 = (getChar(2*dx,2*dy) == '#');
    boolean movableAhead = (getChar(dx,dy) == '$');
    boolean movableAhead2 = (getChar(2*dx,2*dy) == '$');
    boolean movableAheadS = (getChar(dx,dy) == '*');
    boolean movableAheadS2 = (getChar(2*dx,2*dy) == '*');


    if(boxAhead || (movableAhead && boxAhead2) || (movableAhead &&     
               movableAhead2) || (movableAheadS && movableAheadS2) || (movableAheadS &&  
               boxAhead2)){
        canMove = false;
    }

    return canMove;
}





void setPlayerX(int player_x){
    this.player_x = player_x;
}

void setPlayerY(int player_y){
    this.player_y = player_y;
}

}

问题1:为了避免在没有输入的情况下继续绘制,只需检查是否有任何变化(怪物移动、玩家移动等)。我假设这是一个类似流氓的游戏,所以你可能只需要检查一下玩家是否移动了

if( playerMoved() ) {
    paint();
}
问题2:我不知道
GraphicsProgram
包含什么内容,但我假设正在使用其中的
main()
。使用
run()
方法运行游戏循环本身并没有什么问题,事实上,大多数游戏都是这样运行的。最多,您的
main()
只会像现在一样启动
run()
方法。所以你很好


HTH

非常感谢!这是有道理的!:)
if( playerMoved() ) {
    paint();
}