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. sql select sql查询

    select 一.课上练习代码 1 查询所有学生信息 select * from tb_student; select * from tb_teacher; 2 查询所有课程名称及学分(投影和别名) ...

  2. el-table分页展示数据

    <el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" :show- ...

  3. Blazor入门笔记(6)-组件间通信

    1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 在使用B ...

  4. 【网络安全】——客户端安全(浏览器安全、XSS、CSRF、Clickjacking)

    ​ 近在学习网络安全相关的知识,于是先从业内一本系统讲Web安全的书<白帽子讲Web安全>系统学习Web安全的相关知识.在此整理书中的知识层次,不求详尽,只求自己对整个Web安全梗概有所了 ...

  5. 云计算介绍、TCP/IP协议及配置

                                                 云计算介绍.TCP/IP协议及配置 1案例1:配置计算机名及工作组 1.1问题 本例要求为修改计算机名并加入工 ...

  6. 30.6 HashMap的使用

    /* * * 使用HashMap存储数据并遍历(字符串作为key) * *使用HashMap存储数据并遍历(自定义对象作为key) */ 字符串做key和Map的使用一样,重点介绍自定义对象作为key ...

  7. std::string::append函数

    string& append (const string& str); string& append (const string& str, size_t subpos ...

  8. 在linux中使用mailx发送邮件

    [root@ml ~]# yum -y install mailx   #安装 [root@ml ~]# vim /etc/mail.rc 在最后一行添加(我这里使用的是qq邮箱): @qq.com ...

  9. 【半监督学习】MixMatch、UDA、ReMixMatch、FixMatch

    半监督学习(Semi-Supervised Learning,SSL)的 SOTA 一次次被 Google 刷新,从 MixMatch 开始,到同期的 UDA.ReMixMatch,再到 2020 年 ...

  10. Python工业互联网监控项目实战3—websocket to UI

    本小节继续演示如何在Django项目中采用早期websocket技术原型来实现把OPC服务端数据实时推送到UI端,让监控页面在另一种技术方式下,实时显示现场设备的工艺数据变化情况.本例我们仍然采用比较 ...