Java一个简单的贪吃蛇

虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口。有助于半初学者强化理解。

直接上代码

游戏主体类:

package com.chenghu.snake;
import javax.swing.*;
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame(); //new一个窗体
frame.setBounds(10,10,1000,1000);//开一个窗体
frame.setResizable(false);//是否可拉伸
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //点击×关闭
frame.add(new GamePanel());//窗体上添加一个画布
frame.setVisible(true);//窗体可见
}
}

画布类:

package com.chenghu.snake;
import com.sun.xml.internal.ws.addressing.model.ActionNotSupportedException; 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 {//画布继承两个接口 KeyListener ,ActionListener监听键盘和事件
//下面定义一些变量
int length; //蛇身长度
int[] snakeX=new int[600];//蛇的坐标
int[] snakeY=new int[600];//蛇的坐标
String fx;//蛇头方向
boolean isStart;//游戏状态
Timer timer = new Timer(100, this);//定时器,100ms刷新
int foodx;//食物坐标
int foody;//食物坐标
Random random=new Random();//食物随机 、位置
public GamePanel(){//画布构造器 就是构造方法,里面初始化一些量
init();//初始化函数 初始化蛇的位置,游戏状态,食物位置
this.setFocusable(true);
this.addKeyListener(this);
}
public void init(){
length=3;
snakeX[0]=100;snakeY[0] =250;
snakeX[1]=75;snakeY[1] =250;
snakeX[2]=50;snakeY[2] =250;
fx="R";
foodx=25+25*random.nextInt(38);
foody=150+25*random.nextInt(28);
isStart=false;
timer.start(); } @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
this.setBackground(Color.white);
Data.header.paintIcon(this,g,25,11);//头部广告
g.fillRect(25,150,950,700);//游戏界面 //放小蛇
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]);
Data.food.paintIcon(this,g,foodx,foody);
if(isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格开始游戏",300,400);
}
} @Override
public void keyPressed(KeyEvent e) { //监听键盘
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE) {//监听空格
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";}
}
@Override
public void actionPerformed(ActionEvent e) { //监听事件 if(isStart){
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]>950) snakeX[0]=25;
}else if(fx.equals("L")){
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25) snakeX[0]=950;
}else if(fx.equals("U")){
snakeY[0]-=25;
if(snakeY[0]<150) snakeY[0]=825;
}else if(fx.equals("D")){
snakeY[0]+=25;
if(snakeY[0]>825) snakeY[0]=150;
}
if(snakeX[0]==foodx&&snakeY[0]==foody) {
length++;
foodx=25+25*random.nextInt(38);
foody=150+25*random.nextInt(28);
}
repaint();
}
timer.start();
}
@Override
public void keyReleased(KeyEvent e) { }
@Override
public void keyTyped(KeyEvent e) {}
}

素材类:

package com.chenghu.snake;
import javax.swing.*;
import java.net.URL;
public class Data { //这个类是定位需要的素材 图片
public static URL bodyurl=Data.class.getResource("snake/body.jpg");
public static ImageIcon body=new ImageIcon(bodyurl);
public static URL downurl=Data.class.getResource("snake/down.jpg");
public static ImageIcon down=new ImageIcon(downurl);
public static URL lefturl=Data.class.getResource("snake/left.jpg");
public static ImageIcon left=new ImageIcon(lefturl);
public static URL righturl=Data.class.getResource("snake/right.jpg");
public static ImageIcon right=new ImageIcon(righturl);
public static URL foodurl=Data.class.getResource("snake/body.jpg");
public static ImageIcon food=new ImageIcon(foodurl);
public static URL headerurl=Data.class.getResource("snake/timg.jpg");
public static ImageIcon header=new ImageIcon(headerurl);
public static URL upurl=Data.class.getResource("snake/up.jpg");
public static ImageIcon up=new ImageIcon(upurl);
}

​ 总结一下:简单实现了贪吃蛇,总体来说,想要的功能分三步实现,第一步:定义变量初始化数据,第二步:用画笔在画布上画出来,第三步:监听这个事件,有变化更改数据。

Java一个简单的贪吃蛇的更多相关文章

  1. GUI简单实战——贪吃蛇

    将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...

  2. TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇

    TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...

  3. 【Java】GUI实现贪吃蛇

    [Java]GUI实现贪吃蛇 前言 我们在做这个小游戏之前,得确保自己的AWT和Swing有一定的基础,并且会写一些简单的逻辑操作.这些都会在后面写的时候体现出来. 狂神老师从这里开始讲贪吃蛇的 我们 ...

  4. C#简单实现贪吃蛇程序(LinQ + Entity)

    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...

  5. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  6. 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)

    最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...

  7. d3.js 制作简单的贪吃蛇

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...

  8. JavaScript实践-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  9. java一个简单的管理系统

    用java实现的简单管理系统 运行出来的状态 实现了新增.删除.借出.归还.排行榜简单的功能! 下面是简单的代码 首先定义一个书籍类,自己打开哦! public class Book implemen ...

随机推荐

  1. CVE-2020-7961 Liferay Portal 复现分析

    漏洞说明: Liferay是一个开源的Portal(认证)产品,提供对多个独立系统的内容集成,为企业信息.流程等的整合提供了一套完整的解决方案,和其他商业产品相比,Liferay有着很多优良的特性,而 ...

  2. 线程间交换数据的Exchanger

    作者:Steven1997 链接:https://www.jianshu.com/p/9b59829fb191 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Exc ...

  3. extend()和append()的区别

    append()方法用于在列表末尾添加新的对象(对象可以是值或列表),一般用于添加列表项. extend()方法用于在列表末尾追加另一个序列中的多个值.

  4. centos默认终端bash美化、颜色设置

    centos默认终端bash是一个很简单的界面,又无法通过像zsh一样直接安装主题和代码高亮插件,但是我们可以在bashrc的配置文件中通过代码实现一部分功能: 1.代码介绍: 这里推荐一篇大佬的文章 ...

  5. 【电商】性能测试网站搭建:XAMPP1.8+DBShop1.3

    1.安装准备 1.1软件版本 XAMPP的版本:XAMPP 1.8.2 DBShop的版本:DBShop 1.3   1.2.安装环境 我的环境:win10 win7,win10都可以运行的,安装步骤 ...

  6. python使用阿里云oss-sdk

    python使用阿里云oss-python-sdk 请访问github获取源码 安装 pip install oss2 安装验证 >>> import oss2 >>&g ...

  7. go 锁和sync包

    一.什么是锁? sync.Mutex 是一个互斥锁,它的作用是守护在临界区入口来确保同一时间只能有一个线程进入临界区 在 sync 包中还有一个 RWMutex 锁:他能通过 RLock() 来允许同 ...

  8. excel中存储的时间的类型是什么

    做了一个excel导入数据的功能,其中需要导入时间,默认到天.在开发过程中发现了一个问题, 导入的数据解析到的时间格式是 02-03-19,发现年份前面的两位数丢失了.这当然是导入数据 的解析包的问题 ...

  9. Mac 下 brew 切换为国内源

    简介 Homebrew 是一款自由及开放源代码的软件包管理系统,用以简化 macOS 和 linux 系统上的软件安装过程.它拥有安装.卸载.更新.查看.搜索等很多实用的功能,通过简单的一条指令,就可 ...

  10. Linux 提高操作效率之 tab 命令补全

    最近在使用阿里云 ECS 时,发现 Centos 无法进行 tab 补全,特别影响操作效率,本文简单记录下 Linux 下的 tab 命令补全功能,希望对 Linux 初学者有所帮助. 安装 Linu ...