飞道的博客

Java实现贪吃蛇大作战小游戏(完整版)

488人阅读  评论(0)

 大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。


 效果展示


目录

效果展示

一、游戏界面

二、得分情况

 项目介绍

项目背景

总体需求

实现过程

代码展示

主类 :Demo类

 MyPanel类

 ①构造方法

 ②初始化方法

 ③绘制方法

 ④定时器执行方法

框架Ui类

项目结构

总结



效果展示

一、游戏界面

二、得分情况


 项目介绍

项目背景

“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个 操作简单、界面美观、功能较齐全 的“贪吃蛇”游戏。通过本游戏的开发,达到学习Java技术熟悉软件开发流程的目的。

总体需求

 本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。需要满足以下几点要求:

(1)利用方向键来改变蛇的运行方向。
(2)空格键暂停或继续游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。

实现过程

(1)绘制窗体对象。
(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。
(3)使用键盘监听事件和定时器实现小蛇的移动。
(4)小蛇与食物碰撞的实现。
(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。
(6)退出条件:当游戏积分到达指定分数,游戏退出。


代码展示

主类 :Demo类


  
  1. package Demo;
  2. /**
  3. * 1.画出窗体对象
  4. *
  5. *
  6. * @author 青00-Java
  7. *
  8. */
  9. public class Demo0 {
  10. }

MyPanel类

构造方法


  
  1. package Demo;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.KeyEvent;
  9. import java.awt.event.KeyListener;
  10. import java.util.Random;
  11. import javax.swing.ImageIcon;
  12. import javax.swing.JPanel;
  13. import javax.swing.Timer;
  14. //画布类
  15. public class MyPanel extends JPanel implements KeyListener,ActionListener{ //继承
  16. private static final Component This = null;
  17. //键盘监听交互接口
  18. int length;
  19. int score;
  20. int[] snakeX= new int[ 500]; //坐标
  21. int[] snakeY= new int[ 500];
  22. String fx;
  23. boolean ifStart= false;
  24. //定时器
  25. Timer timer = new Timer( 100, this);
  26. int foodx;
  27. int foody;
  28. Random random = new Random();
  29. public MyPanel (){
  30. init();
  31. //添加监听事件
  32. this.setFocusable( true);
  33. this.addKeyListener( this);
  34. score= 0;
  35. }

初始化方法


  
  1. public void init(){
  2. length= 3;
  3. fx= "r";
  4. //初始化小蛇的位置
  5. snakeX[ 0]= 100;
  6. snakeY[ 0]= 150;
  7. snakeX[ 1]= 75;
  8. snakeY[ 1]= 150;
  9. snakeX[ 2]= 50;
  10. snakeY[ 2]= 150;
  11. foodx= 25+ 25*random.nextInt( 57);
  12. foody= 125+ 25*random.nextInt( 27);
  13. System. out.println(foodx);
  14. System. out.println(foody);
  15. timer.start();
  16. }

绘制方法


  
  1. @Override
  2. protected void paintComponent( Graphics g){ //画笔对象
  3. super. paintComponent(g);
  4. //绘制顶部的标题
  5. new ImageIcon( "C:/Users/Desktop/img/title2.png"). paintIcon( this,g, 25, 11); //创建对象
  6. //绘制游戏区域
  7. g. fillRect( 25, 125, 1450, 700);
  8. //绘制小蛇
  9. //蛇头
  10. new ImageIcon( "C:/Users/Desktop/img/l.png"). paintIcon( this, g, snakeX[ 0], snakeY[ 0]);
  11. //蛇身
  12. for(int i= 1;i<length;i++){
  13. new ImageIcon( "C:/Users/Desktop/img/body.png"). paintIcon( This, g, snakeX[i], snakeY[i]);
  14. }
  15. //游戏的提示语
  16. if(ifStart== false){
  17. g. setColor( Color. white);
  18. g. setFont( new Font( "微软雅黑", Font. BOLD, 40));
  19. g. drawString( "按压空格键继续游戏", 550, 500);
  20. g. drawString( "无尽模式", 650, 400);
  21. }
  22. //画出食物的位置
  23. new ImageIcon( "C:/Users/Desktop/img/body.png"). paintIcon( this, g, foodx, foody);
  24. }
  25. @Override //按压
  26. public void keyPressed( KeyEvent e) {
  27. int keyCode=e. getKeyCode();
  28. if(keyCode== KeyEvent. VK_SPACE){
  29. ifStart=!ifStart;
  30. }
  31. if(ifStart== true){
  32. if(keyCode== KeyEvent. VK_LEFT&&fx!= "r"){
  33. fx= "l";
  34. } else if(keyCode== KeyEvent. VK_RIGHT&&fx!= "l"){
  35. fx= "r";
  36. } else if(keyCode== KeyEvent. VK_UP&&fx!= "d"){
  37. fx= "u";
  38. } else if(keyCode== KeyEvent. VK_DOWN&&fx!= "u"){
  39. fx= "d";
  40. }
  41. }
  42. repaint();
  43. }

定时器执行方法


  
  1. @Override
  2. public void actionPerformed(ActionEvent e) {
  3. //改变蛇的位置
  4. if(ifStart== true){
  5. for( int i=length -1;i> 0;i--){
  6. snakeX[i]=snakeX[i -1];
  7. snakeY[i]=snakeY[i -1];
  8. }
  9. if(fx. equals( "l")){
  10. snakeX[ 0]=snakeX[ 0] -25;
  11. if(snakeX[ 0]< 25){
  12. snakeX[ 0]= 1450;
  13. }
  14. } else if(fx. equals( "r")){
  15. snakeX[ 0]=snakeX[ 0]+ 25;
  16. if(snakeX[ 0]> 1450){
  17. snakeX[ 0]= 25;
  18. }
  19. } else if(fx. equals( "u")){
  20. snakeY[ 0]=snakeY[ 0] -25;
  21. if(snakeY[ 0]< 120){
  22. snakeY[ 0]= 800;
  23. }
  24. } else if(fx. equals( "d")){
  25. snakeY[ 0]=snakeY[ 0]+ 25;
  26. if(snakeY[ 0]> 800){
  27. snakeY[ 0]= 120;
  28. }
  29. }
  30. //判断是否吃了食物
  31. if(snakeX[ 0]==foodx&&snakeY[ 0]==foody){
  32. length++;
  33. score++;
  34. if(score== 100){
  35. ifStart=!ifStart;
  36. }
  37. foodx= 25+ 25*random.nextInt( 57);
  38. foody= 125+ 25*random.nextInt( 27);
  39. System. out.print( "当前食物坐标("+foodx+ ",");
  40. System. out.print(foody+ ")");
  41. System. out.println( "|||当前分数:"+score+ " ");
  42. }
  43. repaint();
  44. }
  45. timer.start();
  46. }
  47. @Override
  48. public void keyReleased(KeyEvent arg0) {
  49. // TODO Auto-generated method stub
  50. }
  51. @Override
  52. public void keyTyped(KeyEvent arg0) {
  53. // TODO Auto-generated method stub
  54. }
  55. }

框架Ui类


  
  1. package Demo;
  2. import javax. swing. JFrame;
  3. public class Ui {
  4. public static void main( String[] args){
  5. JFrame frame= new JFrame( "无尽版贪吃蛇");
  6. frame. setSize( 1500, 900);
  7. frame. setLocationRelativeTo( null); //居中显示
  8. frame. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
  9. frame. setResizable( true);
  10. frame. add( new MyPanel());
  11. frame. setVisible( true);
  12. }
  13. }

项目结构

本程序用于初学者学习,共封装三个类,分别是Demo类,MyPanel类,框架Ui类,结构简单,所有方法均在MyPanel类中实现。 


总结

本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大的提升。

在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。


本项目在一定程度上还有缺陷,仅用于初学者学习,欢迎各位指正。


 🥰以上就是本篇博客的全部内容,如果对你有用麻烦关注点赞收藏三连走一波!
👋如有问题欢迎留言,如有错误烦请指正,期待你的评论!
👨‍💻个人主页: 青00 (一起学Java)的博客_CSDN博客-一起学Java,Java领域博主

🤳我的《一起学Java》板块持续更新中,欢迎各位编程爱好者前来观看!


转载:https://blog.csdn.net/m0_63947499/article/details/125339199
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场