你与贪吃蛇的距离,只有三个类、一包图片素材而已!
1. 游戏启动器
package com.zhangshijie.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args){
//1.绘制静态窗口
JFrame jFrame = new JFrame("贪吃蛇游戏");
jFrame.setBounds(10,10,925,740);//设置窗口的起始位置和大小
jFrame.setResizable(false);//设置窗口大小不可变
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭界面时候停止程序运行
jFrame.setVisible(true);//让游戏窗口可以展现出来
jFrame.add(new GamePanel());//添加游戏面板
}
}
2. 外部数据(素材图片)加载 类
package com.zhangshijie.snake;
import javax.swing.*;
import java.net.URL;
public class Data {
//广告栏
public static URL headerURL = Data.class.getResource("/statics/header1.png");
public static ImageIcon header = new ImageIcon(headerURL);
//蛇身
public static URL upURL = Data.class.getResource("/statics/up.png");
public static URL downURL = Data.class.getResource("/statics/down.png");
public static URL leftURL = Data.class.getResource("/statics/left.png");
public static URL rightURL = Data.class.getResource("/statics/right.png");
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon left = new ImageIcon(leftURL);
public static ImageIcon right = new ImageIcon(rightURL);
//身体
public static URL bodyURL = Data.class.getResource("/statics/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
//食物
public static URL foodURL = Data.class.getResource("/statics/food.png");
public static ImageIcon food = new ImageIcon(foodURL);
}
3. 面板代码
package com.zhangshijie.snake;
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;
import java.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener {
int length;//蛇的长度
int[] snakeX = new int[600];//蛇的坐标x
int[] snakeY = new int[500];
String fx ; //方向
boolean isStart = false;//游戏是否开始
//积分系统
int score;
//定义一个食物
int foodx;
int foody;
Random random = new Random();//定义一个随机数
//死亡标记
boolean isFall = false;
Timer timer = new Timer(100,this); //定时器 每个500毫秒动一次 //ctrl+enter进行自动添加接口
//构造器
public GamePanel(){
init();
//获取键盘的监听事件
this.setFocusable(true);//获取键盘焦点--把键盘的焦点聚集在我们的游戏上面
this.addKeyListener(this);//监听当前我们实现了监听接口的这个GamePanel类
timer.start();//让时间动起来
}
//初始化蛇头+蛇身
public void init(){
length = 3;
snakeX[0] = 100;snakeY[0]=100;
snakeX[1]=75;snakeY[1]=100;
snakeX[2]=50;snakeY[2]=100;
fx ="R";
foodx = 25 + 25*random.nextInt(15);
foody = 75 + 25*random.nextInt(15);
score = 0;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清空屏幕
this.setBackground(Color.BLACK);//设置背景颜色为黑色
//引入外部素材
Data.header.paintIcon(this,g,25,11);
g.fillRect(25,75,850,600);
//绘制食物
Data.food.paintIcon(this,g,foodx,foody);
//积分系统
g.setColor(Color.YELLOW);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,20));//设置字体
g.drawString("长度:"+length,700,30);
g.drawString("积分:"+score,700,60);
//绘制蛇头
if(fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("L")){
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for(int i =1;i<length;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//游戏提示是否开始
if(isStart == false){
//使用画笔画一个文字 String
g.setColor(Color.WHITE);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("按下空格开始游戏",300,300);
}
//游戏提示是否死亡
if(isFall){
//使用画笔画一个文字 String
g.setColor(Color.RED);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
g.drawString("游戏失败,按下空格重新开始!",200,300);
}
}
//键盘监听的三个方法
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//按下键盘 未释放状态
//获取按下的键盘是哪个键
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){//按下了空格
if(isFall){
isFall = false;
init();//重新初始化游戏
}else{
isStart = !isStart;
}
repaint();//重新绘制界面(刷新界面)
}
//控制键盘走向
if(keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if(keyCode==KeyEvent.VK_UP){
fx="U";
}else if(keyCode==KeyEvent.VK_RIGHT){
fx = "R";
}else if(keyCode==KeyEvent.VK_DOWN){
fx="D";
}
}
@Override
public void actionPerformed(ActionEvent e) {
//如果游戏处于开始状态 并且游戏没有失败
if(isStart && isFall==false){
//向下
if(fx.equals("D")){
//身体动起来
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//头部动起来
snakeY[0]=snakeY[0]+25;
if(snakeY[0]>750){
snakeY[0]=25;
}
}
else if(fx.equals("U")){
//身体动起来
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//头部动起来
snakeY[0] = snakeY[0]-25;
if(snakeY[0]<25){
snakeY[0]=750;
}
}
else if(fx.equals("L")){
//身体动起来
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//头部动起来
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25){
snakeX[0]=750;
}
}
else if(fx.equals("R")){
//身体动起来
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//头部动起来
snakeX[0]=snakeX[0]+25;
if(snakeX[0]>750){
snakeX[0]=25;
}
}
//吃食物
if(snakeX[0]==foodx && snakeY[0]==foody){
length++;
foodx = 25 + 25*random.nextInt(15);
foody = 75 + 25*random.nextInt(15);
score +=10;
}
//死亡判断
for(int i=1;i<length;i++){
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFall=true;
}
}
repaint();
}
timer.start();
}
@Override
public void keyReleased(KeyEvent e) {
}
}
运行一下: