您的位置:首页 > 编程语言 > Java开发

Java学习笔记--GUI练习-贪吃蛇小游戏

2020-06-04 07:50 405 查看

一个简易的贪吃蛇小游戏

首先存放图片的类

import javax.swing.*;
import java.net.URL;

//数据中心
public class Data {
//相对路径
public static URL headerURL=Data.class.getResource("statics/广告.png");
public static ImageIcon header=new ImageIcon(headerURL);

public static URL leftURL=Data.class.getResource("statics/left.png");
public static ImageIcon left=new ImageIcon(leftURL);

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 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);

}

游戏的主启动类

import javax.swing.*;

//游戏的主启动类
public class StartGame {
public static void main(String[] args) {
JFrame frame=new JFrame();

frame.setBounds(200,200,900,720);
frame.setResizable(false);//窗口大小不可变
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

//正常游戏界面都应该在面板上
frame.add(new GamePanel());

frame.setVisible(true);
}
}

游戏面板

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[100];//蛇的X坐标
int[] snakeY=new int[500];//蛇的Y坐标
String fx;//方向
int foodx;//食物的X坐标
int foody;//食物的Y坐标
Random random=new Random();
int score;

//游戏当前的状态
boolean isStart=false;//默认没有开始
boolean isFail=false;//游戏失败状态
//定时器   以毫秒为单位
Timer timer=new Timer(100,this);//50毫秒执行一次

//构造器
public GamePanel(){
init();
//获得焦点和键盘事件
this.setFocusable(true);//获得焦点事件
this.addKeyListener(this);//如果是监听器在其他类就换其他类
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(34);
foody=75+25*random.nextInt(24);
score=0;
}

//绘制面板,我们游戏中的所有东西,都是用这个画笔来画
@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);//默认的游戏界面

//画食物
Data.food.paintIcon(this,g,foodx,foody);

//画积分
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度:"+length,750,35);
g.drawString("分数:"+score,750,55);

//把蛇画上去
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]);//画身体
}

//游戏状态
if (!isStart){
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) {
int keyCode=e.getKeyCode();//获得键盘按压
if (keyCode==KeyEvent.VK_SPACE){//如果按下空格
if (isFail){
init();//重新开始
}else {
isStart=!isStart;
}
repaint();
}
//小蛇移动
if (keyCode==KeyEvent.VK_UP){
fx="U";
}else if (keyCode==KeyEvent.VK_DOWN){
fx="D";
}else if (keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if (keyCode==KeyEvent.VK_RIGHT){
fx="R";
}
}

//事件监听--需要通过固定时间来刷新,1s刷新10次
@Override
public void actionPerformed(ActionEvent e) {
if (isStart&&(!isFail)){//如果是开始状态,让小蛇动起来
//吃食物
if (snakeX[0]==foodx&&snakeY[0]==foody){
length++;//长度加1
score+=10;
//再次随机生成食物
foodx=25+25*random.nextInt(34);
foody=75+25*random.nextInt(24);
}

//移动
for (int i = length-1; i > 0 ; i--) {//后一节移到前一节
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
if (fx.equals("R")){
snakeX[0]+=25;
//边界判断
if (snakeX[0]>850){
snakeX[0]=25;
}
}else if (fx.equals("L")){
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;
}
}

//失败判断,撞到自己就算失败
for (int i = 1; i < length; 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) {}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: