Java贪吃蛇程序

自学Java的新手,为了熟悉集合类(vector),线程,awt而做的练习。

一共四各类,分别附上代码:


1.GameStart,游戏入口,图形化界面,键盘监听,创建线程

package zcc_2;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

public class GameStart {
	
	JFrame jf=null;
	MyPanel mp=null;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GameStart newGame=new GameStart();
	}
	
	public GameStart(){
		jf=new JFrame();
		mp=new MyPanel();
		Thread PanelThr=new Thread(mp);
		
		jf.addKeyListener(mp);
		PanelThr.start();
		
		mp.setBackground(Color.DARK_GRAY);
		jf.add(mp);
		
		jf.setSize(550, 450);
		jf.setTitle("贪吃蛇");
		jf.setLocation(350, 130);
		jf.setResizable(false);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

class MyPanel extends JPanel implements KeyListener,Runnable{
	
	Snake snake=null;
	Apple apple=null;
	
	@Override
	public void paint(Graphics g){
		super.paint(g);
		
		//画苹果
				g.setColor(Color.red);
				if(apple.getAlive()==true){
					g.fillOval(apple.getX(), apple.getY(), snake.snakeBody.get(0).getSize(), snake.snakeBody.get(0).getSize());
				}else if(snake.snakeBody.size()>=220176){
					System.out.println("胜利!");
					return;
				}else{
					boolean temp=true;
					do {
						apple = new Apple();
						for (int i = 0; i < snake.snakeBody.size(); i++) {
							if (apple.getX() == snake.snakeBody.get(i).getX()
									&& apple.getY() == snake.snakeBody.get(i).getY()) {
								temp = false;
								break;
							}
						}
					} while (temp==false);
				}
		
		//画蛇
		g.setColor(Color.cyan);
		for(int i=1;i<snake.snakeBody.size();i++){
			g.fill3DRect(snake.snakeBody.get(i).getX(), 
					snake.snakeBody.get(i).getY(), 
					snake.snakeBody.get(i).getSize(), snake.snakeBody.get(i).getSize(), false);
		}
		g.setColor(Color.white);
		g.fill3DRect(snake.snakeBody.get(0).getX(), 
				snake.snakeBody.get(0).getY(), 
				snake.snakeBody.get(0).getSize(), snake.snakeBody.get(0).getSize(), false);

			
	}
	
	public MyPanel(){
		super();
		snake=new Snake(12);
		apple=new Apple();
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode()==KeyEvent.VK_UP){
			if(snake.getChaoxiang()!='D') snake.setChaoxiang('U');
		}else if(e.getKeyCode()==KeyEvent.VK_DOWN){
			if(snake.getChaoxiang()!='U') snake.setChaoxiang('D');
		}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
			if(snake.getChaoxiang()!='R') snake.setChaoxiang('L');
		}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			if(snake.getChaoxiang()!='L') snake.setChaoxiang('R');
		}
		
		//System.out.println(apple.getX()+","+apple.getY());
		//System.out.println(snake.snakeBody.get(0).getX()+","+snake.snakeBody.get(0).getY());
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		while (true) {
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			//移动
			switch(snake.getChaoxiang()){
			case 'U':
				if (snake.moveUp()==-1) {
					return;
				}
				break;
			case 'D':
				if (snake.moveDown()==-1) {
					return;
				}
				break;
			case 'L':
				if (snake.moveLeft()==-1) {
					return;
				}
				break;
			case 'R':
				if (snake.moveRight()==-1) {
					return;
				}
				break;
			}
			
			//判定苹果是否被吃了
			if (apple.getAlive()==true
					&& apple.getX()== snake.snakeBody.get(01).getX()
					&& apple.getY()== snake.snakeBody.get(0).getY()) {
				snake.eat();
				apple.eaten();
			}
			
			//重绘
			this.repaint();
		}
	}
}


2.Body,蛇的每一节

package zcc_2;

