博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java小项目之贪吃蛇项目(图解超详细)
阅读量:3898 次
发布时间:2019-05-23

本文共 6527 字,大约阅读时间需要 21 分钟。

在刷视频的时候,看到了一个讲解用java写一个贪吃蛇的项目,于是想照猫画虎的学习仿制一下。

学习视频的地址:
也欢迎大家去支持一下这个up主。
首先在对应网站找到代码下载下来自己跑跑看:
下面的【遇见狂神说】贪吃蛇代码->.rar文件
在这里插入图片描述
然后放到idea下面,
在这里插入图片描述
在这里插入图片描述

发现可以正常运行,那么就可以开始仿照学习啦

所以首先创建一个普通的java项目:

在这里插入图片描述
然后改一下项目名称什么的,一路next即可。
然后照猫画虎地创建对应文件夹,一个是用来放代码的,一个是用来保存素材的
在这里插入图片描述
然后把刚刚下载下来的源代码里对应的statics里的素材放到我们的素材中去;
在这里插入图片描述
开始正式的写代码:
在snake包下面创建
StartGame类

package com.kuang.snake;import javax.swing.*;public class StartGames {
public static void main(String[] args) {
//首先创建一个静态窗口 JFrame,还能设置窗口名称 JFrame frame=new JFrame("贪吃蛇小游戏"); //再设置窗口大小,这个也是为了方便游戏到时候的位置确认 frame.setBounds(10,10,900,720); //并且设置一系列,比如窗口大小不可变这个也是为了之后的游戏位置确认的,且游戏可关闭 frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //然后就是最后的展现窗口 frame.setVisible(true); }}

现在运行就是这么一个结果

在这里插入图片描述

还需要再优化一下

再在snake包下面创建
GamePanel类,用来创建面板,

此时,就需要在之前的StartGame这边加上这段代码,相当于把这个面板导入进去:frame.add(new

GamePanel());

最终版的StartGame:

package com.kuang.snake;import javax.swing.*;public class StartGames {
public static void main(String[] args) {
//首先创建一个静态窗口 JFrame,还能设置窗口名称 JFrame frame=new JFrame("贪吃蛇小游戏"); //再设置窗口大小,这个也是为了方便游戏到时候的位置确认 frame.setBounds(10,10,900,720); //并且设置一系列,比如窗口大小不可变这个也是为了之后的游戏位置确认的,且游戏可关闭 frame.setResizable(false); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //把这个画板通过创建对象的方法导入进去 frame.add(new GamePanel()); //然后就是最后的展现窗口 frame.setVisible(true); }}

再创建一个Data类:

package com.kuang.snake;import javax.imageio.ImageIO;import javax.swing.*;import java.net.URL;//用来存放外部数据的图片public class Data {
//需要创建一个连接 //首先是把头部的地址和头部的图片生成,还用到反射的机制,路劲src这个路径 public static URL headerURL=Data.class.getResource("/statics/header.png"); public static ImageIcon head=new ImageIcon(headerURL); //这样子就能把图片放进去了 //照例把这些图片全都导入进去 //头部的上下左右 public static URL upUrl=Data.class.getResource("/statics/up.png"); public static URL downUrl=Data.class.getResource("/statics/down.png"); public static URL leftUrl=Data.class.getResource("/statics/left.png"); public static URL rightUrl=Data.class.getResource("/statics/right.png"); public static ImageIcon up=new ImageIcon(upUrl); public static ImageIcon down=new ImageIcon(downUrl); public static ImageIcon left=new ImageIcon(leftUrl); public static ImageIcon right=new ImageIcon(rightUrl); //身体的 public static URL bodyUrl=Data.class.getResource("/statics/body.png"); public static ImageIcon body=new ImageIcon(bodyUrl); //食物的 public static URL foodUrl=Data.class.getResource("/statics/food.png"); public static ImageIcon food=new ImageIcon(foodUrl);}

GamePanel类:

package com.kuang.snake;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 {
//这个是一个画板,在上面画蛇画图像 //Graphics这个类型就是一个画笔 //先设置一些变量,蛇的长度和蛇的x轴以及y轴坐标 int len; int[] snakeX=new int[600]; int[] snakeY=new int[500]; //这里在定义一个方向,并且默认是R String fx;//可以是R L U D //这里再初始化一个用来判断游戏是否开始的,如果没开始的话,就可以进行一些文字提示 boolean isStart=false; //这里需要初始化调用init,所以直接在构造函数里调用 //创建一个timer 参数就是隔着的时间和当前需要监听的对象 Timer timer=new Timer(100,this); //然后再这边定一个一个食物的属性,有坐标,还有一个随机数 int foodx; int foody; Random rand=new Random(); //再定义一个游戏失败 boolean isFail=false; //这里再加一个分数系统 int score; GamePanel(){
init(); //也不知道为什么,反正就是需要有,获取到键盘的监听事件 this.setFocusable(true); this.addKeyListener(this); } //然后对这个蛇进行初始化 public void init(){
//让蛇的长度为3,并且是头部,第一部分以及第二部分身体的长度设置好 len=3; snakeX[0]=100;snakeY[0]=100; snakeX[1]=75;snakeY[1]=100; snakeX[2]=50;snakeY[2]=100; //把方向放到这来初始化 fx="R"; //初始化的时候也要让他启动 timer.start(); //再把食物给初始化了,主要是位置 foodx=25+25*rand.nextInt(24); foody=75+25*rand.nextInt(24); //把分数初始化为0 score=0; } @Override protected void paintComponent(Graphics g) {
super.paintComponent(g);//作用是清屏 //可以先设置一下背景颜色 this.setBackground(Color.BLACK); //再试试看调用Data的头部数据 Data.head.paintIcon(this,g,25,11); //再这个的基础之上,绘制游戏的区域 g.fillRect(25,75,850,600); //然后开始话一个静态的小蛇,因为最初蛇头是朝右边的,所以头是right,然后就是两个位置 /*Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);*/ //这里通过方向也优化一下 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]); } /*Data.body.paintIcon(this,g,snakeX[1],snakeY[1]); Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);*/ //优化一下 for(int i=1;i
0;i--){
//这里要把Y也加上来,是因为,这个是一个整体的概念,上下左右都是会直接跟随的 snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } //在这里继续判断是朝那边 if(fx.equals("R")){
//对于头部来说,那就是往前移动25.右移,y是不动的 snakeX[0]=snakeX[0]+25; //但是在这里,解决蛇直接出边界的情况 if(snakeX[0]>800){
snakeX[0]=25; } }else if(fx.equals("L")){
//如果向左的话 snakeX[0]=snakeX[0]-25; //再进行边界判断 if(snakeX[0]<25){
snakeX[0]=800; } } else if(fx.equals("U")){
//如果是向上的话 snakeY[0]=snakeY[0]-25; //再进行越界处理 if(snakeY[0]<75){
snakeY[0]=650; } } else if(fx.equals("D")){
//如果是向上的话 snakeY[0]=snakeY[0]+25; //再进行越界处理 if(snakeY[0]>650){
snakeY[0]=75; } } //这里就需要吃食物了 if(snakeY[0]==foody&&snakeX[0]==foodx){
//如果和食物重合的话,那就是需要把长度加一 len++; //把分数也更新一下 score=score+10; //并且重新刷新一个食物位置 foodx=25+25*rand.nextInt(24); foody=75+25*rand.nextInt(24); } //这里就需要来判断游戏是否失败了 for(int i=1;i

