2012-05-24 58 views
2

我正在爲我的計算機課程製作一個類似於程序的pac人,這是迄今爲止我所擁有的...我將wana添加到程序中。但我不知道如何製作,以便程序不會停止一切,並等待用戶輸入。就像我使用c.getchar()時,它會停止程序並等待用戶輸入。還有什麼我可以使用,不會停止該程序,因此它可能爲一個鬼追逐派克人...請幫助!如何在不暫停程序的情況下獲得角色

// The "Pac_man" class. 
import java.awt.*; 
import hsa.Console; 


public class Pac_man 
{ 
    static Console c;   // The output console 

    public static void main (String[] args) 
    { 
     c = new Console(); 

     int outline_x = 189, outline_y = 99, body_x = 190, body_y = 100, eye_x = 208, eye_y = 106, outline_position_x = 26; 
     int body_position_x = 30, p = 1, point_x = 0, point_y = 0, run_time = 0, score = 0, random_number, life = 3; 
     char key_entered; 

     background(); 
     redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
     c.fillOval (eye_x, eye_y, 4, 4); // eye 

     do 
     { 
      key_entered = c.getChar(); 

      if (key_entered == 'd' || key_entered == 'D') 
      { 
       outline_x = outline_x + 10; 
       body_x = body_x + 10; 
       eye_x = eye_x + 10; 
       outline_position_x = 26; 
       body_position_x = 30; 

       redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
       c.fillOval (eye_x, eye_y-1, 4, 4); // eye 
      } 

      if (key_entered == 'a' || key_entered == 'A') 
      { 
       outline_x = outline_x - 10; 
       body_x = body_x - 10; 
       eye_x = eye_x - 10; 
       outline_position_x = 206; 
       body_position_x = 210; 

       redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
       c.fillOval (eye_x-6, eye_y, 4, 4); // eye 

      } 

      if (key_entered == 'w' || key_entered == 'W') 
      { 
       outline_y = outline_y - 10; 
       body_y = body_y - 10; 
       eye_y = eye_y - 10; 
       outline_position_x = 116; 
       body_position_x = 120; 

       redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
       c.fillOval (eye_x+2, eye_y+2, 4, 4); // eye 
      } 

      if (key_entered == 's' || key_entered == 'S') 
      { 
       outline_y = outline_y + 10; 
       body_y = body_y + 10; 
       eye_y = eye_y + 10; 
       outline_position_x = 296; 
       body_position_x = 300; 

       redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
       c.fillOval (eye_x+3, eye_y+8, 4, 4); // eye 
      } 

      if (key_entered == 'p' || key_entered == 'P') 
      { 
       c.setColor (Color.blue); 
       Font f2 = new Font ("Freestyle Script", Font.BOLD, 56); 
       c.setFont (f2); 
       c.drawString ("GAME PAUSED", 173, 250); 

       for (int i = 1; p == i ; i++) 
       { 
        key_entered = c.getChar(); 
        p++; 

        if (key_entered == 'p' || key_entered == 'P') 
        { 
         p = 0; 
         background(); 
         redraw (score, outline_x, outline_y, outline_position_x, body_x, body_y, body_position_x, life); 
         c.fillOval (eye_x, eye_y, 4, 4); // eye 
        } 
        c.setColor (Color.black); 
       } 
       p = 1; 
      } 
      random_number = (int) (Math.random()* 100)+1; 

      //point start 
      if (run_time == score) 
      { 
      do 
      { 
       point_x = (int)(Math.random() * 1000) + 1; 
      } 

      while (point_x < 65 || point_x > 546); 

      do 
      { 
       point_y = (int)(Math.random() * 1000) + 1; 
      } 

      while (point_y < 90 || point_y > 430); 

      run_time ++; 

      } 
      c.setColor (Color.green); 
      c.fillOval (point_x, point_y, 8, 8); 
      // point end 

      if (outline_x > (point_x-32) && outline_x < (point_x+4) && outline_y > (point_y-29) && outline_y < (point_y+7)) 
      { 
       score = score + 1; 
      } 


      if (outline_x < 59) 
      { 
       outline_x = 548; 
       body_x = 548; 
       eye_x = 569; 
      } 

      if (outline_x > 549) 
      { 
       outline_x = 60; 
       body_x = 60; 
       eye_x = 78; 
      } 

      if (outline_y < 89) 
      { 
       outline_y = 419; 
       body_y = 419; 
       eye_y = 425; 
      } 

      if (outline_y > 420) 
      { 
       outline_y = 90; 
       body_y = 90; 
       eye_y = 98; 
      } 

     } 

     while (1 == 1); 

    } // main method 

    public static void background() 
    { 
     c.setColor (new Color (0, 0, 0)); 
     c.fillRect (0, 0, 640, 500); 
     c.setColor (new Color (35, 47, 210)); 
     Font f3 = new Font ("Footlight MT Light", Font.BOLD, 16); 
     c.setFont (f3); 
     c.drawString ("a = move left", 10, 485); 
     c.drawString ("d = move right", 125, 485); 
     c.drawString ("s = move down", 255, 485); 
     c.drawString ("w = move up", 385, 485); 
     c.drawString ("p = pause game", 500, 485); 

    } 

