本文实现的功能有:

1.绘制静态窗口

2.绘制游戏面板

3.绘制静态小蛇

4.通过键盘控制小蛇移动

5.吃食物

6.积分系统和失败判定

最近在学GUI,然后又有读者希望我写一下相关的实战。刚好博主在b站漫无目的的寻找着题材的时候看到了一个写贪吃蛇游戏的视频,于是便写了这篇文章来怀念一下。快来和小伙伴们一起玩贪吃蛇吧兄弟们,(虽然编译器运行后的贪吃蛇是单机游戏,哈哈,但还是可以两个人轮流玩,比分数的)。

运用到的知识点:

GUI:java实现窗体、Swing。其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。

多线程:定时器、刷帧等。

注:代码来源b站的一个UP主:狂神。

游戏主启动类:

import javax.swing.*;//游戏主启动类
public class startGame {public static void main(String[] args) {JFrame frame=new JFrame();frame.setBounds(10,10,900,720);frame.setResizable(false);//窗口大小不可变frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//退出为系统退出frame.add(new GamePanel());frame.setVisible(true);}
}

图片等数据类:

import javax.swing.*;
import java.net.URL;
//数据中心
public class Data {public static URL headerURL=Data.class.getResource("/static/h.jpg");//顶部public static ImageIcon header=new ImageIcon(headerURL);public static URL upURL=Data.class.getResource("/static/s.png");//上public static ImageIcon up=new ImageIcon(upURL);public static URL downURL=Data.class.getResource("/static/x.png");//下public static ImageIcon down=new ImageIcon(downURL);public static URL leftURL=Data.class.getResource("/static/l.png");//左public static ImageIcon left=new ImageIcon(leftURL);public static URL rightURL=Data.class.getResource("/static/r.png");//右public static ImageIcon right=new ImageIcon(rightURL);public static URL bodyURL=Data.class.getResource("/static/st.png");//身体public static ImageIcon body=new ImageIcon(bodyURL);public static URL foodURL=Data.class.getResource("/static/food.png");//食物public static ImageIcon food=new ImageIcon(foodURL);
}

画板(功能实现)类:

这里面又涉及到了一个不是GUI的知识点:定时器,定时器是一种控制任务延时调用,或者周期调用的技术。这是多线程里面的知识,有疑问的可以去看看我之前写的多线程的文章。

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];//蛇的x坐标 25*25int snakey []=new int[500];//蛇的y坐标 25*25String fx;//食物的坐标int foodx;int foody;Random random=new Random();int score;//成绩//游戏当前的状态:开始 停止boolean isStart=false;//默认是停止boolean isFail=false;//默认游戏状态失败//定时器 以毫秒为单位 1000ms=1sTimer timer=new Timer(100,this);//100毫秒刷新(执行)一次//构造器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;}//绘制面板,我们游戏中的所有东西都是用这个画笔来画@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);Data.header.paintIcon(this,g,155,11);//顶部标题写上去g.fillRect(25,75,850,600);//默认的游戏界面//画积分g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度:"+length,650,30);g.drawString("积分:"+score,650,55);//画食物Data.food.paintIcon(this,g,foodx,foody);//把小蛇画上去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]);//蛇头初始化向下,需要通过方向来判断}//从第一节身体开始变化所以i=1for (int i = 1; i <length ; i++) {Data.body.paintIcon(this,g,snakex[i],snakey[i]);}//游戏状态if(isStart==false){g.setColor(Color.white);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("按下空格开始游戏",300,300);}if(isFail){g.setColor(Color.RED);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("游戏失败,按下空格重新开始!",200,300);}}//键盘监听事件@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_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";}}//事件监听,需要通过固定的时间(事件)来刷新@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//如果游戏是开始状态,就让小蛇动起来//吃食物if(snakex[0]==foodx&&snakey[0]==foody){length++;//长度加1//分数加10score=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]=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("D")){snakey[0]=snakey[0]+25;if(snakey[0]>650){//边界判断snakey[0]=75;}}else if(fx.equals("U")){snakey[0]=snakey[0]-25;if(snakey[0]<75){//边界判断snakey[0]=650;}}//失败判定:撞到自己就算失败for (int i = 1; i <length ; i++) {if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){isFail=true;}}repaint();//重画界面}timer.start();//定时器开启}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}}

相关图片:

