主程序
//主程序
package SNAKE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class snake {
public static void main(String[] args) {
// 绘制一个静态窗口
JFrame frame = new JFrame("贪吃蛇小游戏");
frame.setBounds(10, 10, 900, 720);
frame.setResizable(false);//窗口大小不可变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭事件
//2.面板
frame.add(new GamePanel());
frame.setVisible(true);
}
}
主框架
//主框架在这里
package SNAKE;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener{
//面板
static int code;
int length;//蛇的长度
int [] snakeX = new int [600];//蛇的身体
int [] snakeY = new int [500];
String fx;
boolean isStart = false;//游戏是否开始
Timer timer = new Timer( 50, 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(){
length = 3;//初始长度为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;
}
//画板;画界面;画蛇
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);
//画一条静态小蛇
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<length;i++){
//循环打印身体长度
Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);
}
//画食物
Data.food.paintIcon(this, g, foodx, foody);
//画积分
g.setColor(Color.WHITE);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,18));//设置字体样式,粗体,和大小
g.drawString("长度"+length, 750, 30);//画字体
g.drawString("分数"+score, 750,55);//画字体
//开始提示
if(isStart==false){
//画一个文字
g.setColor(Color.WHITE);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
g.drawString("按下空格开始游戏", 300, 300);//画字体
}
//失败
if(isFail){
//画一个文字
g.setColor(Color.WHITE);//设置画笔颜色
g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体样式,粗体,和大小
g.drawString("游戏失败,按下空格重新开始", 300, 300);//画字体
}
}
//接受键盘的输入:监听
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//键盘按下的监听事件
//获取按下的键盘是哪一个键
int keyCode = e.getKeyCode();
if((keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A)&&fx=="R"){
keyCode=KeyEvent.VK_RIGHT;
}else if((keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D)&&fx=="L"){
keyCode=KeyEvent.VK_LEFT;
}else if((keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W)&&fx=="D"){
keyCode=KeyEvent.VK_DOWN;
}else if((keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S)&&fx=="U"){
keyCode=KeyEvent.VK_UP;
}
//如果按下的是空格,启动或暂停
if(keyCode==KeyEvent.VK_SPACE){
if(isFail){
//失败,游戏再来一遍
isFail = false;
init();//重新初始化
}else{
isStart = !isStart;
}
repaint();//刷新界面
}
if(keyCode==KeyEvent.VK_LEFT||keyCode==KeyEvent.VK_A){
fx = "L";
}
if(keyCode==KeyEvent.VK_RIGHT||keyCode==KeyEvent.VK_D){
fx = "R";
}
if(keyCode==KeyEvent.VK_UP||keyCode==KeyEvent.VK_W){
fx = "U";
}
if(keyCode==KeyEvent.VK_DOWN||keyCode==KeyEvent.VK_S){
fx = "D";
}
}
//定时器,监听时间
@Override
public void actionPerformed(ActionEvent e) {
// 执行定时操作
//如果游戏处于开始状态,而且游戏没有结束
if(isStart&&isFail==false){
for(int i = length-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] -= 25;
//边界判断
if(snakeY[0]<75){
snakeY[0] = 650;//回到原始位置
}
}else if(fx.equals("D")){
snakeY[0] += 25;
//边界判断
if(snakeY[0]>650){
snakeY[0] = 75;//回到原始位置
}
}
//如果吃到食物:坐标重合
if(snakeX[0]==foodx&&snakeY[0]==foody){
//长度加一
score +=10 ;
//重新生成食物
foodx = 25 + 25*random.nextInt(34);
foody = 75 + 25*random.nextInt(24);//生成的随机数不能超过格子
length += 1;
}
//结束判断
for(int i = 1;i < length;i++){
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
isFail = true;//设置失败
}
}
//移动完要刷新界面
repaint();
}
//让计时器动起来
timer.start();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
//键盘按下,弹起
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
//键盘释放
}
}
图片资源的加载
//这是一些图片资源
package SNAKE;
import java.net.URL;
import javax.swing.ImageIcon;
public class Data {
//存放数据的类
//广告图片 URL
public static URL headreURL = Data.class.getResource("/statics/header.png");
public static ImageIcon header = new ImageIcon(headreURL);
//头部图片
public static URL upURL = Data.class.getResource("/statics/up.png");
public static ImageIcon up = new ImageIcon(upURL);
public static URL downURL = Data.class.getResource("/statics/down.png");
public static ImageIcon down = new ImageIcon(downURL);
public static URL leftURL = Data.class.getResource("/statics/left.png");
public static ImageIcon left = new ImageIcon(leftURL);
public static URL rightURL = Data.class.getResource("/statics/right.png");
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);
}