贪吃蛇
语言:java
知识点:gui
环境:jdk8
注:文章末尾有图片资源 & 源代码 链接
大概界面
相关类(只有5个)
1、游戏启动类
package com.xiejiaqi.snakeGame;
import javax.swing.*;
/**
* 游戏主启动类
*/
public class StartGame {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
GamePanel gamePanel = new GamePanel();
jFrame.setFocusable(true);//获取键盘焦点事件
// 特别注意:setFocusable方法在setVisible方法之前,要不然监听事件可能监听不到
jFrame.setBounds(10, 10, 920, 720);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setResizable(false);
jFrame.add(gamePanel);
jFrame.addKeyListener(gamePanel);
Thread thread = new Thread(gamePanel);
thread.start();
}
}
2、游戏的面板
package com.xiejiaqi.snakeGame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
* 游戏面板
*/
public class GamePanel extends JPanel implements KeyListener, Runnable{
//游戏状态
boolean isStart = false; //游戏的开始
boolean isFail = false; //游戏的结束
Snack snack = null;
SnackFood snackFood = null;
public GamePanel(){
snack = new Snack();
snackFood = new SnackFood();
}
//绘制面板,游戏中的所有东西,都是用一个画笔画上去
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//绘制静态面板
this.setBackground(Color.white);
Data.header.paintIcon(this, g, 25, 11); //头部广告栏
g.fillRect(25, 75, 850, 600);
//画积分
g.setColor(Color.white);
g.setFont(new Font("隶书 常规", Font.BOLD, 18));
g.drawString("长度 " + snack.length, 750, 35);
g.drawString("分数 " + snack.score, 750, 50);
//食物
Data.food.paintIcon(this, g, snackFood.foodX, snackFood.foodY);
//初始小蛇画上去
switch(snack.direction){
case 0:
Data.up.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
case 1:
Data.right.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
case 2:
Data.down.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
case 3:
Data.left.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
}
for(int i = 1; i < snack.length; i++){
Data.body.paintIcon(this, g, snack.snackX[i], snack.snackY[i]);
}
//游戏状态
if(!isStart){
g.setColor(Color.white);
g.setFont(new Font("隶书 常规", Font.BOLD, 40));
g.drawString("按下空格开始游戏", 300, 300);
}
if(isFail){
g.setColor(Color.red);
g.setFont(new Font("隶书 常规", Font.BOLD, 40));
g.drawString("gameOver空格重新开始", 300, 300);
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_SPACE){
if(isFail){
//重新开始
isFail = false;
snack = new Snack();
snackFood = new SnackFood();
}else{
//只是暂停
isStart = !isStart;
}
this.repaint();
}
if(keyCode == KeyEvent.VK_UP){
snack.direction = 0;
}else if(keyCode == KeyEvent.VK_RIGHT){
snack.direction = 1;
}else if(keyCode == KeyEvent.VK_DOWN){
snack.direction = 2;
}else if(keyCode == KeyEvent.VK_LEFT){
snack.direction = 3;
}
}
public void move(){
if(isStart && !isFail){
//撞到自己死掉
for(int i = 1; i < snack.length; i++){
if(snack.snackX[0] == snack.snackX[i] && snack.snackY[0] == snack.snackY[i]){
isFail = true;
}
}
//吃到食物
if(snack.snackX[0] == snackFood.foodX && snack.snackY[0] == snackFood.foodY){
//长度加1
snack.length++;
//score加1
snack.score++;
//再次投放食物
snackFood.makeFood();
}
for(int i = snack.length - 1; i > 0; i--){ //尾巴跟着头走
snack.snackX[i] = snack.snackX[i - 1];
snack.snackY[i] = snack.snackY[i - 1];
}
//头的走向
if(snack.direction == 0){
snack.snackY[0] -= 25; //都得等尾巴跟上来再走
// 边界判断
if(snack.snackY[0] < 75){snack.snackY[0] = 600;}
}else if(snack.direction == 1){
snack.snackX[0] += 25; //都得等尾巴跟上来再走
// 边界判断
if(snack.snackX[0] > 850){snack.snackX[0] = 25;}
}else if(snack.direction == 2){
snack.snackY[0] += 25; //都得等尾巴跟上来再走
// 边界判断
if(snack.snackY[0] > 650){snack.snackY[0] = 75;}
}else if(snack.direction == 3){
snack.snackX[0] -= 25; //都得等尾巴跟上来再走
// 边界判断
if(snack.snackX[0] < 25){snack.snackX[0] = 850;}
}
this.repaint();
}
}
@Override
public void run() { //用来重绘
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
this.move();
this.repaint();
}
}
}
3、snack类
package com.xiejiaqi.snakeGame;
public class Snack {
int length;
int score;
int[] snackX = new int[600];
int[] snackY = new int[600];
int direction; //0上1右2下3左
public Snack(){
score = 0;
length = 3;
snackX[0] = 100; snackY[0] = 100;
snackX[1] = 75; snackY[1] = 100;
snackX[2] = 50; snackY[2] = 100;
direction = 1;
}
}
4、食物类
package com.xiejiaqi.snakeGame;
import java.util.Random;
public class SnackFood {
int foodX;
int foodY;
Random random = new Random();
public SnackFood(){
makeFood();
}
public void makeFood(){
this.foodX = 25 + 25 * random.nextInt(34);
this.foodY = 75 + 25 * random.nextInt(25);
}
}
5、数据资源类
package com.xiejiaqi.snakeGame;
import javax.swing.*;
/**
* 数据中心
*/
public class Data {
//public static URL headerURL = Data.class.getResource("header.png");
public static ImageIcon header = new ImageIcon(Data.class.getResource("/header.jpg"));
//public static URL headURL = Data.class.getResource("head.png");
public static ImageIcon up = new ImageIcon(Data.class.getResource("/head.png"));
public static ImageIcon down = new ImageIcon(Data.class.getResource("/head.png"));
public static ImageIcon left = new ImageIcon(Data.class.getResource("/head.png"));
public static ImageIcon right = new ImageIcon(Data.class.getResource("/head.png"));
//public static URL bodyURL = Data.class.getResource("body.png");
public static ImageIcon body = new ImageIcon(Data.class.getResource("/body.png"));
//public static URL foodURL = Data.class.getResource("body.png");
public static ImageIcon food = new ImageIcon(Data.class.getResource("/food.png"));
}
相关资源及源文件
图片文件放在默认位置:源文件的根目录下
链接:百度网盘链接
提取码:0000