자바, 뱀 잡 아 먹 기 게임 실현
자바 와 같은 대상 을 대상 으로 하 는 프로 그래 밍 언어 에 있어 서 프로그램 을 작성 하기 전에 반드시 해당 하 는 분석 을 해 야 합 니 다. 어떤 대상 을 연구 해 야 하 는 지, 이 대상 들 중 어떤 속성 과 방법 이 있 는 지 분석 해 야 합 니 다.
뱀 을 탐식 하 는 작은 게임 에는 뱀, 음식, 게임 컨트롤 러, 게임 패 널 등 몇 가지 대상 이 포함 된다.
다음은 이 대상 들 에 어떤 속성 과 방법 이 포함 되 어 있 는 지 분석 해 야 한다.
먼저 뱀 이라는 대상 을 분석한다.
뱀 이 가지 고 있 는 속성 은 뱀의 몸, 뱀의 몸 색깔, 뱀의 몸 길이, 뱀의 생명, 뱀의 운동 방향 이다.
뱀 을 탐식 하 는 작은 게임 에 서 는 뱀 이 각 방면 의 운동 을 통 해 음식 을 찾 아 먹고 몸 을 늘 려 게임 의 정상 적 인 진행 을 보장 한다.
이때 뱀 이라는 대상 에는 뱀 이 움 직 이 는 방법, 뱀 이 먹 는 방법 등 몇 가지 방법 이 존재 한다.
그리고 음식 이라는 대상 을 분석한다.
음식 은 색깔 과 위치 라 는 두 가지 속성 과 음식 을 만 드 는 방법 이 있다.
초보적인 코드 계획 은 이렇게 될 것 이다.
//Snake.java
package org.sysit.game.snake;
import java.awt.Color;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
public class Snake {
private int length;
private Color color;
private List body = new ArrayList();
private boolean life = true;
/**
*
* @author ZHANGBING
*
*/
enum dir{
UP, RIGHT, DOWN, LEFT
};
private dir snakeDir;
/**
*
* @param length
*/
public Snake(int length) {
}
public void move(){
}
/**
*
* @param head
* @return
*/
public boolean isSnakeEatFood(Point head){
return true;
}
}
//Food.java
package org.sysit.game.snake;
import java.awt.Color;
import java.awt.Point;
public class Food {
private Color color;
private Point location;
/**
*
* @param snake
* @return Point
*/
public Point setLocation(Snake snake) {
return null;
}
}
다음은 각 방법 에 실 현 된 코드 를 추가 하 는 것 입 니 다.
뱀 이라는 대상 에서 먼저 뱀 을 초기 화 하 는 코드 를 완성 해 야 합 니 다. 여기 서 저 는 점 의 형식 으로 뱀의 몸의 모든 절 을 뱀 몸의 List 에 저장 합 니 다.
/**
*
* @param length
*/
public Snake(int length) {
this.length = length;
this.color = Color.YELLOW;
for(int i = length ; i > 0 ; i--){
body.add(new Point(0, i-1));
}
snakeDir = dir.RIGHT;
}
그 다음 에 가장 핵심 적 인 것 은 뱀 이 이동 하 는 방법 이 라 고 할 수 있 습 니 다. 제 코드 는 아직도 개선 해 야 할 부분 이 많 습 니 다. 제 방법 은 여러 가지 조작 을 한 방법 에 통합 시 키 는 것 입 니 다. 여러분 과 자신 이 수정 하 는 것 입 니 다.
public void move(){
Point head = new Point(body.get(0).x, body.get(0).y);
switch(snakeDir){
case UP:
head.x --;
break;
case DOWN:
head.x ++;
break;
case LEFT:
head.y --;
break;
case RIGHT:
head.y ++;
break;
}
int canvas_width = SysConfig.CANVAS_WIDTH / SysConfig.STONE_WIDTH - 2;
int canvas_height = SysConfig.CANVAS_HEIGHT/ SysConfig.STONE_HEIGHT - 2;
if( head.x < 0 || head.x > canvas_height-1 || head.y < 0 || head.y > canvas_width-1 ){
life = false; // die
JOptionPane.showMessageDialog(null, " ");
return;
} else {
body.add(0, head);
if(isSnakeEatFood(head)){
//
body.remove(body.size()-1);
} else {
getFood().setLocation(this);
setScore(getScore()+10);
}
for(int i = 1 ; i <= body.size()-1 ; i++){
Point point = body.get(i);
if(point.x == head.x && point.y == head.y){
life = false;
JOptionPane.showMessageDialog(null, " ~ ");
//System.exit(0);
return;
}
}
}
}
/**
*
* @param head
* @return
*/
public boolean isSnakeEatFood(Point head){
if(this.food.getLocation().x == head.x && this.food.getLocation().y == head.y)
return false;
return true;
}
그리고 음식 이라는 대상 에서 우리 가 실현 해 야 할 것 은 음식 을 주장 하 는 방법 밖 에 없다.
/**
*
* @param snake
* @return Point
*/
public Point setLocation(Snake snake) {
location = new Point();
int canvas_width = SysConfig.CANVAS_WIDTH / SysConfig.STONE_WIDTH - 2;
int canvas_height = SysConfig.CANVAS_HEIGHT/ SysConfig.STONE_HEIGHT - 2;
int temp = (int) (Math.random() * 1000) ;
int rand = temp% (canvas_width * canvas_height - snake.getBody().size()) + 1;
//int rand = temp% 50 + 1;
boolean flag ;
for(int i = 0 ; i < canvas_height ; i++){
for(int j = 0 ; j < canvas_width ; j++){
flag = true;
for(Point point : snake.getBody()){
//System.out.println("point: ("+ point.x + "," + point.y + ")");
if(i == point.x && j == point.y){
flag = false;
break;
}
}
if(flag){
rand--;
if(rand == 0){
location.x = i;
location.y = j;
return location;
}
}
}
}
return null;
}
다른 남 은 조작 은 모두 뱀 과 음식 을 연결 시 키 는 코드 이다.
//GameController.java
package org.sysit.game.snake;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.Timer;
public class GameController {
private Ground ground;
private Snake snake ;
private Food food ;
private Timer timer;
private boolean pause = false;
private int score = 0;
private JTextField txtScore;
public JTextField getTxtScore() {
return txtScore;
}
public void setTxtScore(JTextField txtScore) {
this.txtScore = txtScore;
}
public GameController(final Snake snake, Food food, final Ground ground) {
this.snake = snake;
this.food = food;
this.ground = ground;
timer = new Timer(200, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(snake.isLife()){
snake.move();
if(snake.isLife()){
score = snake.getScore();
getTxtScore().setText(score + "");
ground.repaint();
} else {
timer.stop();
}
}
}
});
}
/**
*
*/
public void init(){
getTxtScore().setText("0");
}
/**
*
*/
public void startGame(){
init();
timer.start();
ground.requestFocus();
}
/**
*
*/
public void pauseGame() {
if(!pause){
timer.stop();
pause = true;
}
ground.requestFocus();
}
/**
*
*/
public void resumeGame() {
if(pause){
timer.restart();
pause = false;
}
ground.requestFocus();
}
public boolean isPause() {
return pause;
}
public void setPause(boolean pause) {
this.pause = pause;
}
}
//Ground.java
package org.sysit.game.snake;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.List;
import org.sysit.game.snake.Snake.dir;
public class Ground extends Canvas {
private Snake snake;
private Food food;
private Image iBuffer;
public Ground() {
setBounds(0, 0, SysConfig.CANVAS_WIDTH, SysConfig.CANVAS_HEIGHT);
setBackground(Color.BLACK);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch(keyCode){
case KeyEvent.VK_UP:
snake.setSnakeDir(dir.UP);
break;
case KeyEvent.VK_DOWN:
snake.setSnakeDir(dir.DOWN);
break;
case KeyEvent.VK_LEFT:
snake.setSnakeDir(dir.LEFT);
break;
case KeyEvent.VK_RIGHT:
snake.setSnakeDir(dir.RIGHT);
break;
}
}
});
}
public Snake getSnake() {
return snake;
}
public void setSnake(Snake snake) {
this.snake = snake;
}
public Food getFood() {
return food;
}
public void setFood(Food food) {
this.food = food;
}
/**
*
*/
@Override
public void update(Graphics g) {
if(iBuffer == null){
iBuffer = createImage(this.getSize().width, this.getSize().height);
}
//if(gBuffer == null){
Graphics gBuffer = iBuffer.getGraphics();
//}
gBuffer.setColor(getBackground());
gBuffer.fillRect(0, 0, this.getSize().width, this.getSize().height);
paint(gBuffer);
gBuffer.dispose();
g.drawImage(iBuffer, 0, 0, this);
}
/**
*
*/
public void drawWall(Graphics g) {
g.setColor(Color.GRAY);
int canvas_width = SysConfig.CANVAS_WIDTH / SysConfig.STONE_WIDTH;
int canvas_height = SysConfig.CANVAS_HEIGHT / SysConfig.STONE_WIDTH;
for (int i = 0; i < canvas_width ; i++) {
g.fill3DRect(i * SysConfig.STONE_WIDTH, 0, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
for (int i = 0; i < canvas_width ; i++) {
g.fill3DRect(i * SysConfig.STONE_WIDTH, SysConfig.CANVAS_HEIGHT
- SysConfig.STONE_HEIGHT, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
for (int i = 0; i < canvas_height ; i++) {
g.fill3DRect(0, i * SysConfig.STONE_WIDTH, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
for (int i = 0; i < canvas_height ; i++) {
g.fill3DRect(SysConfig.CANVAS_WIDTH - SysConfig.STONE_WIDTH, i
* SysConfig.STONE_WIDTH, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
}
/**
*
*/
public void drawGrass(Graphics g) {
g.setColor(Color.DARK_GRAY);
for (int i = 1; i < SysConfig.CANVAS_WIDTH / SysConfig.STONE_WIDTH - 1; i++) {
for (int j = 1; j < SysConfig.CANVAS_HEIGHT
/ SysConfig.STONE_HEIGHT - 1; j++) {
g.fill3DRect(i * SysConfig.STONE_WIDTH, j
* SysConfig.STONE_HEIGHT, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
}
}
/**
*
*/
public void drawFood(Graphics g) {
Point point = getFood().getLocation();
//System.out.println("location : (" + point.x + "," +point.y +")");
g.setColor(getFood().getColor());
g.fill3DRect(( point.y + 1 ) * SysConfig.STONE_WIDTH, (point.x + 1)* SysConfig.STONE_HEIGHT, SysConfig.STONE_WIDTH,SysConfig.STONE_HEIGHT, true);
}
/**
*
*/
public void drawSnake(Graphics g) {
g.setColor(getSnake().getColor());
List body = getSnake().getBody();
for (Point point : body) {
g.fill3DRect((point.y + 1) * SysConfig.STONE_WIDTH, (point.x + 1)
* SysConfig.STONE_HEIGHT, SysConfig.STONE_WIDTH,
SysConfig.STONE_HEIGHT, true);
}
}
@Override
public void paint(java.awt.Graphics g) {
drawWall(g);
drawGrass(g);
//snake.move();
if(snake != null){
drawSnake(g);
}
if(food != null){
drawFood(g);
}
};
}
//MainFrame.java
package org.sysit.game.snake;
import java.awt.BorderLayout;
public class MainFrame extends JFrame {
private JButton start;
private JButton pause;
private JPanel panel;
private JPanel showScore;
private JLabel lblNewLabel;
private JTextField txtScore;
public MainFrame() {
super(" ");
getContentPane().setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Ground ground = new Ground();
//controller.setGround(ground);
Snake snake = new Snake(3);
ground.setSnake(snake);
Food food = new Food();
ground.setFood(food);
snake.setFood(food);
food.setLocation(snake);
final GameController controller = new GameController(snake, food, ground);
JPanel control = new JPanel();
start = new JButton(" ");
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
controller.startGame();
pause.setEnabled(true);
}
});
start.setSize(100, 50);
pause = new JButton(" ");
pause.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(controller.isPause()){
pause.setText(" ");
controller.resumeGame();
}else{
pause.setText(" ");
controller.pauseGame();
}
}
});
pause.setEnabled(false);
pause.setSize(100, 50);
control.add(start);
control.add(pause);
add(ground, BorderLayout.CENTER);
add(control, BorderLayout.SOUTH);
pack();
panel = new JPanel();
control.add(panel);
panel.setLayout(null);
showScore = new JPanel();
getContentPane().add(showScore, BorderLayout.NORTH);
showScore.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
lblNewLabel = new JLabel("\u5206\u6570 : ");
showScore.add(lblNewLabel);
txtScore = new JTextField();
showScore.add(txtScore);
txtScore.setColumns(10);
txtScore.setEditable(false);
controller.setTxtScore(txtScore);
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dime = tool.getScreenSize();
int screenWidth = dime.width;
int screenHeight = dime.height;
int frameWidth = SysConfig.CANVAS_WIDTH + 6;
int frameHeight = SysConfig.CANVAS_HEIGHT + 94;
setBounds((screenWidth - frameWidth)/2, (screenHeight - frameHeight)/2, frameWidth, frameHeight);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
전체 코드:http://download.csdn.net/detail/zhang__bing/4377159
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STL 학습노트(6) 함수 객체모방 함수는 모두pass-by-value이다 함수 대상은 값에 따라 전달되고 값에 따라 되돌아오기 때문에 함수 대상은 가능한 한 작아야 한다(대상 복사 비용이 크다) 함수 f와 대상 x, x 대상에서 f를 호출하면:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.