在项目下创建一个单独的包,先把图片保存到自己的电脑上,然后复制图片,选中项目中刚刚创建的包,粘贴到上面,再把这些图片重命名一下,保持和数据类中的路径名一样即可。

运行后的结果:

本文中的实现代码其实还有一个缺陷,就是小蛇可以回头,就是小蛇的头可以向最前面的身体方向转,但这样小蛇就会因为碰到自己的身体而被判定为游戏失败。但现实中的贪吃蛇游戏,小蛇并不能回头,所以这里其实还可以再完善一下。这个问题有兴趣的读者可以自己去完善哦,利于更加理解这些代码。

JAVA实现贪吃蛇游戏相关推荐

  1. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...

    image.png image.png java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame(& ...

  2. JAVA简易贪吃蛇游戏实现

    JAVA简易贪吃蛇游戏实现 自学java不久,最近看了些GUI编程,就拿贪吃蛇练个手,很基础 刚学的 也是最简易的版本.纯粹就想通过博客记录来巩固自己的学习效果. 游戏介绍 玩家通过按键控制蛇身的移动 ...

  3. 基于java的贪吃蛇游戏

    贪吃蛇的游戏开发 实验内容: 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右 控制"蛇"的移动,吃到"豆子"以后 ...

  4. Java项目:贪吃蛇游戏(java+swing)

    源码获取:博客首页 "资源" 里下载! 功能简介: 贪吃蛇游戏 大嘴鱼洁面类.完成大嘴鱼的界面的绘制: /*** 大嘴鱼洁面类.完成大嘴鱼的界面的绘制.*/ public clas ...

  5. Java版贪吃蛇游戏

    实现代码: public class Main {public static void main(String[] args) {WelcomeJFrame jg=new WelcomeJFrame( ...

  6. Java编程---贪吃蛇游戏

    目标: 制作使用Java语言编写贪吃蛇小游戏,实现基本贪吃蛇功能.更深刻体会Java语言的应用. 功能简介: 在本游戏中,开始游戏前有设置项可以选择.首先,可以选择是否显示网卡.其次,设置地图,共提供 ...

  7. java超级简单贪吃蛇_java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; pu ...

  8. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

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

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

  10. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

最新文章

  1. python文件编译_我算是白学Python了,现在才知道原来Python是可以编译的
  2. 【转】工厂模式面向接口编程
  3. go语言游戏编程-Ebiten使用矩阵实现对图的缩放和移动
  4. 关闭防火墙和selinux
  5. 数学 希腊字母 Greek Alphabet
  6. SetFormFullScreen()窗体全屏显示
  7. 全自动安装 linux光盘,CentOS 7.1全自动安装光盘制作详解
  8. python 下载文件-Python实现HTTP协议下的文件下载方法总结
  9. 用DISKGEN恢复硬盘数据
  10. 【水果识别】基于matlab GUI RGB+HSV水果成熟度分级系统【含Matlab源码 825期】
  11. CSharp_DevExpress_DXperience_Universal_11.1.6 下载+源码+编译
  12. 51单片机学习笔记0 -- 仿真软件安装(Protues8.0)
  13. ubuntu16.04安装theano
  14. 研发工程师-编程题(python)
  15. android 定时器 误差,运动会计时器(PC+安卓)版本
  16. poi创建excel表打不开——文件格式与扩展名不匹配
  17. OSChina 周一乱弹 —— 带你装逼带你飞~
  18. 如何在2019年开发Android应用程序:拥抱“新” Android
  19. 智利银行在勒索软件攻击后关闭了所有分行
  20. Vue.js 父子组件通信的十种方式;告诉世界前端也能做 AI;你可能不知道的14个JavaScript调试技巧...

热门文章

  1. 增长黑客手册:如何用数据驱动爆发式增长_思维导图
  2. 多线程如何等待所有子线程一起完成任务后再执行主线程
  3. 运行python.exe文件出现AttributeError: module ‘moviepy.audio.fx.all‘ has no attribute ‘audio_fadein‘
  4. 中国居民身份证上的信息英语翻译
  5. HTML5+CSS3教程1
  6. viper4android资源分享,一步一步教你如何使4.42版本ROOT并且安装Viper4Android音效软件...
  7. 【亚伦博客】《蝙蝠侠前传2:黑暗骑士》里发生了什么
  8. Verilog编写VGA控制器
  9. php动态页面加载慢,小结:PHP动态网页程序优化及高效提速问题
  10. kmplayer 修改快捷键——以倍速播放为例