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 MySQL5.7 安装 centos docker

    MySQL5.7 安装 1 . 普通安装 # 准备工作 停止以前的数据库并删除配置文件 systemctl stop mysqld rpm -e mysql-community-server-5.7. ...

  2. ajax请求以及递归

    function f1() { console.log("hello"); f1(); }; f1();//浏览器崩溃,因为没有结束条件——死循环 改进如下: var i=0; f ...

  3. ArrayList源码浅析

    这里只理解主要的常用方法: 1 public class ArrayList<E> extends AbstractList<E> 2 implements List<E ...

  4. 在函数中修改全局变量的值,需要加global关键字

    一.引用 使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字.如: #! /usr/bin/python a = 1 b = [2, 3] def func(): if ...

  5. 基于Taro.js和微信小程序云开发的移动端校园平台——《我的衡师》

    我学校教务处目前仅有电脑端,并不适配移动端,电脑端也只能使用IE6浏览器访问,兼容性差.我在没有api接口的情况下,通过Carles和Postman抓包,用node.js爬虫实现了后台和小程序的对接. ...

  6. Hadoop(五):HDFS的JAVA API基本操作

    HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...

  7. 插入排序(C语言版)

    #include<iostream>using namespace std;int n;void lan(int a[],int size){ for(int i = 0;i < s ...

  8. 切片-list、字符串

    切片-list.字符串   1.字符串,切片顾头不顾尾 s="123455" print(s[0:3])  结果:123 2.list d=[12,34,45] print(d[: ...

  9. ThinkPHP3.2.3集成微信分享JS-SDK实践

    先来看看微信分享效果:在没有集成微信分享js-sdk前是这样的:没有摘要,缩略图任意抓取正文图片 在集成微信分享js-sdk后是这样的:标题,摘要,缩略图自定义 一.下载微信SDK开发包下载地址:ht ...

  10. shell命令-while语句

    loop=1 while [ "$loop" -le 10 ] do echo "loop:$loop" loop=$(($loop+2)) done