2016-08-15 6 views
0

私はTronの簡単なゲームを改善するために助けが必要です。私は最初にプロジェクトのためにSnakeを作って、やや似ていると思ったのでこれを作ることにしました。しかし、両方のキーアダプタで同じコードを使用していましたが、Snakeの作品はTronの作品ではありません。何か違いがあるなら、SnakeはEclipseのJGraspとTronでコード化されています。私がデバッグから知ることができることに基づいて、キーアダプターは全く応答していないため、フォーカスの問題だと思っていましたが、Tronのコード要求はSnakeと同じ時間に集中し、Snakeはうまく動作すると言いました。もし誰かが私を助けてくれたら、それはすばらしいことになるでしょう。キーアダプタが動作していませんが、焦点が合っています

また、私は比較的新しいコーディングをしているので、後でスピードの向上やメモリの削減方法についての提案が大好きです。また、私がゲームに追加すべき機能やゲームの見栄えを向上させる方法についての提案は、私はそれらを聞いて非常に感謝しています。私は、特に新しい概念を導入する場合、これらの機能を作成するのに役立つ必要があるかもしれませんので、後であなたに連絡して、何かをする方法についてのヘルプを探します。とにかくここ

コードです:

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
public class Tron_Board extends JPanel{ 
    public int directionleft = 4; 
    public int directionright = 3; 
    static JLabel instr, Lwins, Rwins; 
    public int numL, numR = 0; 
    static int[][] array; 
    static JLabel[][] board; 
    Timer timer; 
    public final int rows = 100; 
    public final int columns = 200; 
    JButton resetButton, quitButton, startButton; 
    public Tron_Board() 
    { 
     setLayout(new BorderLayout()); 
     array = new int[rows][columns]; 
     board = new JLabel[rows][columns]; 

     JPanel north = new JPanel(); 
     north.setLayout(new BorderLayout()); 
     Lwins = new JLabel("" + numL); 
     north.add(Lwins, BorderLayout.WEST); 
     Rwins = new JLabel("" + numR); 
     north.add(Rwins, BorderLayout.EAST); 
     instr = new JLabel("Best of 5! Good Luck!"); 
     instr.setHorizontalAlignment(SwingConstants.CENTER); 
     north.add(instr, BorderLayout.CENTER); 
     Lwins.setFont(new Font("Serif", Font.BOLD, 30)); 
     Rwins.setFont(new Font("Serif", Font.BOLD, 30)); 
     instr.setFont(new Font("Serif", Font.BOLD, 25)); 
     add(north, BorderLayout.NORTH); 

     JPanel center = new JPanel(); 
     center.setLayout(new GridLayout(rows, columns)); 
     for(int r = 0; r < array.length; r++) 
     for(int c = 0; c < array[0].length; c++) 
     { 
      array[r][c] = 0; 
      board[r][c] = new JLabel(); 
      board[r][c].setOpaque(true); 
      center.add(board[r][c]); 
     } 
     add(center, BorderLayout.CENTER); 

     JPanel south = new JPanel(); 
     south.setLayout(new FlowLayout()); 
     add(south, BorderLayout.SOUTH); 
     resetButton = new JButton("Reset"); 
     resetButton.addActionListener(new ResetListener()); 
     resetButton.setEnabled(false); 
     startButton = new JButton("Start Round"); 
     startButton.addActionListener(new StartListener()); 
     startButton.setEnabled(false); 
     south.add(resetButton); 
     south.add(startButton); 
     quitButton = new JButton("Quit"); 
     quitButton.addActionListener(new QuitListener()); 
     south.add(quitButton); 

     addKeyListener(new Key()); 
     setFocusable(true); 
     requestFocus(); 
     timer = new Timer(75, new Listener()); 
     reset(); 
    } 
    private void start() 
    { 
     timer.start(); 
     startButton.setEnabled(false); 
    } 
    private static void update() 
    { 
     for(int r = 0; r < array.length; r++) 
     for(int c = 0; c < array[r].length; c++) 
     { 
      switch(array[r][c]){ 
      case 0: board[r][c].setBackground(Color.BLACK); 
      break; 
      case 1: board[r][c].setBackground(Color.RED); 
      break; 
      case 2: board[r][c].setBackground(Color.ORANGE); 
      break; 
      case 3: board[r][c].setBackground(new Color(13, 182, 233)); 
      break; 
      case 4: board[r][c].setBackground(Color.YELLOW); 
      break; 
      case 5: board[r][c].setBackground(new Color(169, 212, 144)); 
      break; 
      } 
     } 
    } 
    private void move() 
    { 
     int oldR = 0; 
     int oldC = 0; 
     int newR = 0; 
     int newC = 0; 
     int oldR2 = 0; 
     int oldC2 = 0; 
     int newR2 = 0; 
     int newC2 = 0; 
     for(int r = 0; r < array.length; r++) 
     { 
     for(int c = 0; c < array[r].length; c++) 
     { 
      if(array[r][c] == 1) 
      { 
       oldR = r; 
       oldC = c; 
       switch(directionleft){ 
        case 1: newR = oldR - 1; //up 
        newC = oldC; 
        break; 
        case 2: newR = oldR + 1; //down 
        newC = oldC; 
        break; 
        case 3: newR = oldR; //left 
        newC = oldC - 1; 
        break; 
        case 4: newR = oldR; //right 
        newC = oldC + 1; 
        break; 
       } 
      } 
     } 
     } 
     for(int r = 0; r < array.length; r++) 
     { 
     for(int c = 0; c < array[r].length; c++) 
     { 
      if(array[r][c] == 3) 
      { 
       oldR2 = r; 
       oldC2 = c; 
       switch(directionright) 
       { 
        case 1: newR2 = oldR2 - 1; //up 
        newC2 = oldC2; 
        break; 
        case 2: newR2 = oldR2 + 1; //down 
        newC2 = oldC2; 
        break; 
        case 3: newR2 = oldR2; //left 
        newC2 = oldC2 - 1; 
        break; 
        case 4: newR2 = oldR2; //right 
        newC2 = oldC2 + 1; 
        break; 
       } 
      } 
     } 
     } 
       if((array[newR2][newC2] == 0) && (array[newR][newC] == 0)){ 
        array[oldR][oldC] = 2; 
        array[newR][newC] = 1; 
        array[oldR2][oldC2] = 4; 
        array[newR2][newC2] = 3; 
       } 
       else if((array[newR2][newC2] > 0) && (array[newR][newC] > 0)){ 
        roundLose("draw"); 
       } 
       else if(array[newR2][newC2] > 0){ 
        roundLose("right"); 
       } 
       else if(array[newR][newC] > 0){ 
        roundLose("left"); 
       } 

    } 
    private void gameWin(String player) 
    { 
     timer.stop(); 
     instr.setText("Congratulations, " + player + " player won!"); 
     resetButton.setEnabled(true); 
    } 
    public void roundLose(String player){ 
     timer.stop(); 
     if(player.equals("left")) 
     { 
      if(numR + 1 == 3) 
      { 
       gameWin("right"); 
      } 
      else 
      { 
      numR += 1; 
      } 
     } 
     if(player.equals("right")) 
     { 
      if(numL + 1 == 3) 
      { 
       gameWin("left"); 
      } 
      else 
      { 
      numL += 1; 
      } 
     } 
     if(player.equals("draw")) 
     { 
      instr.setText("DRAW!!!"); 
     } 
     reset(); 
    } 
    private void reset() 
    { 
     timer.stop(); 
     directionleft = 4; 
     directionright = 3; 
     Lwins.setText("" + numL); 
     Rwins.setText("" + numR); 
     instr.setText("Best of 5! Good Luck!"); 
     for(int r = 0; r < array.length; r++) 
     for(int c = 0; c < array[0].length; c++) 
     { 
      if(r == 0 || r == (array.length - 1) || c == 0 || c == (array[0].length - 1)) 
       array[r][c] = 5; //wall 
      else 
       array[r][c] = 0; //background 
     } 
     array[rows/2][7] = 1; 
     array[rows/2][columns - 8] = 3; 
     update(); 
     startButton.setEnabled(true); 
     resetButton.setEnabled(false); 
     requestFocus(); 
    } 
    private class Listener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     move(); 
     update(); 
     } 
    } 
    private class ResetListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     reset(); 
     numL = 0; 
     numR = 0; 
     } 
    } 
    private class QuitListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     System.exit(0); 
     } 
    } 
    private class StartListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
     start(); 
     } 
    } 
    private class Key extends KeyAdapter 
    { 
     public void keyPressed(KeyEvent e) 
     { 
     if(e.getKeyCode() == KeyEvent.VK_W){ 
       directionleft = 1; 
       System.out.println("I'm here");//up 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S) //down 
      directionleft = 2; 
     if(e.getKeyCode() == KeyEvent.VK_A) //left 
      directionleft = 3; 
     if(e.getKeyCode() == KeyEvent.VK_D) //right 
      directionleft = 4; 
     if(e.getKeyCode() == KeyEvent.VK_UP) 
      directionright = 1; 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) 
      directionright = 2; 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) 
      directionright = 3; 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) 
      directionright = 4; 
     } 
    } 
} 
+0

