2.
3.
package com.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
//一、JFrame 窗口
//1.绘制一个静态窗口 JFrame
JFrame jFrame = new JFrame("基于Java-贪吃蛇小游戏");
//2.设置界面的大小
jFrame.setBounds(100,100,920,750);
//3.界面是否可调整大小 false true
jFrame.setResizable(false);
//4.默认的关闭事件操作
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//二、面板 JPanel 可以加入到JFrame窗体
jFrame.add(new GamePanel());
//5.设置窗口是否可见 false true
jFrame.setVisible(true);
=============================================================
package com.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.security.Key;
import java.util.Random;
//继承JPanel ActionListener:事件监听
public class GamePanel extends JPanel implements KeyListener, ActionListener {
int lenth; //蛇的长度
int[] snakeX = new int[600]; //蛇的坐标X
int[] snakeY = new int[500]; //蛇的坐标Y
String fx; // R:右;L:左;U:上;D:下;
boolean isStart = false;//游戏是否开始
Timer timer = new Timer(100,this); //定时器 移动速度
//定义一个食物
int foodx;
int foody;
Random random = new Random();
//死亡判断
boolean isFail = false;
//积分系统
int score;
//构造器
public GamePanel(){
init();
//获取键盘的监听事件
this.setFocusable(true); //获取焦点
this.addKeyListener(this); //获取当前的键
timer.start();//让时间动起来
}
//初始化方法
public void init(){
lenth = 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(34);//食物随机出现
foody = 75 +25* random.nextInt(24);//食物随机出现
score = 0; //默认积分为0
}
// 画板: 画界面,花蛇 Graphics: 画笔
@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); //绘制游戏区域
//画一条静态的小蛇 用for循环使其满足条件时自增
//画头部的方向图片
if(fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("L")){
Data.left.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]);
}
for (int i = 1; i <lenth ; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);//蛇的身体长度通过lenth控制
}
//游戏提示:是否开始
if (isStart==false){
//画一段文字,string
g.setColor(Color.red);//设置画笔的颜色
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("游戏失败,按下空格重新开始",300,300);
}
//画食物
Data.food.paintIcon(this,g,foodx,foody);
//画积分
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度:"+lenth,750,35);
g.drawString("分数:"+score,750,50);
}
//接受键盘的输入:监听
@Override
public void keyPressed(KeyEvent e) {
//键盘按下 未释放
//获取按下的键盘是哪一个键
int keyCode = e.getKeyCode();
if (keyCode== KeyEvent.VK_SPACE){ //VK_SPACE:空格
if (isFail){ //失败,游戏重新开始
isFail= false;
init(); //重新初始化游戏
}else{
isStart = !isStart; //如果按下的是空格键,那就启动或暂停
}
repaint(); //刷新界面
}
//键盘控制方向
if(keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if (keyCode==KeyEvent.VK_RIGHT){
fx="R";
}else if (keyCode==KeyEvent.VK_DOWN){
fx="D";
}else if (keyCode==KeyEvent.VK_UP){
fx="U";
}
}
//定时器:监听时间 帧: 执行定时操作
@Override
public void actionPerformed(ActionEvent e) {
//如果游戏处于开始状态,并且游戏没失败
if (isStart && isFail==false) {
for (int i = lenth - 1; i > 0; i--) { //除了脑袋,身体都向前移动
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
//通过控制头部方向让头部移动
if (fx.equals("R")) {
snakeX[0] = snakeX[0] + 25;//头部坐标
if (snakeX[0] > 850) { snakeX[0] = 25; }
} else if (fx.equals("L")) {
snakeX[0] = snakeX[0] - 25;
if (snakeX[0] < 25) { snakeX[0] = 850; }
} else if (fx.equals("U")) {
snakeY[0] = snakeY[0] - 25;
if (snakeY[0] < 75) { snakeY[0] = 650; }
} else if (fx.equals("D")) {
snakeY[0] = snakeY[0] + 25;
if (snakeY[0] > 650) { snakeY[0] = 75; }
}
//如果小蛇的头部和食物重叠。则长度加一,再重新生成食物
if (snakeX[0]==foodx && snakeY[0]==foody){
lenth++;
foodx = 25 +25* random.nextInt(34);
foody = 75 +25* random.nextInt(24);
score=score+10;
}
//结束判断
for (int i = 1; i < lenth; i++) {
if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail = true;
}
}
repaint(); //刷新界面
}
timer.start();//让时间动起来
}
@Override
public void keyReleased(KeyEvent e) {
//释放某个键
}
@Override
public void keyTyped(KeyEvent e) {
//键盘按下 弹起 敲击
}
}
========================================
package com.snake;
import javax.swing.*;
import java.net.URL;
//存放外部数据
public class Data {
//头部的图片 URL
public static URL headerURL = Data.class.getResource("/statics/header.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);
}





