No older revisions available
No older revisions available
상규 ¶
~cpp
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
class SnakeCell {
public int snakeCellX;
public int snakeCellY;
public SnakeCell(int x, int y) {
snakeCellX = x;
snakeCellY = y;
}
};
class Snake {
public static final int LEFT = 1;
public static final int RIGHT = 2;
public static final int UP = 3;
public static final int DOWN = 4;
private final int snakeCellXRange;
private final int snakeCellYRange;
private Vector snakeCellVector;
private int snakeHeadIndex;
private int snakeDirection;
public Snake(int length, int xRange, int yRange) {
snakeCellXRange = xRange;
snakeCellYRange = yRange;
snakeCellVector = new Vector();
for(int i = length ; i >= 1 ; i--)
snakeCellVector.addElement(new SnakeCell(i, 1));
snakeHeadIndex = 0;
snakeDirection = Snake.RIGHT;
}
public int length() {
return snakeCellVector.size();
}
public SnakeCell getSnakeCell(int index) {
return (SnakeCell)snakeCellVector.elementAt((snakeHeadIndex + index) % length());
}
public int getDirection() {
return snakeDirection;
}
public void setDirection(int direction) {
snakeDirection = direction;
}
public boolean checkGameOver() {
SnakeCell head;
SnakeCell cell;
head = getSnakeCell(0);
if(head.snakeCellX < 0 || head.snakeCellY > snakeCellXRange - 1
|| head.snakeCellY < 0 || head.snakeCellY > snakeCellYRange - 1)
return false;
int length = length();
for(int i = 1 ; i < length ; i++) {
cell = getSnakeCell(i);
if(cell.snakeCellX == head.snakeCellX && cell.snakeCellY == head.snakeCellY)
return false;
}
return true;
}
public boolean go() {
SnakeCell prevHead = getSnakeCell(0);
snakeHeadIndex = (snakeHeadIndex + length() - 1) % length();
SnakeCell currentHead = getSnakeCell(0);
currentHead.snakeCellX = prevHead.snakeCellX;
currentHead.snakeCellY = prevHead.snakeCellY;
if(snakeDirection == Snake.LEFT)
currentHead.snakeCellX--;
else if(snakeDirection == Snake.RIGHT)
currentHead.snakeCellX++;
else if(snakeDirection == Snake.UP)
currentHead.snakeCellY--;
else if(snakeDirection == Snake.DOWN)
currentHead.snakeCellY++;
return checkGameOver();
}
};
class SnakeBiteCanvas extends Canvas {
private final int boardWallWidth = 4;
private final int snakeCellWidth = 4;
private final int canvasWidth;
private final int canvasHeight;
private final int boardX;
private final int boardY;
private final int boardWidth;
private final int boardHeight;
private final int boardInnerX;
private final int boardInnerY;
private final int boardInnerWidth;
private final int boardInnerHeight;
private Snake snake;
private boolean pause;
private boolean drawAll;
private boolean printScore;
private boolean gameOver;
public Command pauseCommand;
public Command restartCommand;
public SnakeBiteCanvas() {
canvasWidth = getWidth();
canvasHeight = getHeight();
boardWidth = canvasWidth - 6 - (canvasWidth - 6 - boardWallWidth * 2) % snakeCellWidth;
boardHeight = boardWidth / 10 * 8 - (boardWidth / 10 * 8 - boardWallWidth * 2) % snakeCellWidth;
boardX = (canvasWidth - boardWidth) / 2;
boardY = (canvasHeight - boardHeight) /2;
boardInnerX = boardX + boardWallWidth;
boardInnerY = boardY + boardWallWidth;
boardInnerWidth = boardWidth - boardWallWidth * 2;
boardInnerHeight = boardHeight - boardWallWidth * 2;
snake = new Snake(5, boardInnerWidth / snakeCellWidth, boardInnerHeight / snakeCellWidth);
pause = true;
drawAll = true;
printScore = false;
gameOver = false;
}
public void drawBoard(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, canvasWidth, canvasHeight);
g.setColor(0x000000);
g.fillRect(boardX, boardY, boardWidth, boardHeight);
}
public void clearBoard(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(boardInnerX - 1, boardInnerY - 1, boardInnerWidth + 2, boardInnerHeight + 2);
}
public void drawSnakeCell(Graphics g, SnakeCell cell) {
g.fillRect(boardInnerX + snakeCellWidth * cell.snakeCellX,
boardInnerY + snakeCellWidth * cell.snakeCellY,
snakeCellWidth, snakeCellWidth);
}
public void paint(Graphics g) {
if(drawAll) {
drawBoard(g);
drawAll = false;
}
clearBoard(g);
int length = snake.length();
SnakeCell cell;
g.setColor(0x000000);
for(int i = 0; i < length ; i++) {
cell = snake.getSnakeCell(i);
drawSnakeCell(g, cell);
}
if(printScore) {
}
if(gameOver) {
g.drawString("Game Over!!", canvasWidth / 2, canvasHeight, Graphics.HCENTER | Graphics.BOTTOM);
}
}
public void keyPressed(int keyCode) {
if(!pause && !gameOver) {
int gameAction = getGameAction(keyCode);
if(gameAction == Canvas.LEFT && snake.getDirection() != Snake.RIGHT)
snake.setDirection(Snake.LEFT);
else if(gameAction == Canvas.RIGHT && snake.getDirection() != Snake.LEFT)
snake.setDirection(Snake.RIGHT);
else if(gameAction == Canvas.UP && snake.getDirection() != Snake.DOWN)
snake.setDirection(Snake.UP);
else if(gameAction == Canvas.DOWN && snake.getDirection() != Snake.UP)
snake.setDirection(Snake.DOWN);
else
return;
if(snake.go() == false) {
this.removeCommand(pauseCommand);
this.addCommand(restartCommand);
gameOver = true;
}
repaint();
}
}
public void start() {
pause = false;
}
public void pause() {
pause = true;
}
public void restart() {
snake = new Snake(5, boardInnerWidth / snakeCellWidth, boardInnerHeight / snakeCellWidth);
pause = true;
drawAll = true;
printScore = false;
gameOver = false;
repaint();
}
};
public class SnakeBite extends MIDlet implements CommandListener {
private Display display;
private SnakeBiteCanvas canvas;
private Command startCommand;
private Command pauseCommand;
private Command restartCommand;
private Command exitCommand;
public SnakeBite() {
display = Display.getDisplay(this);
canvas = new SnakeBiteCanvas();
startCommand = new Command("Start", Command.SCREEN, 1);
pauseCommand = new Command("Pause", Command.SCREEN, 1);
restartCommand = new Command("Restart", Command.SCREEN, 1);
exitCommand = new Command("Exit", Command.EXIT, 1);
canvas.pauseCommand = pauseCommand;
canvas.restartCommand = restartCommand;
canvas.addCommand(startCommand);
canvas.addCommand(exitCommand);
canvas.setCommandListener(this);
}
public void startApp() {
display.setCurrent(canvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
display = null;
canvas = null;
exitCommand = null;
}
public void commandAction(Command c, Displayable d) {
if(c == startCommand) {
canvas.removeCommand(startCommand);
canvas.addCommand(pauseCommand);
canvas.start();
}
else if(c == pauseCommand) {
canvas.removeCommand(pauseCommand);
canvas.addCommand(startCommand);
canvas.pause();
}
else if(c == restartCommand) {
canvas.removeCommand(restartCommand);
canvas.addCommand(startCommand);
canvas.restart();
}
else if(c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
}
};
재동 ¶
~cpp
import java.io.*;
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
class StartCanvas extends Canvas {
private String startString;
private final int BACKGROUND_COLOR = 0xFFFFFF;
private final int FOREGROUND_COLOR = 0x000000;
private Image image;
public StartCanvas() {
try {
image = Image.createImage("/start.png");
}
catch(Exception e) {
System.out.println("그림이 없음");
}
}
public void paint(Graphics g) {
g.setColor(BACKGROUND_COLOR);
g.fillRect(g.getClipX(),g.getClipY(),g.getClipWidth(),g.getClipHeight());
g.setColor(FOREGROUND_COLOR);
g.drawImage(image,this.getWidth()/2,this.getHeight()/2,g.HCENTER|g.VCENTER);
}
}
class SnakeCell {
public int x;
public int y;
public SnakeCell(int x, int y) {
this.x = x;
this.y = y;
}
}
class BoardCanvas extends Canvas {
private int snakeHeadX;
private int snakeHeadY;
private int pathLength;
private final int snakeRect;
private int snakeLength;
private Vector snakes;
private final int BACKGROUND_COLOR = 0xFFFFFF;
private final int FOREGROUND_COLOR = 0x0000FF;
private final int boardX;
private final int boardY;
private final int boardWidth;
private final int boardHeight;
private boolean isGameOver;
public BoardCanvas() {
snakeHeadX = 20;
snakeHeadY = 30;
pathLength = 4;
snakeRect = 4;
snakeLength = 4;
boardX = 10;
boardY = 20;
boardWidth = this.getWidth() - boardX * 2;
boardHeight = this.getHeight() - boardY;
snakes = new Vector();
for(int i = 0;i < snakeLength;i++) {
snakes.addElement(new SnakeCell(boardX + (i+1) * snakeRect, boardY + snakeRect));
}
isGameOver = false;
}
public void changeSnakeHeadAndTeil() {
snakes.addElement((SnakeCell)snakes.elementAt(0));
snakes.removeElementAt(0);
}
public void keyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);
((SnakeCell)snakes.elementAt(0)).x = ((SnakeCell)snakes.elementAt(3)).x;
((SnakeCell)snakes.elementAt(0)).y = ((SnakeCell)snakes.elementAt(3)).y;
if(isMoveLeft(gameAction))
((SnakeCell)snakes.elementAt(0)).x -= pathLength;
else if(isMoveRight(gameAction))
((SnakeCell)snakes.elementAt(0)).x += pathLength;
else if(isMoveUp(gameAction))
((SnakeCell)snakes.elementAt(0)).y -= pathLength;
else if(isMoveDown(gameAction))
((SnakeCell)snakes.elementAt(0)).y += pathLength;
changeSnakeHeadAndTeil();
repaint();
}
public boolean isMoveUp(int ga) {
return ga == Canvas.UP && ((SnakeCell)snakes.elementAt(snakeLength - 1)).y > boardY;
}
public boolean isMoveDown(int ga) {
return ga == Canvas.DOWN && ((SnakeCell)snakes.elementAt(snakeLength - 1)).y < boardHeight + boardY - snakeRect * 2;
}
public boolean isMoveLeft(int ga) {
return ga == Canvas.LEFT && ((SnakeCell)snakes.elementAt(snakeLength - 1)).x > boardX;
}
public boolean isMoveRight(int ga) {
return ga == Canvas.RIGHT && ((SnakeCell)snakes.elementAt(snakeLength - 1)).x < boardWidth + boardX - snakeRect * 2;
}
public void paint(Graphics g) {
g.setColor(BACKGROUND_COLOR);
g.fillRect(g.getClipX(),g.getClipY(),g.getClipWidth(),g.getClipHeight());
g.setColor(FOREGROUND_COLOR);
g.drawRect(boardX-2,boardY-2,boardWidth,boardHeight);
for(int i = 0;i < snakeLength;i++) {
g.fillRect(((SnakeCell)snakes.elementAt(i)).x,
((SnakeCell)snakes.elementAt(i)).y, snakeRect, snakeRect);
}
}
}
public class SnakeBite extends MIDlet implements CommandListener {
private Display display;
private BoardCanvas boardCanvas;
private StartCanvas startCanvas;
private Command exitCommand;
private Command startCommand;
public SnakeBite() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.EXIT, 1);
startCommand = new Command("Start", Command.SCREEN, 2);
startCanvas = new StartCanvas();
boardCanvas = new BoardCanvas();
startCanvas.addCommand(startCommand);
startCanvas.addCommand(exitCommand);
startCanvas.setCommandListener(this);
boardCanvas.addCommand(exitCommand);
boardCanvas.setCommandListener(this);
}
public void startApp() {
display.setCurrent(startCanvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
display = null;
boardCanvas = null;
startCanvas = null;
exitCommand = null;
startCommand = null;
}
public void commandAction(Command c, Displayable d) {
if(c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
else if(c == startCommand) {
display.setCurrent(boardCanvas);
}
}
}