计算机软件实习项目二

学习目标:

贪吃蛇游戏开发

学习内容:

 实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,
上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点。
 “蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。
 为游戏设计友好的交互界面;例如欢迎界面,游戏界面,
游戏结束界面。要有开始键、暂停键和停止退出的选项。
 对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐
等拓展元素。

学习产出:

package snake;
import java.awt.;
import java.awt.event.
;
import javax.swing.*;
import java.util.LinkedList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class MainFrame extends JFrame{
private Snake snake;
private Timer timer;
private JPanel JPanel;
private Node food;

public MainFrame() /*throws HeadlessException*/{
	initFrame();
	initGamePalge();
	initSnake();
	initFood();
	initTimer();		
	setKeyListener();
}

private void initFood() {
	food=new Node();
	food.random();
}

private void setKeyListener() {
	addKeyListener(new KeyAdapter(){
		public void keyPressed(KeyEvent e) {
			switch(e.getKeyCode()) {
			case KeyEvent.VK_UP:
				if(snake.getDirection()!=Direction.DOWN) {
				snake.setDirection(Direction.UP);
				}
			    break;
			case KeyEvent.VK_DOWN:
				if(snake.getDirection()!=Direction.UP) {
				snake.setDirection(Direction.DOWN);
				}
		        break;
			case KeyEvent.VK_LEFT:
				if(snake.getDirection()!=Direction.RIGHT) {
				snake.setDirection(Direction.LEFT);
				}
		        break;
			case KeyEvent.VK_RIGHT:
				if(snake.getDirection()!=Direction.LEFT) {
				snake.setDirection(Direction.RIGHT);
				}
		        break;
			}
		}
		
	});
}

private void initTimer() {
	timer=new Timer();
	
	TimerTask timerTask=new TimerTask() {
		public void run() {
			snake.move();
			Node head=snake.getBody().getFirst();
			if(head.getX()==food.getX()&&head.getY()==food.getY()) {
				snake.eat(food);
				food.random();
			}
			JPanel.repaint();
		}
	};
	
	timer.scheduleAtFixedRate(timerTask,0,100);
}

private void initSnake() {
	snake=new Snake();
}

private void initGamePalge() {
	JPanel JPanel=new JPanel() {
		public void paint(Graphics g) {
			g.clearRect(0, 0, 600, 600);
			for(int i=0;i<40;i++) {
				g.drawLine(0, i*15, 600, i*15);					
			}
			
			for(int i=0;i<40;i++) {
				g.drawLine(i*15, 0, i*15, 600);
			}
			
			LinkedList<Node> body=snake.getBody();
			for(Node node:body) {
				g.fillRect(node.getX()*15,node.getY()*15,15,15);
			}
			
			g.fillRect(food.getX()*15, food.getY()*15,15,15);
			
		}
	};
	add(JPanel);
}

private void initFrame() {
    setTitle("贪吃蛇");
	setSize(640,620);
	setLocation(400,400);
	setResizable(false);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
}


class Node {
	private int x;
	private int y;
	
	public Node() {		
	}
	
	public Node(int x,int y) {
		this.x=x;
		this.y=y;
	}
	
	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 void random(){
		Random r=new Random();
		this.x=r.nextInt(40);
		this.y=r.nextInt(40);
	}	
}


class Snake {
	private LinkedList<Node> body;
	private Direction direction=Direction.LEFT;
	private boolean isLiving=true;
	
	public Snake() {
		initSnake();
	}

	private void initSnake() {
		body=new LinkedList<>();
		body.addFirst(new Node(18,20));
		body.addFirst(new Node(19,20));
		body.addFirst(new Node(20,20));
		body.addFirst(new Node(21,20));		
	}
	
	public void move() {
	if(isLiving) {
		Node head=body.getFirst();
		switch(direction) {
		case UP:
			body.add(new Node(head.getX(),head.getY()-1));
			break;
		case DOWN:
			body.add(new Node(head.getX(),head.getY()+1));
			break;
		case LEFT:
			body.add(new Node(head.getX()-1,head.getY()));
			break;
		case RIGHT:
			body.add(new Node(head.getX()+1,head.getY()));
			break;
		}
			
		body.removeLast();
		
		head=body.getFirst();
		if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40) {
			isLiving=false;
		}
		
		for(int i=1;i<body.size();i++) {
			Node node=body.get(i);
			if(head.getX()==node.getX()&&head.getY()==node.getY()) {
				isLiving=false;
			}
		}
	    }
	}
	
	public LinkedList<Node> getBody(){
		return body;
	}
	
	public void  setBody(LinkedList<Node> body){
		this.body=body;
	}
	
	public Direction getDirection() {
		return direction;
	}
	
	public void setDirection(Direction direction) {
		this.direction=direction;
	}
	
	public void eat(Node food) {
    	Node head=body.getFirst();
		switch(direction) {
		case UP:
			body.add(new Node(head.getX(),head.getY()-1));
			break;
		case DOWN:
			body.add(new Node(head.getX(),head.getY()+1));
			break;
		case LEFT:
			body.add(new Node(head.getX()-1,head.getY()));
			break;
		case RIGHT:
			body.add(new Node(head.getX()+1,head.getY()));
			break;
		}
    }
}


enum Direction {
	UP,DOWN,LEFT,RIGHT
}

public static void main(String[] args) {
	new MainFrame().setVisible(true);
}

}

运用节点控制蛇头移动,食物生成和蛇体增长,设置撞墙死亡和吃自己死亡,通过repaint重绘画布,通过定时更新,eclipseTime模块运行出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值