实例:贪吃蛇
package cn_tena.Day07;
import javax.swing.*;
public class snakeJFrame extends JFrame {
snakeJFrame (){
this.setSize(800,600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
snakeJPanel jPanel = new snakeJPanel();
this.add(jPanel);
this.setVisible(true);
}
public static void main(String[] args) {
snakeJFrame snakeJFrame = new snakeJFrame();
}
}
package cn_tena.Day07;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Random;
public class snakeJPanel extends JPanel implements Runnable, KeyListener {
//格子大小25,竖线31,横线26
int size =25;
int chuizhi= 31;
int level = 23;
Random r = new Random();
//集合
ArrayList<Snake> snakes = new ArrayList<Snake>();
//线程
Thread t;
//定义蛇的运动
int UP=0;
int DOWN=1;
int LEFT =2;
int RIGHT =3;
//初始运动方向
int startF=-1;
ImageIcon imageIcon = new ImageIcon();
//食物的坐标
int food_x;
int food_y;
//标识有无食物的开关
boolean hasFood = true;
//生成食物
public void creatFood(){
// 生成食物的随机坐标
food_x=r.nextInt(chuizhi)*size+4;
food_y=r.nextInt(level)*size+4;
// 检查生成的食物坐标是否与蛇身体重合
for (int i=0;i<snakes.size();i++){
if (food_x==snakes.get(i).x&&food_y==snakes.get(i).y){
// 如果重合,则重新生成随机坐标,并重新检查
food_x=r.nextInt(chuizhi)*size+4;
food_y=r.nextInt(level)*size+4;
i=0;// 重新检查循环
}
}
// 设置标志表示现在有食物存在
hasFood=true;
}
//吃食物
public void eatFood(){
if (snakes.get(0).x==food_x&&snakes.get(0).y==food_y){
growth();
hasFood=false;
}
}
//蛇身变长
public void growth(){
Snake snake = new Snake(snakes.get(snakes.size()-1).Oldx,snakes.get(snakes.size()-1).Oldy);
snakes.add(snake);
}
public snakeJPanel(){
Snake snake = new Snake((int)(Math.random()*chuizhi)*size+4,(int)(Math.random()*level)*size+4);
snakes.add(snake);
//获取键盘较焦点
setFocusable(true);
//开启监听
addKeyListener(this);
t=new Thread(this);
t.start();
//创建食物
creatFood();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.white);
for (int i=0;i<=level;i++){
g.drawLine(4,i*size+4,4+size*chuizhi,i*size+4);
}
for (int i=0;i<=chuizhi;i++){
g.drawLine(4+i*size,4,4+size*i,size*chuizhi+4);
}
for (int i =0;i<snakes.size();i++){
Snake snake = snakes.get(i);
snake.drawSnake(g);
}
//画食物
if (hasFood){
Image image = new ImageIcon("image\\aaa.png").getImage();
// 绘制图片
g.drawImage(image, food_x, food_y, null);
}
//游戏结束
if (Body()){
for (int i =0;i<10;i++){
g.setFont(new Font("微软雅黑",Font.BOLD,30));
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawString("Game_Over",300-i,300-i);
}
startF=-1;
}
if (GameOver(snakes.get(0))){
for (int i =0;i<10;i++){
g.setFont(new Font("微软雅黑",Font.BOLD,30));
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawString("Game_Over",300-i,300-i);
}
startF=-2;
}
}
//游戏结束
public boolean GameOver(Snake snake){
if (snake.x<0||snake.x>800||snake.y<0||snake.y>600){
return true;
}
return false;
}
//蛇身碰撞
public boolean Body(){
for (int i=3;i<snakes.size();i++){
if (snakes.get(0).x==snakes.get(i).x&&snakes.get(0).y==snakes.get(i).y){
return true;
}
}
return false;
}
@Override
public void keyTyped(KeyEvent e) {
}
//蛇头移动
public void snakeMove(){
if (startF==LEFT){
snakes.get(0).Oldx=snakes.get(0).x;
snakes.get(0).Oldy=snakes.get(0).y;
snakes.get(0).x-=size;
}
if (startF==RIGHT){
snakes.get(0).Oldx=snakes.get(0).x;
snakes.get(0).Oldy=snakes.get(0).y;
snakes.get(0).x+=size;
}
if (startF==UP){
snakes.get(0).Oldx=snakes.get(0).x;
snakes.get(0).Oldy=snakes.get(0).y;
snakes.get(0).y-=size;
}
if (startF==DOWN){
snakes.get(0).Oldx=snakes.get(0).x;
snakes.get(0).Oldy=snakes.get(0).y;
snakes.get(0).y+=size;
}
}
//蛇身移动
public void moveSnake2(){
for (int i=1;i<snakes.size();i++){
snakes.get(i).Oldx=snakes.get(i).x;
snakes.get(i).Oldy=snakes.get(i).y;
snakes.get(i).x =snakes.get(i-1).Oldx;
snakes.get(i).y=snakes.get(i-1).Oldy;
}
}
@Override
public void keyPressed(KeyEvent e) {
//判断键盘按的是否是左键
if (e.getKeyCode()==KeyEvent.VK_LEFT){
if (startF==-1||startF==UP||startF==DOWN){
startF=LEFT;
}
}else if (e.getKeyCode()==KeyEvent.VK_RIGHT){
if (startF==-1||startF==UP||startF==DOWN){
startF=RIGHT;
}
}else if (e.getKeyCode()==KeyEvent.VK_UP){
if (startF==-1||startF==LEFT||startF==RIGHT){
startF = UP;
}
}else if (e.getKeyCode()==KeyEvent.VK_DOWN){
if (startF==-1||startF==LEFT||startF==RIGHT){
startF=DOWN;
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void run() {
while (true){
snakeMove();
moveSnake2();
eatFood();
if (hasFood==false){
creatFood();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
}
package cn_tena.Day07;
import java.awt.*;
import java.util.Random;
public class Snake {
int x,y;
int Oldx,Oldy;
Random r = new Random();
public Snake(int x,int y){
this.x=x;
this.y=y;
}
//画蛇的方法
public void drawSnake(Graphics g){
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.fillRect(x,y,25,25);
}
}