java从零开始开发贪吃蛇

1.游戏介绍

贪吃蛇是一款经典的益智类小游戏,是最初的翻盖机里面最常见的小游戏之一,学过编程的你有没有想过自己尝试着制作一款自己的贪吃蛇呢。

接下来我将从零开始带着大家做一款贪吃蛇小游戏。

2.了解游戏机制

图中是贪吃蛇游戏运行时的画面

我们通过控制方向键来控制蛇的上下左右,在静止的时候本质上就是一张静态图片,蛇头的朝向就是蛇的前进方向,每次吃到食物的时候,蛇的身体会变长,并且下一个食物出现在画面中的随机位置。

3.静态画面的构建

为了构建出蛇的形状和食物,我们需要寻找相应的素材图片,这里我已经找好了

每个图片的像素是25px*25px

头部分为上下左右四个方向,身体用黑色的正方形代替,食物这里没找到,用了一个苹果代替。(素材+qq1015532604)

有了素材之后我们就来先构建静态的画面吧。我们这里用的idea,当然你们也可以使用你们常用的编译器。


首先我们新建一个java项目,项目名为snake,项目下面新建两个包,com.dai.snake包下面存放我们的源代码,static包下面存放我们的素材。[外链

接下来我们新建一个主类用来初始化游戏窗口

新建一个JFrame对象,并且在初始化参数里面设置标题。

setBounds方法用来设置窗口的左上角的点坐标和窗口的大小。

jFrame.setResizable(false);

将我们的窗口设置为不可变窗口。

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

将我们的窗口设置为点击右上角的叉可以关闭游戏进程。

jFrame.setVisible(true);

设置窗口为可以显示的窗口,接下来我们运行看一下窗口效果。

窗口设置完了之后我们还需要一个画布,用来显示游戏画面。

因此我们新建一个画板类GamePanel(该类需继承JPanel类)

继承该类之后重写父类的paintComponent方法

我们需要在我们的画板类中画蛇。

Graphics是一个画笔类,所有的绘画动作都由g这个参数来完成。

我们将背景颜色设置为黑色。

接下来我们需要将我们的Panel添加的我们的Frame当中。

我们写一个Data类来存放游戏的图片资源

先通过URL类获得图片的资源地址

通过该地址将图片资源加载到ImageIcon中,然后我们就获得了图片对象。

有了图片资源之后我们就可以来画一条静态的小蛇。

首先我们在Panel类中设置一些参数和一个初始化函数

接着我们在paintComponent里面画一条静态的小蛇

接下来我们看下效果。

emmm

这个蛇有点丑,大家可以找些更好看的图片来代替。

4.让小蛇动起来

我们的小蛇长度并不固定,因此我们可以用一个循环来动态的画蛇的身体

用if else语句来动态画小蛇的脑袋

dir设置小蛇的方向

设置监听

我们让GamePanel实现KeyListener接口并且重写三个方法来实现监听。

这里我们只使用keyPressed来实现监听

设置游戏是否开始的提示字符

默认游戏未开始

当按下的是空格,isStart取反。

接下来我们将监听事件加入到监听器中

设置定时器

将this作为参数,会重写actionPerformed参数

并且每100ms会调用这个函数

最后再启动定时器

再次启动游戏会发现小蛇可以动起来了。

接下来我们通过wasd来控制蛇的方向

直接设置dir的值即可

蛇头部的移动也需要按照动态实现

至此我们的小蛇已经可以完全按照上下左右来控制方向了。

5.小蛇吃食物

设置一个食物,位置设为屏幕的随机位置

判断是否吃到食物

吃到的话,长度加1并且重新生成食物

6.失败判断

设置参数

设置失败文字

失败的话按空格键重新开始游戏

7.积分系统

设置积分的变量score,并且在init中初始化积分为0.

画积分

吃到食物则加10分

至此,整个游戏的基本功能就已经实现了。

8.展望

游戏实现了基本功能但是仍有许多不足之处,例如游戏素材不够美观,游戏无撞墙判定,游戏中的食物单一,我们也可以改进食物使得各种食物有各种不同的功能,亦或是做成联机模式的等等。本文只是提供一个思路起到抛砖引玉的作用。

源码:

StartGame.java

package com.dai.snake;import javax.swing.*;public class StartGames {public static void main(String[] args) {//1,绘制一个静态窗口 JFrameJFrame jFrame=new JFrame("戴通的贪吃蛇");//设置界面大小jFrame.setBounds(10,10,900,700);//设置窗口可以改变大小jFrame.setResizable(false);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭事件//2.将GamePanel添加JFrame当中jFrame.add(new GamePanel());jFrame.setVisible(true);//设置窗口可以显示出来}
}

Data.java

package com.dai.snake;import javax.swing.*;
import java.net.URL;//存放外部数据
public class Data {//获取图片资源public static URL headUpUrl=Data.class.getResource("/static/up.png");public static URL headDownUrl=Data.class.getResource("/static/down.png");public static URL headLeftUrl=Data.class.getResource("/static/left.png");public static URL headRightUrl=Data.class.getResource("/static/Right.png");public static URL foodUrl=Data.class.getResource("/static/food.png");public static URL bodyUrl=Data.class.getResource("/static/body.png");public static ImageIcon up=new ImageIcon(headUpUrl);public static ImageIcon down =new ImageIcon(headDownUrl);public static ImageIcon left=new ImageIcon(headLeftUrl);public static ImageIcon right=new ImageIcon(headRightUrl);public static ImageIcon food=new ImageIcon(foodUrl);public static ImageIcon body=new ImageIcon(bodyUrl);}

GamePanel.java

package com.dai.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.util.Random;public class GamePanel extends JPanel implements KeyListener, ActionListener {//画板:画界面,画蛇int length;//设置蛇的长度int[] snakeX=new int[600];//蛇的坐标Xint[] snakeY=new int[600];//蛇的坐标YString dir="R";//RUDLboolean 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(){length=3;//设置蛇的初始长度snakeX[0]=100;snakeY[0]=100;//设置蛇的初始头部坐标snakeX[1]=75;snakeY[1]=100;//设置蛇的第一节身体坐标snakeX[2]=50;snakeY[2]=100;//设置蛇的第二节身体坐标foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);score = 0;}//Graphics:画笔@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.BLACK);//设置背景的颜色为黑色g.fillRect(25,75, 850 ,600);//画一个矩形作为游戏区域//        //画一条静态的小蛇Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
//        Data.body.paintIcon(this,g,snakeX[1],snakeY[1]);
//        Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);if(dir.equals("R")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(dir.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(dir.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);}else if(dir.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]);//蛇的身体长度通过length控制}//画积分g.setColor(Color.GREEN);g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度:"+length,750,35);g.drawString("分数"+score,750,55);//游戏提示,是否开始Data.food.paintIcon(this,g,foodX,foodY);if(!isStart){g.setColor(Color.WHITE);g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("按下空格开始游戏",300,400);}if(isFail){g.setColor(Color.RED);g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("游戏失败,按下空格重新开始游戏",200,300);}}@Overridepublic void keyTyped(KeyEvent e) {//键盘按下弹起}@Overridepublic void keyPressed(KeyEvent e) {//键盘按下未释放//获取按下的是哪个健int keyCode=e.getKeyCode();if(keyCode==KeyEvent.VK_SPACE){if(isFail){isFail=false;init();}else{isStart=!isStart;repaint();}}//键盘控制方向if(keyCode==KeyEvent.VK_A){dir="L";}else if(keyCode==KeyEvent.VK_D){dir="R";}else if(keyCode==KeyEvent.VK_W){dir="U";}else if(keyCode==KeyEvent.VK_S){dir="D";}}@Overridepublic void keyReleased(KeyEvent e) {//释放某个键}//执行定时操作,每隔100ms执行一次@Overridepublic void actionPerformed(ActionEvent e) {if(isStart&&!isFail){for(int i=length-1;i>0;i--){snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];}//if(dir.equals("R")){snakeX[0]+=25;//边界判断if(snakeX[0]>850){snakeX[0]=25;}}else if(dir.equals("L")){snakeX[0]-=25;//边界判断if(snakeX[0]<25){snakeX[0]=850;}}else if(dir.equals("U")){snakeY[0]-=25;//边界判断if(snakeY[0]<75){snakeY[0]=650;}}else if(dir.equals("D")){snakeY[0]+=25;//边界判断if(snakeY[0]>650){snakeY[0]=75;}}if(snakeX[0]==foodX&&snakeY[0]==foodY){length++;score+=10;//重新生成食物foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);}//for(int i=1;i<length;i++){if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){isFail=true;}}//刷新游戏界面repaint();}timer.start();//启动定时器}
}

java从零开发贪吃蛇游戏全流程相关推荐

  1. 【使用java swing制作简易贪吃蛇游戏】软件实习项目二

    一.项目准备 需求分析: 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后" ...

  2. 贪吃蛇 java下载_Java实现贪吃蛇游戏源码

    本文实例为大家分享了Java实现贪吃蛇游戏源码的具体代码,供大家参考,具体内容如下 1.StartGame package com.qiang.snake; import javax.swing.*; ...

  3. 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结

    前言 刚开始是学习前端那会,在熟悉 HTML+CSS+JS 后,我开始尝试去做贪吃蛇游戏.没想到在一顿瞎搞后还真搞出来了一个简陋版的贪吃蛇.哈哈!因为这是我刚开始学习前端的时候做的,所以代码有点简陋, ...

  4. java+手柄开发_手把手教你用java轻轻松松开发贪吃蛇游戏

    贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我 ...

  5. 贪吃蛇游戏java代码_Java实现贪吃蛇游戏

    最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现 * 蛇: 采用单链表记录首尾,整个蛇被分为lattic ...

  6. Java的GUI编程---贪吃蛇游戏实现

    绘制静态窗口 代码实现 package com.akita.snake;import javax.swing.*;public class StartGames {public static void ...

  7. C++ 开发贪吃蛇游戏总结

    一.思考贪吃蛇的思路: 1.在一个窗口绘制贪吃蛇,肯定少不了绘制的API,所以必不可少需要引入graphics.h这个图形界面库(里面封装了WIN 32大部分绘制API,如果没有的话,可以用GDI). ...

  8. java贪吃蛇设计流程_JAVA版贪食蛇(贪吃蛇)游戏的设计与实现(含录像)

    JAVA版贪食蛇(贪吃蛇)游戏的设计与实现(含录像)(任务书,开题报告,外文翻译,毕业论文12000字,程序代码,MySQL数据库,答辩PPT,答辩视频录像) 摘要 "贪食蛇"游戏 ...

  9. java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法

    这篇文章主要介绍了Java GUI编程之贪吃蛇游戏简单实现方法,详细分析了贪吃蛇游戏的具体实现步骤与相关注意事项,并附带demo源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了Java GUI ...

最新文章

  1. linux下typora安装
  2. UOJ #214 [UNR #1]合唱队形 (概率期望计数、DP、Min-Max容斥)
  3. 计算机基础中的分层教学,分层教学法在计算机基础课程中的应用研究
  4. 知识点025-服务器的基础优化脚本
  5. 玩转控件:对Dev的GridControl控件扩展
  6. HTML5 参数传递
  7. php 三种传递函数,php – 是否可以将传递函数传递给包含的文件?
  8. NTT Docomo研究主管Kazuaki OBANA:NTT DOCOMO NFV案例解析
  9. Python Cookbook 资料链接
  10. 跨站点脚本编制-XSS 描述及解决方法
  11. linux常用命令之压缩打包
  12. java实现贪吃蛇小游戏(源码+注释)
  13. 图书管理系统(C语言实现)
  14. 计算机二级证能落户嘛,有哪些二级技师证可以办理落户深圳 - 入户吐槽网
  15. Java 常量字符串过长
  16. 解决Permission denied: user=root, access=WRITE, inode=“/“:root:supergroup:drwxr-xr-x问题
  17. 计算机word设置段落为两栏,Word里怎么把一段分成两栏并加分隔
  18. 村上春树 --《当我谈跑步时,我谈些什么》句子摘录​
  19. 爬虫-12306余票查询
  20. Alphago进化史 漫画告诉你Zero为什么这么牛

热门文章

  1. 双屏Android NDS模拟器,Android DraStic(NDS模拟器)r2.5.2.1a 内购版+金手指
  2. 【单片机毕业设计】【mcuclub-hj-005-5】基于单片机的空气质量(有害混合气体)检测的设计
  3. uml通信图画法_UML通信图参考.ppt
  4. latex 根据 excel, csv 的数据生成表格
  5. GJB6600-装备交互式电子技术手册
  6. 怎么查找html元素
  7. 程序设计-在校整理-02 食堂自动化管理系统
  8. cisco asa5520 基本配置一般网络机构来理解asa5520
  9. 暴风影音第五代发布:左眼技术画质超越DVD
  10. 泛微Excel文件导出