java贪吃蛇

package com.cn;

public class TestSnake {

	public static void main(String[] args) {
		MyFrame f=new MyFrame();
		f.setTitle("贪吃蛇小程序");
		f.setBounds(100,200, 810, 450);
		f.setVisible(true);
		f.setResizable(false);
		
	}
}


 

package com.cn;

class Node {
		private int x;
		private int y;
		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;
		}
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + x;
			result = prime * result + y;
			return result;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Node other = (Node) obj;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}
		@Override
		public String toString() {
			return "Node [x=" + x + ", y=" + y + "]";
		}
		
}


 

package com.cn;

import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

public class Snake {

	ArrayList<Node> panel=new ArrayList<Node>();//墙
	ArrayList<Node> body=new ArrayList<Node>();//蛇的身体
	ArrayList<Node> food1=new ArrayList<Node>();//食物
	Node food=new Node(13,21);
	private int lastFX=KeyEvent.VK_LEFT;
	int fx,fy;
	public void createPanel(){
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 40; j++) {
				if(i==0||i==19||j==0||j==39){
					panel.add(new Node(i,j));
				}
			}
		}
	}
	public void createFood(){
		Random rd=new Random();
		while(body.contains(food)){
			int x=rd.nextInt(15)+1;
			int y=rd.nextInt(38)+1;
			food=new Node(x,y);
		}
	}
	public void createBody(){
		body.add(new Node(8,8));
		body.add(new Node(8,9));
		body.add(new Node(9,9));
		
	}
	public Snake(){
		createPanel();
		createBody();
	}
	public boolean move(){
		Node node=body.get(0);
		switch(lastFX){
			case KeyEvent.VK_UP:
				body.add(0,new Node(node.getX()-1,node.getY()));
				break;
			case KeyEvent.VK_LEFT:
				body.add(0,new Node(node.getX(),node.getY()-1));
				break;
			case KeyEvent.VK_DOWN:
				body.add(0,new Node(node.getX()+1,node.getY()));
				break;
			case KeyEvent.VK_RIGHT:
				body.add(0,new Node(node.getX(),node.getY()+1));
				break;
				default:
					body.add(0,new Node(node.getX(),node.getY()-1));
		}
		Node header=body.get(0);
		if(header.equals(food)){
			createFood();
		}else{
			body.remove(body.size()-1);
		}
		if(panel.contains(header)){
			return false;
		}
		for (int i = 1; i < body.size(); i++) {
			if(body.get(i).equals(header)){
				return false;
			}
		}
		
		return true;
	}
	public void move(int keycode){
		this.lastFX=keycode;
		
	}
}


 

package com.cn;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MyFrame extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Snake snake=new Snake();
	boolean flag=false,isAlive=true;
	class MyPanel extends JPanel{
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		@Override
		public void paint(Graphics g) {
			super.paint(g);
			for (int i = 0; i < 20; i++) {
				for (int j = 0; j <40; j++) {
					
					if(snake.body.contains(new Node(i,j))){
						g.setColor(Color.green);
						g.fill3DRect(20*j, 20*i, 20,20, true);
					}
					if(snake.food.equals(new Node(i,j))){
						g.setColor(Color.green);
						g.fill3DRect(20*j, 20*i, 20,20, true);
					}
					if(snake.panel.contains(new Node(i,j))){//确保墙在窗体里面;
						g.setColor(Color.red);
						g.fill3DRect(20*j, 20*i, 20,20, true);
					}
				}
			}
		}
	}
	public MyFrame(){
		final MyPanel panel=new MyPanel();
		addKeyListener(new KeyAdapter() {
			
			@Override
			public void keyPressed(KeyEvent k) {
				int lastFX;
				switch(k.getKeyCode()){
				case KeyEvent.VK_UP:
					lastFX=KeyEvent.VK_UP;
					break;
				case KeyEvent.VK_LEFT:
					lastFX=KeyEvent.VK_LEFT;
					break;
				case KeyEvent.VK_DOWN:
					lastFX=KeyEvent.VK_DOWN;
					break;
				case KeyEvent.VK_RIGHT:
					lastFX=KeyEvent.VK_RIGHT;
					break;
					default:
						lastFX=KeyEvent.VK_LEFT;
						break;
				}
				snake.move(lastFX);
				
			}
		});
		
		getContentPane().add(panel);
		final Timer timer=new Timer();
		timer.schedule(new TimerTask(){
			
			
			@Override
			public void run() {
			
				if(isAlive){
					panel.repaint();
					isAlive=snake.move();
				}
				else{
					JOptionPane.showMessageDialog(panel,"撞到墙啦,GAME OVER!!");
					timer.cancel();
				}
			}
		},0,200);
		
			
		
	}

	
}


 

效果图如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值