규 ¶
~cpp
import java.lang.*;
import java.io.*;
import java.util.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
class SplashCanvas extends Canvas {
public void paint(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, getWidth(), getHeight());
try {
Image splashImage = Image.createImage("/Splash.png");
g.drawImage(splashImage, getWidth() / 2, getHeight() / 2, Graphics.HCENTER | Graphics.VCENTER);
} catch(IOException e) {
e.printStackTrace();
}
}
};
class SnakeCell {
public int x;
public int y;
public SnakeCell(int x, int y) {
this.x = x;
this.y = 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 xRange;
private final int yRange;
private Vector cellVector;
private int headIndex;
private int direction;
private boolean growing;
public Snake(int length, int xRange, int yRange) {
this.xRange = xRange;
this.yRange = yRange;
cellVector = new Vector();
for(int i = length ; i >= 1 ; i--)
cellVector.addElement(new SnakeCell(i, 1));
headIndex = 0;
direction = Snake.RIGHT;
growing = false;
}
public int length() {
return cellVector.size();
}
public SnakeCell getSnakeCell(int index) {
return (SnakeCell)cellVector.elementAt((headIndex + index) % length());
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public boolean checkGameOver() {
SnakeCell head;
SnakeCell cell;
head = getSnakeCell(0);
if(head.x < 0 || head.x > xRange - 1
|| head.y < 0 || head.y > yRange - 1)
return false;
int length = length();
for(int i = 1 ; i < length ; i++) {
cell = getSnakeCell(i);
if(head.x == cell.x && head.y == cell.y)
return false;
}
return true;
}
public boolean go() {
SnakeCell prevHead = getSnakeCell(0);
SnakeCell currentHead;
if(growing) {
currentHead = new SnakeCell(prevHead.x, prevHead.y);
cellVector.insertElementAt(currentHead, headIndex);
growing = false;
}
else {
headIndex = (headIndex + length() - 1) % length();
currentHead = getSnakeCell(0);
currentHead.x = prevHead.x;
currentHead.y = prevHead.y;
}
if(direction == Snake.LEFT)
currentHead.x--;
else if(direction == Snake.RIGHT)
currentHead.x++;
else if(direction == Snake.UP)
currentHead.y--;
else if(direction == Snake.DOWN)
currentHead.y++;
return checkGameOver();
}
public void grow() {
growing = true;
}
};
class SnakeBiteCanvas extends Canvas implements Runnable {
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 final int snakeXRange;
private final int snakeYRange;
private Snake snake;
private int appleX;
private int appleY;
private int level;
private boolean pause;
private boolean drawBoard;
private boolean printLevel;
private boolean gameOver;
private int delayTime;
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;
snakeXRange = boardInnerWidth / snakeCellWidth;
snakeYRange = boardInnerHeight / snakeCellWidth;
newGame();
}
public void newGame() {
snake = new Snake(5, snakeXRange, snakeYRange);
newApple();
level = 1;
pause = true;
drawBoard = true;
printLevel = true;
gameOver = false;
delayTime = 200;
new Thread(this).start();
}
public void newApple() {
Random random = new Random();
int length = snake.length();
SnakeCell cell;
boolean ok;
for(;;) {
appleX = Math.abs(random.nextInt()) % snakeXRange;
appleY = Math.abs(random.nextInt()) % snakeYRange;
ok = true;
for(int i = 0 ; i < length ; i++) {
cell = snake.getSnakeCell(i);
if(appleX == cell.x && appleY == cell.y) {
ok = false;
break;
}
}
if(ok)
return;
}
}
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 drawCell(Graphics g, int x, int y) {
g.fillRect(boardInnerX + snakeCellWidth * x,
boardInnerY + snakeCellWidth * y,
snakeCellWidth, snakeCellWidth);
}
public void paint(Graphics g) {
if(drawBoard) {
drawBoard(g);
drawBoard = false;
}
clearBoard(g);
g.setColor(0x000000);
int length = snake.length();
SnakeCell cell;
for(int i = 0; i < length ; i++) {
cell = snake.getSnakeCell(i);
drawCell(g, cell.x, cell.y);
}
drawCell(g, appleX, appleY);
if(printLevel) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, canvasWidth, boardY);
g.setColor(0x000000);
g.drawString("Level : " + level, canvasWidth / 2, 0, Graphics.HCENTER | Graphics.TOP);
printLevel = false;
}
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);
int direction = snake.getDirection();
if(gameAction == Canvas.LEFT && direction != Snake.RIGHT)
snake.setDirection(Snake.LEFT);
else if(gameAction == Canvas.RIGHT && direction != Snake.LEFT)
snake.setDirection(Snake.RIGHT);
else if(gameAction == Canvas.UP && direction != Snake.DOWN)
snake.setDirection(Snake.UP);
else if(gameAction == Canvas.DOWN && direction != Snake.UP)
snake.setDirection(Snake.DOWN);
}
}
public void start() {
pause = false;
}
public void pause() {
pause = true;
}
public void restart() {
newGame();
repaint();
}
public void run() {
SnakeCell head;
try {
for(;;) {
if(!pause) {
if(snake.go() == false) {
gameOver = true;
repaint();
this.removeCommand(pauseCommand);
this.addCommand(restartCommand);
return;
}
head = snake.getSnakeCell(0);
if(head.x == appleX && head.y == appleY) {
level++;
printLevel = true;
delayTime-=3;
snake.grow();
newApple();
}
repaint();
Thread.sleep(delayTime);
}
}
} catch(InterruptedException e) {
e.printStackTrace();
}
}
};
public class SnakeBite extends MIDlet implements CommandListener {
private Display display;
private SplashCanvas splashCanvas;
private SnakeBiteCanvas snakeBiteCanvas;
private Command continueCommand;
private Command startCommand;
private Command pauseCommand;
private Command restartCommand;
private Command exitCommand;
public SnakeBite() {
display = Display.getDisplay(this);
splashCanvas = new SplashCanvas();
snakeBiteCanvas = new SnakeBiteCanvas();
continueCommand = new Command("Continue", Command.SCREEN, 1);
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);
splashCanvas.addCommand(continueCommand);
splashCanvas.addCommand(exitCommand);
splashCanvas.setCommandListener(this);
snakeBiteCanvas.pauseCommand = pauseCommand;
snakeBiteCanvas.restartCommand = restartCommand;
snakeBiteCanvas.addCommand(startCommand);
snakeBiteCanvas.addCommand(exitCommand);
snakeBiteCanvas.setCommandListener(this);
}
public void startApp() {
display.setCurrent(splashCanvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
display = null;
snakeBiteCanvas = null;
startCommand = null;
pauseCommand = null;
restartCommand = null;
exitCommand = null;
}
public void commandAction(Command c, Displayable d) {
if(c == continueCommand) {
display.setCurrent(snakeBiteCanvas);
}
else if(c == startCommand) {
snakeBiteCanvas.removeCommand(startCommand);
snakeBiteCanvas.addCommand(pauseCommand);
snakeBiteCanvas.start();
}
else if(c == pauseCommand) {
snakeBiteCanvas.removeCommand(pauseCommand);
snakeBiteCanvas.addCommand(startCommand);
snakeBiteCanvas.pause();
}
else if(c == restartCommand) {
snakeBiteCanvas.removeCommand(restartCommand);
snakeBiteCanvas.addCommand(startCommand);
snakeBiteCanvas.restart();
}
else if(c == exitCommand) {
destroyApp(true);
notifyDestroyed();
}
}
};
¶
~cpp
import java.io.*;
import java.util.*;
import java.lang.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
class StartCanvas extends Canvas {
private String startString;
private final int BACKGROUND_COLOR = 0xFFFFFF;
private Image image;
public StartCanvas() {
try {
image = Image.createImage("/start.png");
}
catch(Exception e) {
System.out.println("No Image");
}
}
public void paint(Graphics g) {
g.setColor(BACKGROUND_COLOR);
g.fillRect(g.getClipX(),g.getClipY(),g.getClipWidth(),g.getClipHeight());
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 implements Runnable {
private final int cellRect;
private int snakeLength;
private int currentDirection;
private Vector snakes;
private Random random;
private int appleX;
private int appleY;
private int score;
private int gameSpeed;
private final int boardX;
private final int boardY;
private int boardWidth;
private int boardHeight;
private int boardWall;
private boolean isGameOver;
private Command restartCommand;
private final int BACKGROUND_COLOR = 0xFFFFFF;
private final int WALL_COLOR = 0x000000;
private final int SNAKE_COLOR = 0x0000FF;
private final int APPLE_COLOR = 0xFF0000;
public BoardCanvas() {
cellRect = 4;
boardX = 10;
boardY = 20;
boardWidth = this.getWidth() - boardX * 2;
boardHeight = this.getHeight() - boardY - 2;
boardWall = 2;
snakes = new Vector();
random = new Random();
newGame();
}
public void newGame() {
currentDirection = RIGHT;
score = 0;
gameSpeed = 50;
newApple();
isGameOver = false;
snakes.removeAllElements();
snakeLength = 4;
for(int i = 0;i < snakeLength;i++) {
snakes.addElement(new SnakeCell(boardX + (i+1) * cellRect, boardY + cellRect));
}
}
public void newApple() {
appleX = (Math.abs(random.nextInt()) % ((boardWidth-1) / cellRect)) * cellRect + boardX;
appleY = (Math.abs(random.nextInt()) % ((boardHeight-1) / cellRect)) * cellRect + boardY;
}
public void growSnake() {
snakeLength++;
snakes.insertElementAt(new SnakeCell(((SnakeCell)snakes.elementAt(0)).x,((SnakeCell)snakes.elementAt(0)).y),0);
}
public void chaeckEatApple() {
if(appleX == ((SnakeCell)snakes.elementAt(snakeLength - 1)).x && appleY == ((SnakeCell)snakes.elementAt(snakeLength - 1)).y) {
newApple();
score += 10;
if(score % 3 == 0) {
growSnake();
if(gameSpeed > 10)
gameSpeed -= 2;
}
}
}
public void changeSnakeHeadToTeil() {
snakes.addElement((SnakeCell)snakes.elementAt(0));
snakes.removeElementAt(0);
}
public void keyPressed(int keyCode) {
if(isGameOver == false) {
int gameAction = getGameAction(keyCode);
moveSnake(gameAction);
}
}
public void moveSnakeHeadToTail() {
((SnakeCell)snakes.elementAt(0)).x = ((SnakeCell)snakes.elementAt(snakeLength - 1)).x;
((SnakeCell)snakes.elementAt(0)).y = ((SnakeCell)snakes.elementAt(snakeLength - 1)).y;
}
public void moveSnake(int ga) {
moveSnakeHeadToTail();
if(isMoveLeft(ga)) {
((SnakeCell)snakes.elementAt(0)).x -= cellRect;
currentDirection = LEFT;
} else if(isMoveRight(ga)) {
((SnakeCell)snakes.elementAt(0)).x += cellRect;
currentDirection = RIGHT;
} else if(isMoveUp(ga)) {
((SnakeCell)snakes.elementAt(0)).y -= cellRect;
currentDirection = UP;
} else if(isMoveDown(ga)) {
((SnakeCell)snakes.elementAt(0)).y += cellRect;
currentDirection = DOWN;
}
changeSnakeHeadToTeil();
chaeckEatApple();
repaint();
}
public boolean isMoveUp(int ga) {
if (((SnakeCell)snakes.elementAt(0)).y < boardY - 1) {
isGameOver = true;
}
return ga == UP && currentDirection != DOWN && ((SnakeCell)snakes.elementAt(0)).y >= boardY;
}
public boolean isMoveDown(int ga) {
if (((SnakeCell)snakes.elementAt(0)).y > boardHeight + boardY - cellRect * 2 + 1) {
isGameOver = true;
}
return ga == DOWN && currentDirection != UP && ((SnakeCell)snakes.elementAt(0)).y <= boardHeight + boardY - cellRect * 2;
}
public boolean isMoveLeft(int ga) {
if (((SnakeCell)snakes.elementAt(0)).x < boardX - 1) {
isGameOver = true;
}
return ga == LEFT && currentDirection != RIGHT && ((SnakeCell)snakes.elementAt(0)).x >= boardX;
}
public boolean isMoveRight(int ga) {
if (((SnakeCell)snakes.elementAt(0)).x > boardWidth + boardX - cellRect + 1) {
isGameOver = true;
}
return ga == RIGHT && currentDirection != LEFT && ((SnakeCell)snakes.elementAt(0)).x <= boardWidth + boardX - cellRect;
}
public void paint(Graphics g) {
cleanBackGround(g);
paintWall(g);
paintScore(g);
paintSnake(g);
paintApplae(g);
if(isGameOver == true) {
g.drawString("Game Over", getWidth()/2, getHeight()/2, Graphics.TOP|Graphics.HCENTER);
}
}
public void cleanBackGround(Graphics g) {
g.setColor(BACKGROUND_COLOR);
g.fillRect(g.getClipX(),g.getClipY(),g.getClipWidth(),g.getClipHeight());
}
public void paintScore(Graphics g) {
g.drawString("Score: "+score, boardX, 2, Graphics.TOP|Graphics.LEFT);
}
public void paintWall(Graphics g) {
g.setColor(WALL_COLOR);
g.drawRect(boardX-boardWall,boardY-boardWall,boardWidth+boardWall*2,boardHeight+boardWall);
}
public void paintApplae(Graphics g) {
g.setColor(APPLE_COLOR);
g.fillArc(appleX, appleY, cellRect, cellRect, 0, 360);
}
public void paintSnake(Graphics g) {
g.setColor(SNAKE_COLOR);
for(int i = 0;i < snakeLength;i++) {
g.fillRect(((SnakeCell)snakes.elementAt(i)).x,
((SnakeCell)snakes.elementAt(i)).y, cellRect, cellRect);
}
}
public void run() {
while(true) {
try {
if(isGameOver == false) {
Thread.sleep(gameSpeed);
this.moveSnake(currentDirection);
this.repaint();
}
else {
this.addCommand(restartCommand);
}
} catch (Exception e) {
}
}
}
public void setRestartCommand(Command restartCommand) {
this.restartCommand = restartCommand;
}
}
public class SnakeBite extends MIDlet implements CommandListener {
private Display display;
private BoardCanvas boardCanvas;
private StartCanvas startCanvas;
private Command exitCommand;
private Command startCommand;
private Command restartCommand;
public SnakeBite() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.EXIT, 1);
startCommand = new Command("Start", Command.SCREEN, 1);
restartCommand = new Command("Restart", Command.SCREEN, 1);
startCanvas = new StartCanvas();
boardCanvas = new BoardCanvas();
boardCanvas.setRestartCommand(restartCommand);
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) {
new Thread(boardCanvas).start();
display.setCurrent(boardCanvas);
} else if(c == restartCommand) {
boardCanvas.newGame();
display.setCurrent(boardCanvas);
boardCanvas.removeCommand(restartCommand);
}
}
}










