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) {} }
相关文章推荐
- 【Java学习笔记】GUI界面之小游戏
- GUI学习笔记MyWindowDemo.java
- 黑马程序员——Java学习笔记之⑥——“图形界面GUI”
- [Java学习笔记]小练习_求矩阵对角线的和&清零对角线上的值
- (50)Java学习笔记——GUI
- Java学习笔记--网络编程--练习在线咨询
- 黑马程序员—20—java基础:有关GUI图形用户界面学习笔记和学习心得体会
- Java学习笔记(二)GUI组件(1)
- java的学习笔记——一个城堡小游戏
- JS学习笔记之贪吃蛇小游戏demo实例详解
- 使用javaGUI实现贪吃蛇小游戏
- 黑马程序员 java学习笔记 Day6:GUI
- java学习笔记图形程序设计及GUI应用小结(2)
- Java学习笔记(GUI)
- (44)Java学习笔记——IO流 / 分阶段总结和练习
- Java GUI学习笔记
- java学习笔记第26天2018.09.28。。。功能流,图形化界面练习
- 学习Java时的笔记心得——城堡小游戏
- Java GUI编程贪吃蛇小游戏实现1 界面设计
- Java GUI编程贪吃蛇小游戏实现3 让小蛇动起来