Java一个简单的贪吃蛇
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一个简单的贪吃蛇的更多相关文章
- GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...
- TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...
- 【Java】GUI实现贪吃蛇
[Java]GUI实现贪吃蛇 前言 我们在做这个小游戏之前,得确保自己的AWT和Swing有一定的基础,并且会写一些简单的逻辑操作.这些都会在后面写的时候体现出来. 狂神老师从这里开始讲贪吃蛇的 我们 ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- d3.js 制作简单的贪吃蛇
d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...
- JavaScript实践-简单的贪吃蛇小游戏
实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...
- java一个简单的管理系统
用java实现的简单管理系统 运行出来的状态 实现了新增.删除.借出.归还.排行榜简单的功能! 下面是简单的代码 首先定义一个书籍类,自己打开哦! public class Book implemen ...
随机推荐
- 【python系统学习12】函数
函数 函数是一堆组织好的.可重复利用的.用来实现某一功能的代码. python中的input().print().type().bool().len()等都是函数.且是python的内置函数. 我们也 ...
- Day13 流程控制
Linux中的流程控制语句 一.if语句 1.单分支if条件语句 格式:if [ 条件判断式 ] then 程序 fi 注意:1.在Linux中是以if开头,fi结尾.其他地方一般是{开头,} ...
- Mybatis中的# 与 $
我们说MyBatis有两种注入参数的方式, - 一种是#{} - 另一种是${} 这两种从使用功能来看差距不大,那为什么会强推使用#? ${}使用的是拼接字符串,#{}使用的是占位符的方法,经过了处理 ...
- jQuerry点击按钮回到顶部功能
简单实现点击按钮回到顶部功能
- 创建一个tar备份包
创建一个tar备份包 2.1问题 本例要求使用tar工具完成以下备份任务: 创 ...
- Jmeter 压力测试笔记(1)--服务器迁移失败
近期,公司服务器因技术架构升级等原因需要迁移,在经过开发,运维DBA,测试多部门进行联合讨论后,制定出了迁移方案.迁移前也对APP应用进行了各种测试,并没有发现问题. 凌晨2点开始迁移,5点完成迁移. ...
- 【Linux】nginx服务配置
一. 部署LNMP环境 准备工作 Linux系统准备 设置IP 关闭防火墙 yum源配置 安装: 传输软件包 1. tar -zxvf lnmp1.2-full.tar.gz cd lnmp1.2-f ...
- Docker基础修炼2--Docker镜像原理及常用命令
通过前文的讲解对Docker有了基本认识之后,我们开始进入实战操作,本文先演示Docker三要素之镜像原理和相关命令. 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境,如果你本地没有 ...
- Google GMS介绍
Google GMS介绍GMS全称为GoogleMobile Service.GMS目前提供有Search.Search by Voice.Gmail.Contact Sync.Calendar Sy ...
- Linux bash篇(四 命令)
1.一次执行多个命令 ; eg: ls -al ; touch data.txt 2.根据情况执行命令 && || cmd1 && c ...