?? controller.java
字號:
package cn.itcast.snake.controller;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Set;
import javax.swing.JLabel;
import cn.itcast.snake.entities.Food;
import cn.itcast.snake.entities.Ground;
import cn.itcast.snake.entities.Snake;
import cn.itcast.snake.listener.GameListener;
import cn.itcast.snake.listener.SnakeListener;
import cn.itcast.snake.util.Global;
import cn.itcast.snake.view.GamePanel;
/**
* 控制器<BR>
* 控制Ground, Snake, Food<BR>
* 負責游戲的邏輯<BR>
* 處理按鍵事件<BR>
* <BR>
* 實現了SnakeListener接口, 可以處理Snake 觸發的事件<BR>
* 方法 snakeEatFood() 處理蛇吃到食物后觸發的 snakeEatFood事件 但什么也沒做<BR>
* <BR>
*
* @version 1.0, 01/01/08
*
* @author 湯陽光
*
*/
public class Controller extends KeyAdapter implements SnakeListener {
/* 地形 */
private Ground ground;
/* 蛇 */
private Snake snake;
/* 食物 */
private Food food;
/* 顯示 */
private GamePanel gamePanel;
/* 提示信息 */
private JLabel gameInfoLabel;
private boolean playing;
private int map;
/* 控制器監聽器 */
private Set<GameListener> listeners = new HashSet<GameListener>();
/**
* 處理按鍵事件<BR>
* 接受按鍵, 根據按鍵不同, 發出不同的指令<BR>
* UP: 改變蛇的移動方向為向上<BR>
* DOWN: 改變蛇的移動方向為向下<BR>
* LEFT: 改變蛇的移動方向為向左 <BR>
* RIGHT: 改變蛇的移動方向為向右<BR>
* SPACE: 暫停/繼續<BR>
* PAGE UP: 加快蛇的移動速度<BR>
* PAGE DOWN: 減慢蛇的移動速度<BR>
* Y: 重新開始游戲
*/
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() != KeyEvent.VK_Y && !playing)
return;
// TODO Auto-generated method stub
/* 根據按鍵不同, 讓蛇改變不同的方向 */
switch (e.getKeyCode()) {
/* 方向鍵 上 */
case KeyEvent.VK_UP:
if (snake.isPause()) {
snake.changePause();
for (GameListener l : listeners)
l.gameContinue();
}
snake.changeDirection(Snake.UP);
break;
/* 方向鍵 下 */
case KeyEvent.VK_DOWN:
if (snake.isPause()) {
snake.changePause();
for (GameListener l : listeners)
l.gameContinue();
}
snake.changeDirection(Snake.DOWN);
break;
/* 方向鍵 左 */
case KeyEvent.VK_LEFT:
if (snake.isPause()) {
snake.changePause();
for (GameListener l : listeners)
l.gameContinue();
}
snake.changeDirection(Snake.LEFT);
break;
/* 方向鍵 右 */
case KeyEvent.VK_RIGHT:
if (snake.isPause()) {
snake.changePause();
for (GameListener l : listeners)
l.gameContinue();
}
snake.changeDirection(Snake.RIGHT);
break;
/* 回車或空格 (暫停) */
case KeyEvent.VK_ENTER:
case KeyEvent.VK_SPACE:
snake.changePause();
/* === */
for (GameListener l : listeners)
if (snake.isPause())
l.gamePause();
else
l.gameContinue();
break;
/* PAGE_UP 加速 */
case KeyEvent.VK_PAGE_UP:
snake.speedUp();
break;
/* PAGE_DOWN 減速 */
case KeyEvent.VK_PAGE_DOWN:
snake.speedDown();
break;
/* 字母鍵 Y (重新開始游戲) */
case KeyEvent.VK_Y:
if (!isPlaying())
newGame();
break;
}
/* 重新顯示 */
if (gamePanel != null)
gamePanel.redisplay(ground, snake, food);
/* 更新提示 */
if (gameInfoLabel != null)
gameInfoLabel.setText(getNewInfo());
}
/**
* 處理Snake 觸發的 snakeMoved 事件<BR>
*/
public void snakeMoved() {
/* 判斷是否吃到食物 */
if (food != null && food.isSnakeEatFood(snake)) {
/* 吃到食物后, 蛇增加身體, 再重新丟一個食物 */
snake.eatFood();
food.setLocation(ground == null ? food.getNew() : ground
.getFreePoint());
}/* 如果吃到食物, 就肯定不會吃到石頭 */
else if (ground != null && ground.isSnakeEatRock(snake)) {
/* 如果吃到的是石頭, 或吃到自己的身體, 就讓蛇死掉 */
stopGame();
}
if (snake.isEatBody())
stopGame();
if (gamePanel != null)
gamePanel.redisplay(ground, snake, food);
/* 更新提示 */
if (gameInfoLabel != null)
gameInfoLabel.setText(getNewInfo());
}
/**
* 開始一個新游戲
*/
public void newGame() {
if (ground != null) {
switch (map) {
case 2:
ground.clear();
ground.generateRocks2();
break;
default:
ground.init();
break;
}
}
playing = true;
snake.reNew();
for (GameListener l : listeners)
l.gameStart();
}
/**
* 結束游戲
*/
public void stopGame() {
if (playing) {
playing = false;
snake.dead();
for (GameListener l : listeners)
l.gameOver();
}
}
/**
* 暫停游戲
*/
public void pauseGame() {
snake.setPause(true);
for (GameListener l : listeners)
l.gamePause();
}
/**
* 繼續游戲
*/
public void continueGame() {
snake.setPause(false);
for (GameListener l : listeners)
l.gameContinue();
}
/**
* 接受Snake,Food,Ground 的構造器<BR>
*
* @param snake
* @param food
* @param ground
*/
public Controller(Snake snake, Food food, Ground ground, GamePanel gamePanel) {
this.snake = snake;
this.food = food;
this.ground = ground;
this.gamePanel = gamePanel;
/* 先丟一個食物 */
if (ground != null && food != null)
food.setLocation(ground.getFreePoint());
/* 注冊監聽器 */
this.snake.addSnakeListener(this);
}
/**
* 多接受一個顯示提示信息的JLabel
*
* @param snake
* @param food
* @param ground
* @param gameInfoLabel
*/
public Controller(Snake snake, Food food, Ground ground,
GamePanel gamePanel, JLabel gameInfoLabel) {
this(snake, food, ground, gamePanel);
this.setGameInfoLabel(gameInfoLabel);
if (gameInfoLabel != null)
gameInfoLabel.setText(getNewInfo());
}
/**
* 得到最新的提示信息
*
* @return 蛇的最新信息
*/
public String getNewInfo() {
if (!snake.isLive())
return " ";// " 提示: 按 Y 開始新游戲";
else
return new StringBuffer().append("提示: ").append("速度 ").append(
snake.getSpeed()).toString()
+ " 毫秒/格";
}
/**
* 添加監聽器
*
* @param l
*/
public synchronized void addGameListener(GameListener l) {
if (l != null)
this.listeners.add(l);
}
/**
* 移除監聽器
*
* @param l
*/
public synchronized void removeGameListener(GameListener l) {
if (l != null)
this.listeners.remove(l);
}
/**
* 得到蛇的引用
*
* @return
*/
public Snake getSnake() {
return this.snake;
}
/**
* 得到食物的引用
*
* @return
*/
public Food getFood() {
return this.food;
}
/**
* 得到地形的引用
*
* @return
*/
public Ground getGround() {
return this.ground;
}
/**
* 處理蛇吃到食物后觸發的 snakeEatFood事件, 但什么也沒做<BR>
* 可以覆蓋這個方法增加功能, 例如, 增加記分功能
*/
public void snakeEatFood() {
// TODO Auto-generated method stub
System.out.println("吃到食物!");
}
public GamePanel getGamePanel() {
return gamePanel;
}
/**
* 設置GamePanel
*
* @param gamePanel
*/
public void setGamePanel(GamePanel gamePanel) {
this.gamePanel = gamePanel;
}
public JLabel getGameInfoLabel() {
return gameInfoLabel;
}
public void setGameInfoLabel(JLabel gameInfoLabel) {
this.gameInfoLabel = gameInfoLabel;
this.gameInfoLabel.setSize(Global.WIDTH * Global.CELL_WIDTH, 20);
this.gameInfoLabel.setFont(new Font("宋體", Font.PLAIN, 12));
gameInfoLabel.setText(this.getNewInfo());
}
public void setGround(Ground ground) {
this.ground = ground;
}
public void setSnake(Snake snake) {
this.snake = snake;
}
public void setFood(Food food) {
this.food = food;
}
public int getMap() {
return map;
}
public void setMap(int map) {
this.map = map;
}
public boolean isPlaying() {
return playing;
}
public void setPlaying(boolean playing) {
this.playing = playing;
}
public boolean isPausingGame() {
// TODO Auto-generated method stub
return snake.isPause();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -