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. Unity 游戏框架搭建 2019 (十八~二十) 概率函数 & GameObject 显示、隐藏简化 & 第二章 小结与快速复习

    在笔者刚做项目的时候,遇到了一个需求.第一个项目是一个跑酷游戏,而跑酷游戏是需要一条一条跑道拼接成的.每个跑道的长度是固定的,而怪物的出现位置也是在跑道上固定好的.那么怪物出现的概率决定一部分关卡的难 ...

  2. 【tensorflow2.0】处理时间序列数据

    国内的新冠肺炎疫情从发现至今已经持续3个多月了,这场起源于吃野味的灾难给大家的生活造成了诸多方面的影响. 有的同学是收入上的,有的同学是感情上的,有的同学是心理上的,还有的同学是体重上的. 那么国内的 ...

  3. WDK驱动开发点滴

    老程序员做新方向,老树发新芽,作为菜鸟的我,写点心得,用以记录并与同行交流 1对一些概念的理解: KMDF与UMDF.两者的框架,及使用VS生成的初始代码基本相同,只有所包含的头文件不同,链接的系统库 ...

  4. 【tensorflow2.0】AutoGraph的机制原理

    有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph. TensorFlow 2.0主要使用的是动态计算图和Autograph. 动态计算图易于调试,编码效率较高,但执行效率偏低. ...

  5. day 1 硬件组成概念及介绍笔记

    一.服务器的种类: 硬件服务器: 1.机架式服务器 2.刀片式服务器 3.塔式服务器 虚拟服务器: 阿里云 aws 腾讯云 二.详细硬件组成: 1.电源  ----心脏(供电) 冗余特性    ups ...

  6. LVS 集群与存储《路由转发》

                                                             LVS 集群与存储<路由转发> 集群简介 u 什么是集群 •  一组通过高 ...

  7. discuz 用户整合 账号整合 ucenter php网站整合discuz用户

    引用:https://www.cnblogs.com/kenkofox/archive/2011/09/18/2180649.html 1.登录后台管理.(在论坛中,用创建论坛的admin账号登陆,然 ...

  8. bat批处理文件搞定所有系统问题

     bat批处理文件搞定所有系统问题  分类: WINDOWS   -----------bat批处理文件搞定所有系统问题---------   一.查漏补缺——给系统功能添把火  我们的操作系统虽然功 ...

  9. 数据结构和算法(Golang实现)(29)查找算法-2-3树和左倾红黑树

    某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较为简单,容易教学.在这里,我们区分开左倾红黑树和普通红黑树. 红黑树 ...

  10. AJ学IOS 之CoreLocation指南针小应用

    AJ分享,必须精品 一:效果图示 简单的用到CoreLocation获取方位做的指南针小应用 二:制作思路 具体用到了CoreLocation相关的知识,请看上一篇博客有写 然后获取方向不需要进行授权 ...