Thoumi Ngonga Brice
2 years ago
2 changed files with 208 additions and 0 deletions
@ -1,6 +1,190 @@ |
|||
package Snake; |
|||
|
|||
|
|||
import javax.swing.*; |
|||
import java.awt.*; |
|||
import java.awt.event.ActionEvent; |
|||
import java.awt.event.ActionListener; |
|||
|
|||
public class Controller { |
|||
|
|||
private enum GameState { Running, Paused, PlayerLosed }; |
|||
private GameView gameView; |
|||
private Snake snakeModel; |
|||
private SnakeView snakeView; |
|||
private Apple appleModel; |
|||
private AppleView appleView; |
|||
private TextView scoreView; |
|||
private TextView messageView; |
|||
|
|||
private boolean inputHandled; |
|||
private Timer timer; |
|||
private GameState gameState; |
|||
private int score; |
|||
|
|||
Controller(Window window, Snake snakeModel, SnakeView snakeView, Apple appleModel, AppleView appleView) |
|||
{ |
|||
gameView = window.getGameView(); |
|||
this.snakeModel = snakeModel; |
|||
this.snakeView = snakeView; |
|||
this.appleModel = appleModel; |
|||
this.appleView = appleView; |
|||
|
|||
scoreView = new TextView("Scores: 0", new Point(15, 15)); |
|||
messageView = new TextView("Click 'Start Game' to Begin . (W-up, S-down, A-left, D-Right)", |
|||
new Point(gameView.getWidth()/2, gameView.getHeight() - 15)); |
|||
|
|||
scoreView.setAnchor(TextView.AnchorType.Left); |
|||
|
|||
gameView.addView(scoreView); |
|||
gameView.addView(messageView); |
|||
|
|||
initializeInputHandling(); |
|||
addButtonActionListeners(window); |
|||
|
|||
timer = new Timer(100, new ActionListener() |
|||
{ |
|||
@Override |
|||
public void actionPerformed(ActionEvent e) |
|||
{ |
|||
timerTick(); |
|||
} |
|||
}); |
|||
|
|||
gameState = GameState.Paused; |
|||
inputHandled = true; |
|||
score = 0; |
|||
|
|||
selectApplesPosition(); |
|||
updateSnakeViewPosition(); |
|||
} |
|||
private void initializeInputHandling() |
|||
{ |
|||
final int CONDITION = JComponent.WHEN_IN_FOCUSED_WINDOW; |
|||
gameView.getInputMap(CONDITION).put(KeyStroke.getKeyStroke("W"), "move up"); |
|||
gameView.getInputMap(CONDITION).put(KeyStroke.getKeyStroke("A"), "move left"); |
|||
gameView.getInputMap(CONDITION).put(KeyStroke.getKeyStroke("S"), "move down"); |
|||
gameView.getInputMap(CONDITION).put(KeyStroke.getKeyStroke("D"), "move right"); |
|||
|
|||
gameView.getActionMap().put("move up", new MoveAction(Snake.SnakeDirection.UP)); |
|||
gameView.getActionMap().put("move left", new MoveAction(Snake.SnakeDirection.LEFT)); |
|||
gameView.getActionMap().put("move down", new MoveAction(Snake.SnakeDirection.DOWN)); |
|||
gameView.getActionMap().put("move right", new MoveAction(Snake.SnakeDirection.RIGHT)); |
|||
} |
|||
private void addButtonActionListeners(Window window) |
|||
{ |
|||
window.addStartActionListener(new ActionListener() |
|||
{ |
|||
@Override |
|||
public void actionPerformed(ActionEvent e) |
|||
{ |
|||
if(gameState == GameState.Paused) |
|||
{ |
|||
messageView.setVisibility(false); |
|||
gameState = GameState.Running; |
|||
timer.start(); |
|||
} |
|||
else if(gameState == GameState.PlayerLosed) |
|||
{ |
|||
messageView.setVisibility(false); |
|||
restartGame(); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
window.addPauseActionListener(new ActionListener() |
|||
{ |
|||
@Override |
|||
public void actionPerformed(ActionEvent e) |
|||
{ |
|||
if(gameState == GameState.Running) |
|||
{ |
|||
messageView.setText("Game Paused."); |
|||
messageView.setVisibility(true); |
|||
gameView.repaint(); |
|||
gameState = GameState.Paused; |
|||
timer.stop(); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
private void restartGame() |
|||
{ |
|||
snakeModel.reset(); |
|||
score = 0; |
|||
scoreView.setText("Score: " + Integer.toString(score)); |
|||
selectApplesPosition(); |
|||
gameState = GameState.Running; |
|||
timer.start(); |
|||
} |
|||
private void selectApplesPosition() |
|||
{ |
|||
do |
|||
{ |
|||
appleModel.selectGridPosition(gameView.getGridSize()); |
|||
} while(!isApplePositionIsValid()); |
|||
appleView.setPosition(appleModel.getPosition()); |
|||
} |
|||
private boolean isApplePositionIsValid() |
|||
{ |
|||
var snakeSegments = snakeModel.getBodySegments(); |
|||
for(var segmentPosition: snakeSegments) |
|||
{ |
|||
if(segmentPosition.equals(appleModel.getPosition())) |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
private void updateSnakeViewPosition() |
|||
{ |
|||
snakeView.setPositions(snakeModel.getBodySegments()); |
|||
} |
|||
|
|||
private void timerTick() |
|||
{ |
|||
snakeModel.update(); |
|||
inputHandled = true; |
|||
checkIfAppleWasEaten(); |
|||
if(snakeModel.isSelfColliding()) |
|||
{ |
|||
messageView.setText("You Lose! Click 'Start Game' to play again."); |
|||
messageView.setVisibility(true); |
|||
gameState = GameState.PlayerLosed; |
|||
timer.stop(); |
|||
} |
|||
updateSnakeViewPosition(); |
|||
gameView.repaint(); |
|||
} |
|||
private void checkIfAppleWasEaten() |
|||
{ |
|||
if(appleModel.getPosition().equals(snakeModel.getHeadPosition())) |
|||
{ |
|||
score += 1; |
|||
scoreView.setText("Score: " + Integer.toString(score)); |
|||
snakeModel.grow(); |
|||
selectApplesPosition(); |
|||
} |
|||
} |
|||
|
|||
private class MoveAction extends AbstractAction |
|||
{ |
|||
|
|||
private Snake.SnakeDirection direction; |
|||
|
|||
MoveAction(Snake.SnakeDirection direction) |
|||
{ |
|||
this.direction = direction; |
|||
} |
|||
@Override |
|||
public void actionPerformed(ActionEvent e) |
|||
{ |
|||
if(inputHandled && gameState == GameState.Running) |
|||
{ |
|||
snakeModel.setDirection(direction); |
|||
inputHandled = false; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,24 @@ |
|||
package Snake; |
|||
|
|||
public class Game { |
|||
public Game() { |
|||
|
|||
final int VIEW_SIZE = 500; |
|||
final int GRID_SIZE = 50; |
|||
final int CELL_SIZE = VIEW_SIZE / GRID_SIZE; |
|||
|
|||
Window gameWindow = new Window(VIEW_SIZE, GRID_SIZE); |
|||
|
|||
Snake snakeModel = new Snake(GRID_SIZE); |
|||
SnakeView snakeView = new SnakeView(CELL_SIZE); |
|||
|
|||
Apple appleModel = new Apple(); |
|||
AppleView appleView = new AppleView(CELL_SIZE); |
|||
|
|||
GameView gameView = gameWindow.getGameView(); |
|||
gameView.addView(snakeView); |
|||
gameView.addView(appleView); |
|||
|
|||
new Controller(gameWindow, snakeModel, snakeView, appleModel, appleView); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue