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;
}
}
}
java swing 贪吃蛇 自己没事写的 有问题反馈
最新推荐文章于 2020-12-11 09:30:58 发布