{"id":179,"date":"2005-06-22T08:00:00","date_gmt":"2005-06-22T08:00:00","guid":{"rendered":"https:\/\/out.cat\/?p=175"},"modified":"2005-06-22T08:00:00","modified_gmt":"2005-06-22T08:00:00","slug":"175","status":"publish","type":"post","link":"https:\/\/out.cat\/?p=179","title":{"rendered":"\u8d2a\u98df\u86c7"},"content":{"rendered":"<p>import java.awt.*;<br \/>\nimport java.awt.event.*;<br \/>\nimport javax.swing.*;<br \/>\nimport java.util.*;<br \/>\nimport javax.swing.*;<br \/>\npublic class GreedSnake implements KeyListener{<br \/>\n  JFrame mainFrame;<br \/>\n  Canvas paintCanvas;<br \/>\n  JLabel labelScore;<br \/>\n  SnakeModel snakeModel = null;<br \/>\n  public static final int canvasWidth = 200;<br \/>\n  public static final int canvasHeight = 200;<br \/>\n  public static final int nodeWidth = 10;<br \/>\n  public static final int nodeHeight = 10;<br \/>\n  public GreedSnake() {<br \/>\n    mainFrame = new JFrame(&#8220;GreedSnake&#8221;);<br \/>\n    Container cp = mainFrame.getContentPane();<br \/>\n    labelScore = new JLabel(&#8220;Score:&#8221;);<br \/>\n    cp.add(labelScore, BorderLayout.NORTH);<br \/>\n    paintCanvas = new Canvas();<br \/>\n    paintCanvas.setSize(canvasWidth,canvasHeight);<br \/>\n    paintCanvas.addKeyListener(this);<br \/>\n    cp.add(paintCanvas, BorderLayout.CENTER);<br \/>\n    JPanel panelButtom = new JPanel();<br \/>\n    panelButtom.setLayout(new BorderLayout());<br \/>\n    JLabel labelHelp;<br \/>\n    labelHelp = new JLabel(&#8220;PageUp, PageDown for speed;&#8221;, JLabel.CENTER);<br \/>\n    panelButtom.add(labelHelp, BorderLayout.NORTH);<br \/>\n    labelHelp = new JLabel(&#8220;ENTER or R or S for start;&#8221;, JLabel.CENTER);<br \/>\n    panelButtom.add(labelHelp, BorderLayout.CENTER);<br \/>\n    labelHelp = new JLabel(&#8220;SPACE or P for pause&#8221;,JLabel.CENTER);<br \/>\n    panelButtom.add(labelHelp, BorderLayout.SOUTH);<br \/>\n    cp.add(panelButtom,BorderLayout.SOUTH);<br \/>\n    mainFrame.addKeyListener(this);<br \/>\n    mainFrame.pack();<br \/>\n    mainFrame.setResizable(false);<br \/>\n    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br \/>\n    mainFrame.setVisible(true);<br \/>\n    begin();<br \/>\n  }<br \/>\n  public void keyPressed(KeyEvent e){<br \/>\n    int keyCode = e.getKeyCode();<br \/>\n    if (snakeModel.running)<br \/>\n      switch(keyCode){<br \/>\n        case KeyEvent.VK_UP:<br \/>\n          snakeModel.changeDirection(SnakeModel.UP);<br \/>\n          break;<br \/>\n        case KeyEvent.VK_DOWN:<br \/>\n          snakeModel.changeDirection(SnakeModel.DOWN);<br \/>\n          break;<br \/>\n        case KeyEvent.VK_LEFT:<br \/>\n          snakeModel.changeDirection(SnakeModel.LEFT);<br \/>\n          break;<br \/>\n        case KeyEvent.VK_RIGHT:<br \/>\n          snakeModel.changeDirection(SnakeModel.RIGHT);<br \/>\n          break;<br \/>\n        case KeyEvent.VK_ADD:<br \/>\n        case KeyEvent.VK_PAGE_UP:<br \/>\n          snakeModel.speedUp();<br \/>\n          break;<br \/>\n        case KeyEvent.VK_SUBTRACT:<br \/>\n        case KeyEvent.VK_PAGE_DOWN:<br \/>\n          snakeModel.speedDown();<br \/>\n          break;<br \/>\n        case KeyEvent.VK_SPACE:<br \/>\n        case KeyEvent.VK_P:<br \/>\n          snakeModel.changePauseState();<br \/>\n          break;<br \/>\n        default:<br \/>\n      }<br \/>\n    if (keyCode == KeyEvent.VK_R ||<br \/>\n        keyCode == KeyEvent.VK_S ||<br \/>\n        keyCode == KeyEvent.VK_ENTER){<br \/>\n      snakeModel.running = false;<br \/>\n      begin();<br \/>\n    }<br \/>\n  }<br \/>\n  public void keyReleased(KeyEvent e){<br \/>\n  }<br \/>\n  public void keyTyped(KeyEvent e){<br \/>\n  }<br \/>\n  void repaint(){<br \/>\n    Graphics g = paintCanvas.getGraphics();<br \/>\n    \/\/draw background<br \/>\n    g.setColor(Color.WHITE);<br \/>\n    g.fillRect(0,0,canvasWidth,canvasHeight);<br \/>\n    \/\/ draw the snake<br \/>\n    g.setColor(Color.BLACK);<br \/>\n    LinkedList na = snakeModel.nodeArray;<br \/>\n    Iterator it = na.iterator();<br \/>\n    while(it.hasNext()){<br \/>\n      Node n = (Node)it.next();<br \/>\n      drawNode(g,n);<br \/>\n    }<br \/>\n    \/\/ draw the food<br \/>\n    g.setColor(Color.RED);<br \/>\n    Node n = snakeModel.food;<br \/>\n    drawNode(g,n);<br \/>\n    updateScore();<br \/>\n  }<br \/>\n  private void drawNode(Graphics g, Node n){<br \/>\n    g.fillRect(n.x*nodeWidth,<br \/>\n               n.y*nodeHeight,<br \/>\n               nodeWidth-1,<br \/>\n               nodeHeight-1);<br \/>\n  }<br \/>\n  public void updateScore(){<br \/>\n    String s = &#8220;Score: &#8221; + snakeModel.score;<br \/>\n    labelScore.setText(s);<br \/>\n  }<br \/>\n  void begin(){<br \/>\n    if (snakeModel == null || !snakeModel.running){<br \/>\n      snakeModel = new SnakeModel(this,<br \/>\n                                  canvasWidth\/nodeWidth,<br \/>\n                                  canvasHeight\/nodeHeight);<br \/>\n      (new Thread(snakeModel)).start();<br \/>\n    }<br \/>\n  }<br \/>\n  public static void main(String[] args){<br \/>\n    GreedSnake gs = new GreedSnake();<br \/>\n  }<br \/>\n}<br \/>\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br \/>\n\/\/ \u6587\u4ef62<br \/>\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br \/>\nclass SnakeModel implements Runnable{<br \/>\n  GreedSnake gs;<br \/>\n  boolean[][] matrix;<br \/>\n  LinkedList nodeArray = new LinkedList();<br \/>\n  Node food;<br \/>\n  int maxX;<br \/>\n  int maxY;<br \/>\n  int direction = 2;<br \/>\n  boolean running = false;<br \/>\n  int timeInterval = 200;<br \/>\n  double speedChangeRate = 0.75;<br \/>\n  boolean paused = false;<br \/>\n  int score = 0;<br \/>\n  int countMove = 0;<br \/>\n  \/\/ UP and DOWN should be even<br \/>\n  \/\/ RIGHT and LEFT should be odd<br \/>\n  public static final int UP = 2;<br \/>\n  public static final int DOWN = 4;<br \/>\n  public static final int LEFT = 1;<br \/>\n  public static final int RIGHT = 3;<br \/>\n  public SnakeModel(GreedSnake gs, int maxX, int maxY){<br \/>\n    this.gs = gs;<br \/>\n    this.maxX = maxX;<br \/>\n    this.maxY = maxY;<br \/>\n    \/\/ initial matirx<br \/>\n    matrix = new boolean[maxX][];<br \/>\n    for(int i=0; i<maxX; ++i){\n      matrix[i] = new boolean[maxY];\n      Arrays.fill(matrix[i],false);\n    }\n    \/\/ initial the snake\n    int initArrayLength = maxX > 20 ? 10 : maxX\/2;<br \/>\n    for(int i = 0; i < initArrayLength; ++i){\n      int x = maxX\/2+i;\n      int y = maxY\/2;\n      nodeArray.addLast(new Node(x, y));\n      matrix[x][y] = true;\n    }\n    food = createFood();\n    matrix[food.x][food.y] = true;\n  }\n  public void changeDirection(int newDirection){\n    if (direction % 2 != newDirection % 2){\n      direction = newDirection;\n    }\n  }\n  public boolean moveOn(){\n    Node n = (Node)nodeArray.getFirst();\n    int x = n.x;\n    int y = n.y;\n    switch(direction){\n      case UP:\n        y--;\n        break;\n      case DOWN:\n        y++;\n        break;\n      case LEFT:\n        x--;\n        break;\n      case RIGHT:\n        x++;\n        break;\n    }\n    if ((0 <= x &#038;&#038; x < maxX) &#038;&#038; (0 <= y &#038;&#038; y < maxY)){\n      if (matrix[x][y]){\n        if(x == food.x &#038;&#038; y == food.y){\n          nodeArray.addFirst(food);\n          int scoreGet = (10000 - 200 * countMove) \/ timeInterval;\n          score += scoreGet > 0? scoreGet : 10;<br \/>\n          countMove = 0;<br \/>\n          food = createFood();<br \/>\n          matrix[food.x][food.y] = true;<br \/>\n          return true;<br \/>\n        }<br \/>\n        else<br \/>\n          return false;<br \/>\n      }<br \/>\n      else{<br \/>\n        nodeArray.addFirst(new Node(x,y));<br \/>\n        matrix[x][y] = true;<br \/>\n        n = (Node)nodeArray.removeLast();<br \/>\n        matrix[n.x][n.y] = false;<br \/>\n        countMove++;<br \/>\n        return true;<br \/>\n      }<br \/>\n    }<br \/>\n    return false;<br \/>\n  }<br \/>\n  public void run(){<br \/>\n    running = true;<br \/>\n    while (running){<br \/>\n      try{<br \/>\n        Thread.sleep(timeInterval);<br \/>\n      }<br \/>\n      catch(Exception e){<br \/>\n        break;<br \/>\n      }<br \/>\n      if(!paused){<br \/>\n        if (moveOn()){<br \/>\n          gs.repaint();<br \/>\n        }<br \/>\n        else{<br \/>\n          JOptionPane.showMessageDialog(<br \/>\n              null,<br \/>\n              &#8220;you failed&#8221;,<br \/>\n              &#8220;Game Over&#8221;,<br \/>\n              JOptionPane.INFORMATION_MESSAGE);<br \/>\n          break;<br \/>\n        }<br \/>\n      }<br \/>\n    }<br \/>\n    running = false;<br \/>\n  }<br \/>\n  private Node createFood(){<br \/>\n    int x = 0;<br \/>\n    int y = 0;<br \/>\n    do{<br \/>\n      Random r = new Random();<br \/>\n      x = r.nextInt(maxX);<br \/>\n      y = r.nextInt(maxY);<br \/>\n    }while(matrix[x][y]);<br \/>\n    return new Node(x,y);<br \/>\n  }<br \/>\n  public void speedUp(){<br \/>\n    timeInterval *= speedChangeRate;<br \/>\n  }<br \/>\n  public void speedDown(){<br \/>\n    timeInterval \/= speedChangeRate;<br \/>\n  }<br \/>\n  public void changePauseState(){<br \/>\n    paused = !paused;<br \/>\n  }<br \/>\n  public String toString(){<br \/>\n    String result = &#8220;&#8221;;<br \/>\n    for(int i=0; i<nodeArray.size(); ++i){\n      Node n = (Node)nodeArray.get(i);\n      result += \"[\" + n.x + \",\" + n.y + \"]\";\n    }\n    return result;\n  }\n}\nclass Node{\n  int x;\n  int y;\n  Node(int x, int y){\n    this.x = x;\n    this.y = y;\n  }\n} \n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>import java.awt.&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[79],"class_list":["post-179","post","type-post","status-publish","format-standard","hentry","category-4","tag-79"],"_links":{"self":[{"href":"https:\/\/out.cat\/index.php?rest_route=\/wp\/v2\/posts\/179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/out.cat\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/out.cat\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/out.cat\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/out.cat\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=179"}],"version-history":[{"count":0,"href":"https:\/\/out.cat\/index.php?rest_route=\/wp\/v2\/posts\/179\/revisions"}],"wp:attachment":[{"href":"https:\/\/out.cat\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/out.cat\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/out.cat\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}