public class Body {
	int x;
	int y;
	int size;
	
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
	public Body(int x,int y){
		this.x=x;
		this.y=y;
		this.size=10;
	}
}


3.Snake,蛇

package zcc_2;

import java.util.*;

public class Snake {
	Vector<Body> snakeBody=null;
	char chaoxiang;
	
	public char getChaoxiang() {
		return chaoxiang;
	}

	public void setChaoxiang(char chaoxiang) {
		this.chaoxiang = chaoxiang;
	}

	public Snake(int lenght){
		snakeBody=new Vector<Body>();
		
		for(int i=0;i<lenght;i++){
			Body body=new Body(280+i*10,230);
			snakeBody.add(body);
		}
		
		chaoxiang='L';
	}
	
	public int moveUp(){
		if(snakeBody.get(0).getY()>0 && this.selfkillJudge()==0){
			Body temp=new Body(snakeBody.get(0).getX(),snakeBody.get(0).getY()-snakeBody.get(0).getSize());
			snakeBody.remove(snakeBody.size()-1);
			snakeBody.add(0, temp);
			this.chaoxiang='U';
		}else{
			System.out.println("Game Over!");
			return -1;
		}
		return 0;
	}
	
	public int moveDown(){
		if (snakeBody.get(0).getY()<410 && this.selfkillJudge()==0) {
			Body temp = new Body(snakeBody.get(0).getX(), snakeBody.get(0)
					.getY() + snakeBody.get(0).getSize());
			snakeBody.remove(snakeBody.size() - 1);
			snakeBody.add(0, temp);
			this.chaoxiang = 'D';
		}else{
			System.out.println("Game Over!");
			return -1;
		}
		return 0;
	}
	
	public int moveLeft(){
		if (snakeBody.get(0).getX()>0 && this.selfkillJudge()==0) {
			Body temp = new Body(snakeBody.get(0).getX()
					- snakeBody.get(0).getSize(), snakeBody.get(0).getY());
			snakeBody.remove(snakeBody.size() - 1);
			snakeBody.add(0, temp);
			this.chaoxiang = 'L';
		}else{
			System.out.println("Game Over!");
			return -1;
		}
		return 0;
	}
	
	public int moveRight(){
		if (snakeBody.get(0).getX()<530 && this.selfkillJudge()==0) {
			Body temp = new Body(snakeBody.get(0).getX()
					+ snakeBody.get(0).getSize(), snakeBody.get(0).getY());
			snakeBody.remove(snakeBody.size() - 1);
			snakeBody.add(0, temp);
			this.chaoxiang = 'R';
		}else{
			System.out.println("Game Over!");
			return -1;
		}
		return 0;
	}
	
	public void eat(){
		Body newBody=new Body(snakeBody.get(snakeBody.size()-1).getX(),snakeBody.get(snakeBody.size()-1).getY());
		snakeBody.add(newBody);
	}
	
	public int selfkillJudge(){
		
		for(int i=1;i<this.snakeBody.size();i++){
			if(this.snakeBody.get(i).getX()==this.snakeBody.get(0).getX()
					&& this.snakeBody.get(i).getY()==this.snakeBody.get(0).getY()){
				return 1;
			}
		}
		
		return 0;
	}
}


4.Apple,蛇吃的食物

package zcc_2;

import java.util.*;

public class Apple {
	int x;
	int y;
	boolean alive;
	static Random random=new Random();
	
	public Apple(){
		this.x=0;
		this.y=0;
		this.x=Math.abs(random.nextInt()%35+1)*10;
		this.y=Math.abs(random.nextInt()%41+1)*10;
		this.alive=true;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public boolean getAlive() {
		return alive;
	}

	public void setAlive(boolean alive) {
		this.alive = alive;
	}
	
	public void eaten(){
		this.alive=false;
	}
}


为了方便今后可能的代码扩充(虽然我并不打算扩充),这次的代码对所有属性进行了封装。

希望我的代码能对新人有所帮助,欢迎指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值