java swing 贪吃蛇 自己没事写的 有问题反馈


package com.snake02.ui;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.Random;

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

public class SnakeFrame extends JFrame implements KeyListener {
		/**
		 * ui---面板
		 * 空格键退出程序
		 * 上下左右键控制方向
		 * 界面有点小,多包涵,改天有空再写个大的 O(∩_∩)O
		 * List 以特定次序来持有元素,可重复元素.
		 * Set 无法拥有重复元素,内部排序.
		 * Map 保存key-value值
		 */
	private static final long serialVersionUID = 1L;

	public SnakeFrame(){
		super();
		this.setTitle("我的小游戏---贪吃蛇");
		this.setSize(400, 400);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		SnakePanel sp = new SnakePanel();
		Thread th = new Thread(sp);
		th.start();
		this.add(sp);
		this.addKeyListener(this);
		this.setUndecorated(true);
		this.setVisible(true);
		
	}

	public static void main(String[] args) {
		new SnakeFrame();
	}
	
	private int id =0 ; 
	private int x = 100 ; 
	private int y = 100 ; 
	private int w = 4 ; 
	private int h = 4 ;
	
	private String current_direction = "DOWN" ;
	
	private Snake snake = new Snake() ;
	
	private LinkedList<SnakeElement> snakeElements = new LinkedList<SnakeElement>();
	
	
	class SnakePanel extends JPanel implements Runnable{
		/**
		 * ui---面板
		 * 空格键退出程序
		 * 上下左右键控制方向
		 * 界面有点小,多包涵,改天有空再写个大的 O(∩_∩)O
		 * List 以特定次序来持有元素,可重复元素.
		 * Set 无法拥有重复元素,内部排序.
		 * Map 保存key-value值
		 */
		private static final long serialVersionUID = 1L;

		public SnakePanel() {
			this.setBackground(Color.PINK);
			for (int i = 1; i < 6 ; i++) {
				snakeElements.add(
						new SnakeElement(
								id+i ,
								x , 
								y + 4 * i, 
								w , 
								h 
						)
				);
			}
			snake.setSnakeElements(snakeElements);
			snake.setCurrent_direction(current_direction);
			
		}

		
		private int bean_x = 124; 
		private int bean_y = 124 ;
		private boolean bean_status = true ;
		private Bean bean = new Bean(bean_x , bean_y , w , h , bean_status ); 
		
		public void createNewBean(){
			while(true){
				bean_x = new Random().nextInt(400) ;
				bean_y = new Random().nextInt(400) ;
//				System.out.println(bean_x +"---before----"+ bean_y );
				
				if( bean_x % 4 == 0 && bean_y % 4 == 0  ){
//					System.out.println(bean_x +"---after----"+ bean_y );
					break ;
				}
			}
			
			bean_status = true ;
			bean = new Bean(bean_x , bean_y , w , h , bean_status );
		}
		
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			for (int i = 0 ; i < snake.getSnakeElements().size() ; i ++ ) {
				if(snake.getSnakeElements().get(i).getId()==snakeElements.getLast().getId()){
					g.setColor(Color.red);
					g.drawRect(snake.getSnakeElements().get(i).getX(),snake.getSnakeElements().get(i).getY(), w, h);
				}else{
					g.setColor(Color.black);
					g.drawRect(snake.getSnakeElements().get(i).getX(), snake.getSnakeElements().get(i).getY(), w, h);
				}
			}
			if(!bean.getBean_status()){
				this.createNewBean();
				for (int i = 0; i < snake.getSnakeElements().size(); i++) {
					if(
							snake.getSnakeElements().get(i).getX()==bean.getBean_x() && 
							snake.getSnakeElements().get(i).getY()==bean.getBean_y() 
					){
						bean.setBean_status(false);
					}
				}
				g.drawRect(bean.getBean_x(), bean.getBean_y(), bean.getBean_w(), bean.getBean_h()) ;
			}else{
				g.drawRect(bean.getBean_x(), bean.getBean_y(), bean.getBean_w(), bean.getBean_h()) ;
			}
		}

		@Override
		public void run() {
//			int new_X = snake.getSnakeElements().getLast().getX() ; 
//			int new_Y = snake.getSnakeElements().getLast().getY() ;
			while(true){
				if(snake.getCurrent_direction().equalsIgnoreCase("DOWN")){
//					new_Y = snake.getSnakeElements().getLast().getY()-h ; 
					y = snake.getSnakeElements().getLast().getY();
					if(y == 400){
						y = 0 ;
					}
					snake.getSnakeElements().removeFirst();
					snake.getSnakeElements().addLast(
							new SnakeElement(
									snake.getSnakeElements().getLast().getId()+1,
									snake.getSnakeElements().getLast().getX() , 
									y + 4 , 
									snake.getSnakeElements().getLast().getW() , 
									snake.getSnakeElements().getLast().getH()
											)
							);
				}
				if(snake.getCurrent_direction().equalsIgnoreCase("LEFT")){
//					new_X = snake.getSnakeElements().getLast().getX()-w ;
					x = snake.getSnakeElements().getLast().getX();
					if(x == 0){
						x = 400 ;
					}
					snake.getSnakeElements().removeFirst();
					snake.getSnakeElements().addLast(
							new SnakeElement(
									snake.getSnakeElements().getLast().getId()+1,
									x - 4 , 
									snake.getSnakeElements().getLast().getY() , 
									snake.getSnakeElements().getLast().getW() , 
									snake.getSnakeElements().getLast().getH()
							)
					);
				}
				if(snake.getCurrent_direction().equalsIgnoreCase("UP")){
//					new_Y = snake.getSnakeElements().getLast().getY()-h ;
					y = snake.getSnakeElements().getLast().getY();
					if(y == 0){
						y = 400 ;
					}
					snake.getSnakeElements().removeFirst();
					snake.getSnakeElements().addLast(
							new SnakeElement(
									snake.getSnakeElements().getLast().getId()+1,
									snake.getSnakeElements().getLast().getX() , 
									y - 4 ,
									snake.getSnakeElements().getLast().getW() , 
									snake.getSnakeElements().getLast().getH()
							)
					);
				}
				if(snake.getCurrent_direction().equalsIgnoreCase("RIGHT")){
//					new_Y = snake.getSnakeElements().getLast().getY()+h ;
					x = snake.getSnakeElements().getLast().getX();
					if(x == 400){
						x = 0 ;
					}
					snake.getSnakeElements().removeFirst();
					snake.getSnakeElements().addLast(
							new SnakeElement(
									snake.getSnakeElements().getLast().getId()+1,
									x + 4 ,
									snake.getSnakeElements().getLast().getY() , 
									snake.getSnakeElements().getLast().getW() , 
									snake.getSnakeElements().getLast().getH()
							)
					);
				}
				
				
				if(
						snake.getSnakeElements().getLast().getX() == bean.getBean_x()   && 
						snake.getSnakeElements().getLast().getY() == bean.getBean_y()
				){
						bean.setBean_status(false);
						snake.getSnakeElements().addLast(
								new SnakeElement(
										snake.getSnakeElements().getLast().getId()+1 , 
										bean.getBean_x() ,
										bean.getBean_y() ,
										snake.getSnakeElements().getLast().getW() , 
										snake.getSnakeElements().getLast().getH()  
										
								)
						);
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				repaint();
			}
		}
	}
	
	
//	left 37  
//	up 38
//	right 39
//	down 40	

	@Override
	public void keyPressed(KeyEvent e) {
		if(
				e.getKeyCode()==37 && 
				!snake.getCurrent_direction().equalsIgnoreCase("LEFT")&&
				!snake.getCurrent_direction().equalsIgnoreCase("RIGHT")&&
				snake.getSnakeElements().getFirst().getX()!= 0 
				
		){
			snake.setCurrent_direction("LEFT");
		}
		if(
				e.getKeyCode()==38 && 
				!snake.getCurrent_direction().equalsIgnoreCase("UP")&&
				!snake.getCurrent_direction().equalsIgnoreCase("DOWN")&&
				snake.getSnakeElements().getFirst().getY()!= 0 
				
		){
			snake.setCurrent_direction("UP");
		}
		if(
				e.getKeyCode()==39 && 
				!snake.getCurrent_direction().equalsIgnoreCase("LEFT")&&
				!snake.getCurrent_direction().equalsIgnoreCase("RIGHT")&&
				snake.getSnakeElements().getFirst().getX()!= 400 
				
		){
			snake.setCurrent_direction("RIGHT");
		}
		if(
				e.getKeyCode()==40 && 
				!snake.getCurrent_direction().equalsIgnoreCase("DOWN")&&
				!snake.getCurrent_direction().equalsIgnoreCase("UP")&&
				snake.getSnakeElements().getFirst().getY()!= 400 
				
		){
			snake.setCurrent_direction("DOWN");
		}
		
		
		//delete
		if(e.getKeyCode()==KeyEvent.VK_SPACE){
			System.exit(0);
		}
		
	}
 
