자바, 뱀 잡 아 먹 기 게임 실현

12765 단어 학습 노트Java
자바 GUI 프로 그래 밍 을 처음 배우다.그래서 뱀 놀 이 를 해서 공부 하 는 것 을 연습 해 보 세 요.
 
자바 와 같은 대상 을 대상 으로 하 는 프로 그래 밍 언어 에 있어 서 프로그램 을 작성 하기 전에 반드시 해당 하 는 분석 을 해 야 합 니 다. 어떤 대상 을 연구 해 야 하 는 지, 이 대상 들 중 어떤 속성 과 방법 이 있 는 지 분석 해 야 합 니 다.
 
뱀 을 탐식 하 는 작은 게임 에는 뱀, 음식, 게임 컨트롤 러, 게임 패 널 등 몇 가지 대상 이 포함 된다.
다음은 이 대상 들 에 어떤 속성 과 방법 이 포함 되 어 있 는 지 분석 해 야 한다.
먼저 뱀 이라는 대상 을 분석한다.
         뱀 이 가지 고 있 는 속성 은 뱀의 몸, 뱀의 몸 색깔, 뱀의 몸 길이, 뱀의 생명, 뱀의 운동 방향 이다.
         뱀 을 탐식 하 는 작은 게임 에 서 는 뱀 이 각 방면 의 운동 을 통 해 음식 을 찾 아 먹고 몸 을 늘 려 게임 의 정상 적 인 진행 을 보장 한다.
         이때 뱀 이라는 대상 에는 뱀 이 움 직 이 는 방법, 뱀 이 먹 는 방법 등 몇 가지 방법 이 존재 한다.
그리고 음식 이라는 대상 을 분석한다.
         음식 은 색깔 과 위치 라 는 두 가지 속성 과 음식 을 만 드 는 방법 이 있다.
초보적인 코드 계획 은 이렇게 될 것 이다.
//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

좋은 웹페이지 즐겨찾기