    public static void redraw (int score, int outline_x, int outline_y, int outline_position_x, int body_x, int body_y, int body_position_x, int life) 
    { 
     c.setColor (new Color (0, 0, 0)); 
     c.fillRect (50, 50, 10, 400); // left border 
     c.fillRect (580, 50, 12, 400); // right border 
     c.fillRect (50, 450, 540, 15); // bottom border 
     c.fillRect (50, 40, 540, 10); // top border 
     c.setColor (new Color (35, 47, 210)); 
     Font f2 = new Font ("Footlight MT Light", Font.BOLD, 45); 
     c.setFont (f2); 
     c.drawString ("Welcome to Pac-Man", 100, 37); 
     c.setColor (new Color (125, 23, 137)); 
     c.fillRect (60, 50, 520, 400); 
     Font f3 = new Font ("Footlight MT Light", Font.BOLD, 24); 
     c.setFont (f3); 
     c.setColor (new Color (0, 0, 0)); 
     c.drawString("SCORE : " + score, 61, 75); 
     c.drawString ("Lives :", 380, 75); 
     lives (life); 
     c.fillRect (50, 85, 550, 5);// line 
     c.setColor (Color.black);// pac man drawing begins 
     c.fillArc (outline_x, outline_y, 35, 35, outline_position_x, 320); // outline 
     c.setColor (Color.yellow); 
     c.fillArc (body_x, body_y, 32, 32, body_position_x, 310); // body 
     c.setColor (Color.black);// pac man drawing ends 
    } 

    public static int lives (int life) 
    { 
     int x1 = 470; 

     for (int i = 1; i <= life; i++) 
     { 
      c.setColor (Color.black);// pac man drawing begins 
      c.fillArc (x1, 55, 30, 30, 26, 320); // outline 
      c.setColor (Color.yellow); 
      c.fillArc (x1, 55, 28, 28, 30, 310); // body 
      c.setColor (Color.black);// pac man drawing begins 
      c.fillOval (x1+15, 59, 4, 4); // eye 

      x1+=35; 
     } 
     return life; 
    } 

} // Pac_man class 

回答

1

我沒看過你的代碼(縮短到相關的部分,以使其更具可讀性),但我覺得你接近這個錯誤的方式。您可能需要使用KeyListener。這將允許您在程序運行時「聆聽」同時按下的鍵。

public class KeyEventDemo implements KeyListener { 
     typingArea = new JTextField(20); 
     typingArea.addKeyListener(this); 

    /** Handle the key typed event from the text field. */ 
    public void keyTyped(KeyEvent e) { 
     // snip 
    } 

    /** Handle the key-pressed event from the text field. */ 
    public void keyPressed(KeyEvent e) { 
     // snip 
    } 

    /** Handle the key-released event from the text field. */ 
    public void keyReleased(KeyEvent e) { 
     // snip 
    } 

如果你有問題的重點,我建議也閱讀How to Use Key Bindings一個替代KeyListeners。

0

它看起來像你的老師做了一個自定義控制檯類,你用它來繪製你的pacman遊戲?

我用Google搜索「hsa.Console」,並發現了一些Javadoc文檔它..所以假設我這是你正在使用的控制檯類:http://www.brentwoodhigh.com/apcs/holt/hsa-javadoc/Console.html

根據老師的Javadoc Console工具KeyListener這樣你就可以繼承他的自己的控制檯,並聽取那裏的重要事件。舉例

:KeyEvent的javadoc的

class MyConsole extends Console { 
    public void keyPressed(KeyEvent e) { 
     super.keyPressed(e); // Call your teacher's code in case he does something 
     // set some shared variable with the key that was typed 
     // you'll read this shared variable in your main loop 
    } 
} 

在你的主,你會做http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/KeyEvent.html:代替

c = new MyConsole(); 

c = new Console(); 

在主循環您我會螞蟻輪詢輸入的最後一個鍵......技術上你需要一個共享的volatile變量,但我想你的老師要麼不知道這個,要麼就是在早期引導你對線程進行線程化。

你的文件看起來是這樣的:

// The "Pac_man" class. 
import java.awt.*; 
import hsa.Console; 

public class Pac_man { 
    public static volatile char lastChar; 
    static Console c; 
    public static void main(String [] args) { 
     c = new MyConsole(); 
     do { 
      // read whatever character may have been set 
      // by the console 
      char key = lastChar; 
      ...your event loop logic... 
     } while (running); 
    } 
} 
static class MyConsole extends Console { 
    // this method is called by the system whenever a key has been pressed 
    public void keyPressed(KeyEvent e) { 
     // call your prof's version of keyPressed 
     super.keyPressed(e); 

     // set the shared lastChar variable 
     Pac_man.lastChar = e.getKeyChar(); 
    } 
} 

當然不能夠訪問你的老師取得了圖書館我只能做什麼會工作的猜測。

+2

請不要寫完整的解決方案給其他人的作業。它對他們沒有好處;正確方向的指針更合適。 –

+0

我的老師沒有製作圖書館,我相信它隨程序「準備編程Java」從http://compsci.ca/holtsoft/下載程序後轉到文件 - > new - > hsa consol模板,我不太明白你的代碼中發生了什麼... – user1413945

相關問題