	@Override
	public void keyReleased(KeyEvent keyevent) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent keyevent) {
		// TODO Auto-generated method stub
		
	}
	class Bean implements Serializable{


		/**
		 * Bean实体类
		 */
		private static final long serialVersionUID = 1L;
		private int bean_x ; 
		private int bean_y ; 
		private int bean_w ; 
		private int bean_h ;
		private boolean bean_status ;
		
		public Bean() {
			super();
			// TODO Auto-generated constructor stub
		}
		public Bean(int bean_x, int bean_y, int bean_w, int bean_h) {
			super();
			this.bean_x = bean_x;
			this.bean_y = bean_y;
			this.bean_w = bean_w;
			this.bean_h = bean_h;
		}
		
		public boolean getBean_status() {
			return bean_status;
		}
		public void setBean_status(boolean bean_status) {
			this.bean_status = bean_status;
		}
		public int getBean_x() {
			return bean_x;
		}
		public void setBean_x(int bean_x) {
			this.bean_x = bean_x;
		}
		public int getBean_y() {
			return bean_y;
		}
		public void setBean_y(int bean_y) {
			this.bean_y = bean_y;
		}
		public int getBean_w() {
			return bean_w;
		}
		public void setBean_w(int bean_w) {
			this.bean_w = bean_w;
		}
		public int getBean_h() {
			return bean_h;
		}
		public void setBean_h(int bean_h) {
			this.bean_h = bean_h;
		}
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + bean_h;
			result = prime * result + (bean_status ? 1231 : 1237);
			result = prime * result + bean_w;
			result = prime * result + bean_x;
			result = prime * result + bean_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;
			final Bean other = (Bean) obj;
			if (bean_h != other.bean_h)
				return false;
			if (bean_status != other.bean_status)
				return false;
			if (bean_w != other.bean_w)
				return false;
			if (bean_x != other.bean_x)
				return false;
			if (bean_y != other.bean_y)
				return false;
			return true;
		}
		public Bean(int bean_x, int bean_y, int bean_w, int bean_h,
				boolean bean_status) {
			super();
			this.bean_x = bean_x;
			this.bean_y = bean_y;
			this.bean_w = bean_w;
			this.bean_h = bean_h;
			this.bean_status = bean_status;
		}

			
	}
	class Snake implements Serializable{

		
		/**
		 * Snake实体类
		 */
		private static final long serialVersionUID = 1L;
		
		
		private LinkedList<SnakeElement> snakeElements = new LinkedList<SnakeElement>();
		
		private String current_direction  ;

		public Snake() {
			super();
			// TODO Auto-generated constructor stub
		}

		public Snake(LinkedList<SnakeElement> snakeElements,
				String current_direction) {
			super();
			this.snakeElements = snakeElements;
			this.current_direction = current_direction;
		}

		public LinkedList<SnakeElement> getSnakeElements() {
			return snakeElements;
		}

		public void setSnakeElements(LinkedList<SnakeElement> snakeElements) {
			this.snakeElements = snakeElements;
		}

		public String getCurrent_direction() {
			return current_direction;
		}

		public void setCurrent_direction(String current_direction) {
			this.current_direction = current_direction;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime
					* result
					+ ((current_direction == null) ? 0 : current_direction
							.hashCode());
			result = prime * result
					+ ((snakeElements == null) ? 0 : snakeElements.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			final Snake other = (Snake) obj;
			if (current_direction == null) {
				if (other.current_direction != null)
					return false;
			} else if (!current_direction.equals(other.current_direction))
				return false;
			if (snakeElements == null) {
				if (other.snakeElements != null)
					return false;
			} else if (!snakeElements.equals(other.snakeElements))
				return false;
			return true;
		}

	}

	class SnakeElement implements Serializable{

		
		/**
		 * Snake关节实体类
		 */
		private static final long serialVersionUID = 1L;
		private int id ; 
		private int x ; 
		private int y ; 
		private int w ; 
		private int h ;
		public SnakeElement() {
			super();
			// TODO Auto-generated constructor stub
		}
		public SnakeElement(int id, int x, int y, int w, int h) {
			super();
			this.id = id;
			this.x = x;
			this.y = y;
			this.w = w;
			this.h = h;
		}
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		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 int getW() {
			return w;
		}
		public void setW(int w) {
			this.w = w;
		}
		public int getH() {
			return h;
		}
		public void setH(int h) {
			this.h = h;
		}
		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + h;
			result = prime * result + id;
			result = prime * result + w;
			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;
			final SnakeElement other = (SnakeElement) obj;
			if (h != other.h)
				return false;
			if (id != other.id)
				return false;
			if (w != other.w)
				return false;
			if (x != other.x)
				return false;
			if (y != other.y)
				return false;
			return true;
		}
	}

	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值