あなたの質問はあまりにも話題ではありません。 [CodeReview.SE](http://codereview.stackexchange.com/)をお勧めしますか?あなたの質問の最初の部分(特定のコーディングの問題)だけがトピックに載っています。一般的なコードレビューの質問/改善提案のリクエストはCodeReviewに送られます。 –

+0

@SebastianLenartowiczお薦めいただきありがとうございます!それはあなたが質問の最初の部分に答えることができると言われている?私はたくさんのことを試してきましたが、依然としてキーリスナーに対応することはできません。何か案は? –

答えて

0

私は、Windows 7上でのJava 8u91の下JFrameの中にそれを入れて、キーリスナーは私のために動作します。

どのようにパネルを使用していて、Eclipse外から実行しようとしましたか?

+0

私はそれを今修正しました。明らかに、開始ボタンは、押されたときにキーリスナーからフォーカスを離していたようです。私は設定したドライバで実行していましたが、JGraspやEclipseのようなものの外でこれらのJavaプログラムを実行する方法がないことは気付きませんでした。 –

+0

メイン・メソッドを持つドライバ・プログラムがあると仮定します。コマンドラインからjava MainClassName がありますが、親ディレクトリがシステムPATHにない場合は、 "java"へのフルパスが必要な場合があります。 jGRASPで "設定"> "詳細メッセージ"を有効にすると、出力に実際に送信されたコマンドでは、実行に使用しているコマンドが正確に表示されます。 –

関連する問題