完工!!

在这里插入图片描述

转载地址:http://lifen.baihongyu.com/

你可能感兴趣的文章
Cscope在emacs中的配置与使用
查看>>
emacs 2.4安装问题 ecb
查看>>
ecb里使用自定义快捷键切换窗口
查看>>
vim(gvim)支持对齐线
查看>>
CentOS编译安装Lighttpd1.4.28
查看>>
实践HTTP206状态:部分内容和范围请求
查看>>
【C++基础】拷贝构造函数的参数必须是引用类型
查看>>
【C++基础】virtual析构函数
查看>>
【Java基础】面向对象
查看>>
【Java.Web】web.xml详解
查看>>
J2EE的技术体系
查看>>
【Java.Web】Java Web应用程序的规范目录结构,*WEB组件的URL/入口*
查看>>
【基础篇】计算机网络
查看>>
OSI 7层详解
查看>>
【C++基础】重载overload、重写(覆盖)override、隐藏hide的区别
查看>>
【算法详解】洗牌算法
查看>>
【设计模式基础】行为模式 - 1 - 观察者(Observer)
查看>>
从关系型数据库到非关系型数据库
查看>>
【数据库基础】数据库事务 - Transaction
查看>>
【设计模式基础】行为模式 - 3 - 职责链(Chain of responsibility)
查看>>