Java实现贪吃蛇游戏(1小时学会)

今天就来拿贪吃蛇小游戏来练练手吧!

贪吃蛇游戏规则:

1.按下空格键(游戏未结束)则游戏暂停或开始;

2.按下空格键(游戏结束后)则游戏重新开始;

3.当贪吃蛇的头部撞到身体时则贪吃蛇死亡(游戏结束);

4.当贪吃蛇的头部撞到墙时贪吃蛇死亡(游戏结束);

游戏界面效果:

我们可以看到自己的贪吃蛇吃了多少食物,以及游戏得分。下面是游戏效果图:

源码(注释超详细,注意ImageDate类中的material是一个包名,里面存放的是游戏素材图片):

package program_code;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import java.rmi.server.SkeletonMismatchException;
import java.util.Random;
import java.util.Timer;

import javax.naming.InitialContext;
import javax.naming.InsufficientResourcesException;
import javax.naming.directory.DirContext;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.xml.crypto.Data;

public class Main {
 public static void main(String[] args) {
 // 初始化贪吃蛇游戏界面
 JFrame frame = new JFrame("贪吃蛇小游戏--bingongzi"); // 创建一个窗体对象
 frame.setSize(900, 800); // 设置窗体大小为900x800
 frame.setLocationRelativeTo(null); // 设置窗体为居中格式
 frame.setResizable(false); // 设置窗体不可改变

 frame.add(new GamePanel());// 在窗体中添加一个面板
 frame.setVisible(true); // 设置窗体可见
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 结束窗口所在的应用程序
 }
}

// 存储图片
class ImageData {
 // 面板logo url:定位图片的地址 ImageIcon:根据url获得图片
 // Class<T>中public URL getResource(String name)查找带有给定名称的资源。
 private static URL headerurl = ImageData.class.getResource("/material/header.jpg");
 public static ImageIcon header = new ImageIcon(headerurl);
 // 获取蛇头向上的图片
 private static URL upurl = ImageData.class.getResource("/material/up.png");
 public static ImageIcon up = new ImageIcon(upurl);
 // 获取蛇头向右的图片
 private static URL righturl = ImageData.class.getResource("/material/right.png");
 public static ImageIcon right = new ImageIcon(righturl);
 // 获取蛇头向下的图片
 private static URL downurl = ImageData.class.getResource("/material/down.png");
 public static ImageIcon down = new ImageIcon(downurl);
 // 获取蛇头向左的图片
 private static URL lefturl = ImageData.class.getResource("/material/left.png");
 public static ImageIcon left = new ImageIcon(lefturl);
 // 获取蛇身的图片
 private static URL bodyurl = ImageData.class.getResource("/material/body.png");
 public static ImageIcon body = new ImageIcon(bodyurl);
 // 获取食物的图片
 private static URL foodurl = ImageIcon.class.getResource("/material/food.png");
 public static ImageIcon food = new ImageIcon(foodurl);
}

// 用面板制作游戏界面
class GamePanel extends JPanel implements KeyListener, ActionListener {
 int len; // 定义贪吃蛇的长度
 int[] snakeX = new int[35]; // 定义蛇的横坐标x
 int[] snakeY = new int[28]; // 定义蛇的纵坐标y
 String dir = "R";// 蛇头方向:R:向右,D:向下,L:向左,U:向上
 boolean isStart = false;// 表示贪吃蛇游戏是否开始,初始化为还没开始
 javax.swing.Timer timer = new javax.swing.Timer(200, this);// 定时器,第一个参数:定时执行事件
 int foodX;// 定义食物的横坐标
 int foodY;// 定义食物的纵坐标
 int score;// 定义游戏得分
 Random random = new Random();// 创建随机数对象
 boolean isOver = false;// 表示游戏是否失败,结束
 // 初始化以上变量数据

 public GamePanel() {
 Init();
 this.setFocusable(true);// 获取焦点事件
 this.addKeyListener(this);// 添加键盘监听事件
 timer.start(); // 时间开始
 }

 // 初始化游戏数据
 public void Init() {
 len = 3;// 游戏开始前静态界面上,加上蛇头,有三节(蛇身两节)即蛇长度为3
 // 初始化蛇头位置
 snakeX[0] = 200;
 snakeY[0] = 200;
 // 初始化第一个蛇身位置
 snakeX[1] = 175;
 snakeY[1] = 200;
 // 初始化第二个蛇身位置
 snakeX[2] = 150;
 snakeY[2] = 200;
 dir = "R";// 初始化蛇头方向向右
 // 随机生成食物坐标
 foodX = 50 + 25 * random.nextInt(32);
 foodY = 100 + 25 * random.nextInt(25);
 // 游戏积分初始化为0
 score = 0;
 }

 // 画面板
 @Override
 protected void paintComponent(Graphics g) {
 // TODO Auto-generated method stub
 super.paintComponent(g); // 清屏效果
 this.setBackground(Color.white); // 设置面板的背景颜色
 ImageData.header.paintIcon(this, g, 25, 10); // 绘制面板头部图片即(logo)
 g.fillRect(25, 75, 850, 675); // 绘制游戏区域
 // 绘制游戏积分板块
 g.setColor(Color.RED);
 g.setFont(new Font("宋体", Font.BOLD, 20));
 g.drawString("长度:" + len, 680, 30);
 g.drawString("分数:" + score, 680, 55);
 // 控制蛇头方向及位置
 if (dir.equals("R")) {// 当蛇头向右时
 ImageData.right.paintIcon(this, g, snakeX[0], snakeY[0]);
 } else if (dir.equals("D")) {// 当蛇头向下时
 ImageData.down.paintIcon(this, g, snakeX[0], snakeY[0]);
 } else if (dir.equals("L")) {// 当蛇头向左时
 ImageData.left.paintIcon(this, g, snakeX[0], snakeY[0]);
 } else if (dir.equals("U")) {// 当蛇头向上时
 ImageData.up.paintIcon(this, g, snakeX[0], snakeY[0]);
 }
 // 绘制蛇身
 for (int i = 1; i < len; i++) {
 ImageData.body.paintIcon(this, g, snakeX[i], snakeY[i]);
 }
 ImageData.food.paintIcon(this, g, foodX, foodY);// 根据随机坐标绘制食物
 // 游戏开始前的提示
 if (isStart == false) {
 g.setColor(Color.white);
 g.setFont(new Font("宋体", Font.BOLD, 40));
 g.drawString("按下空格键开始游戏", 245, 400);
 g.drawString("吃一个食物得10分", 265, 450);
 }
 // 游戏失败,结束
 if (isOver) {
 g.setColor(Color.RED);
 ;
 g.setFont(new Font("宋体", Font.BOLD, 40));
 g.drawString("游戏失败,按下空格键则重新开始游戏", 100, 400);
 g.drawString("吃一个食物得10分", 260, 450);
 }
 }

 // 键盘监听事件:按键控制游戏是否开始
 @Override
 public void keyPressed(KeyEvent e) {
 // TODO Auto-generated method stub
 // 键盘按下未释放
 int keyCode = e.getKeyCode();
 if (keyCode == KeyEvent.VK_SPACE) {
 if (isOver) {// 当游戏失败时重新开始游戏
 isOver = false;
 Init();
 // new GamePanel();//重新进入游戏
 } else {// 当游戏为结束时,按下空格键暂停游戏
  // 如果按下空格键
 isStart = !isStart;// 控制游戏开关取反
 }
 repaint();// 重新绘制界面
 }
 // 按键上下左右控制贪吃蛇的头部方向
 if (keyCode == KeyEvent.VK_RIGHT) {
 if (dir.equals("L") == false) {
 dir = "R";// 如果蛇当前移动的方向不是向左时,则可以向右移动
 }
 } else if (keyCode == KeyEvent.VK_DOWN) {
 if (dir.equals("U") == false) {
 dir = "D";// 如果蛇当前移动的方向不是向上时,则可以向下移动
 }
 } else if (keyCode == KeyEvent.VK_LEFT) {
 if (dir.equals("R") == false) {
 dir = "L";// 如果蛇当前移动的方向不是向右时,则可以向左移动
 }
 } else if (keyCode == KeyEvent.VK_UP) {
 if (dir.equals("D") == false) {
 dir = "U";// 如果蛇当前移动的方向不是向右时,则可以向左移动
 }
 }
 }

 @Override
 public void keyTyped(KeyEvent e) {

 }

 @Override
 public void keyReleased(KeyEvent e) {

 }

 // 定时器执行的操作
 @Override
 public void actionPerformed(ActionEvent e) {
 // TODO Auto-generated method stub
 // 如果游戏处于开始状态,并且没有结束,则蛇可以移动
 if (isStart == true && isOver == false) {
 // 右移:让后一个移到前一个的位置即可
 for (int i = len - 1; i > 0; i--) {
 snakeX[i] = snakeX[i - 1];
 snakeY[i] = snakeY[i - 1];
 }
 // 贪吃蛇头部按照按键控制的方向移动
 if (dir.equals("R")) {
 snakeX[0] = snakeX[0] + 25;// 蛇头向右移动一个单位:25为一个单位
 if (snakeX[0] >= 850) {
  // snakeX[0] = 50;//如果蛇头超出有边界则贪吃蛇从墙的左边出来
  isOver = true;// 贪吃蛇撞墙,游戏失败
 }
 } else if (dir.equals("D")) {// 蛇头向下移动一个单位
 snakeY[0] = snakeY[0] + 25;
 if (snakeY[0] >= 725) {
  // snakeY[0] = 100;//如果蛇头超出有边界则贪吃蛇从墙的上边出来
  isOver = true;// 贪吃蛇撞墙,游戏失败
 }
 } else if (dir.equals("L")) {// 蛇头向左移动一个单位
 snakeX[0] = snakeX[0] - 25;
 if (snakeX[0] <= 25) {
  // snakeX[0] = 850;//如果蛇头超出有边界则贪吃蛇从墙的右边出来
  isOver = true;// 贪吃蛇撞墙,游戏失败
 }
 } else if (dir.equals("U")) {// 蛇头向上移动一个单位
 snakeY[0] = snakeY[0] - 25;
 if (snakeY[0] <= 75) {
  // snakeY[0] = 725;//如果蛇头超出有边界则贪吃蛇从墙的下边出来
  isOver = true;// 贪吃蛇撞墙,游戏失败
 }
 }
 // 如果蛇头到达食物位置,则把食物吃掉
 if (snakeX[0] == foodX && snakeY[0] == foodY) {
 len++; // 蛇的长度加一
 score += 10;// 分数加10
 // 更新食物坐标
 foodX = 50 + 25 * random.nextInt(32);
 foodY = 100 + 25 * random.nextInt(24);
 }
 // 循环判断蛇头是否撞到蛇身
 for (int i = 1; i < len; i++) {
 if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
  isOver = true;// 如果蛇头撞到蛇身则游戏结束
 }
 }
 //repaint();
 repaint(25, 0, 850, 745);// 不断的更新游戏区域页面,实现动画效果
 timer.start();//启动计时器
 }
 }

}

游戏用到的图片如下(蛇身、向下的蛇头、食物、logo、向左的蛇头、向右的蛇头、向上的蛇头):

更多精彩游戏,请参考专题《java经典小游戏》

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java贪吃蛇极速版

    本文为大家推荐了一款由java实现经典小游戏:贪吃蛇,相信大家都玩过,如何实现的呐? 效果图: 废话不多说,直接奉上代码: 1. public class GreedSnake { public static void main(String[] args) { SnakeModel model = new SnakeModel(20,30); SnakeControl control = new SnakeControl(model); SnakeView view = new SnakeVi

  • Java贪吃蛇游戏完善版

    很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:贪吃蛇源码下载 Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point

  • java贪吃蛇游戏编写代码

    本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1.采用MVC(model.view.control)框架模式 2.包和类的关系树形图为: 3.源码: package com.huai; import Java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.u

  • java中使用双向链表实现贪吃蛇程序源码分享

    使用双向链表实现贪吃蛇程序 1.链表节点定义: package snake; public class SnakeNode { private int x; private int y; private SnakeNode next; private SnakeNode ahead; public SnakeNode() { } public SnakeNode(int x, int y) { super(); this.x = x; this.y = y; } public int getX(

  • 用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.setBounds(100,100,900,720); jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON

  • java编写贪吃蛇小游戏

    废话不多说,直接奉上代码: Frame.java package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import

  • Java swing框架实现的贪吃蛇游戏完整示例

    本文实例讲述了Java swing框架实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: java是门高级语言,做游戏时适合做后台,但是用它也可以做游戏.闲来无事做的时候可以用来写点小游戏,练习练习预防早衰哈哈! 闲话不说了 下面是以前练习的作品,不怕大家笑话,那个时候用了一个礼拜才做出来的. 源码如下供大家学习. 使用的是java的 swing  Jframe Jpanel JButton   当然你也可以使用awt 先来看看运行效果: 具体代码: package Tcs; /** * * *

  • Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package snake; /** * * @author hjn * */ public class Constant { /** * 蛇方移动方向:左边 */ public static final int LEFT = 0; /** * 蛇方移动方向:右边 */ public static final int R

  • Java实现贪吃蛇游戏源码

    本文实例为大家分享了Java实现贪吃蛇游戏源码的具体代码,供大家参考,具体内容如下 1.StartGame package com.qiang.snake; import javax.swing.*; //游戏的主启动类 public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setResizable(false); //窗口大小不可变 frame.s

  • java实现贪吃蛇游戏代码(附完整源码)

    先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame("贪吃蛇游戏"); //设置大小 frame.setBounds(10, 10, 900, 720); 向窗口中添加控件 可以直接用add方法往窗口中添加控件 这里我创建GamePanel类继承自Panel,最后使用add方法添加GamePanel 加载图片 图片加载

  • Java 实现贪吃蛇游戏的示例

    游戏界面基本布局 贪吃蛇是基于JFrame的一款小游戏.它主要有两部分组成,一个是显示区域,一个是按钮区域.这两个区域都用JPanel来实现. 首先需要创建一个基于JFrame的类,例如创建一个MyFrame,让其继承于JFrame. 然后创建一个显示区域的类MyPanel,一个按钮区域的类Button,当然了这两个类都基于JPanel. 第三步:在MyFrame类中实例化两个JPanel类.并在MyFrame构造方法中设置窗体的logo.窗体的标题.窗体初始位置.窗体的大小.窗体的背景颜色.窗

  • Java实现贪吃蛇游戏的示例代码

    目录 项目演示 项目实战 1. 游戏的主启动类 2. 游戏的面板 3. 数据中心 4. 绘制静态面板 5. 绘制静态小蛇 6. 绘制动态小蛇 7. 设置游戏状态 8. 让蛇动起来 9. 绘制食物布局 10. 游戏失败判定 11. 积分获取系统 12. 游戏优化 项目演示 项目演示地址 项目实战 1. 游戏的主启动类 作为贪吃蛇游戏的主启动类,构建了顶级窗口,可以容纳各种面板, package Snake; import javax.swing.*; /** * 游戏的主启动类 */ public

  • Java实现贪吃蛇游戏(1小时学会)

    今天就来拿贪吃蛇小游戏来练练手吧! 贪吃蛇游戏规则: 1.按下空格键(游戏未结束)则游戏暂停或开始: 2.按下空格键(游戏结束后)则游戏重新开始: 3.当贪吃蛇的头部撞到身体时则贪吃蛇死亡(游戏结束): 4.当贪吃蛇的头部撞到墙时贪吃蛇死亡(游戏结束): 游戏界面效果: 我们可以看到自己的贪吃蛇吃了多少食物,以及游戏得分.下面是游戏效果图: 源码(注释超详细,注意ImageDate类中的material是一个包名,里面存放的是游戏素材图片): package program_code; impo

  • Java实现贪吃蛇游戏

    最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现  * 蛇: 采用单链表记录首尾,整个蛇被分为lattice格子,放在map里  * 移动: 我在实现的过程中发现最难得反而是蛇的定义和实现.一直想着怎么样用单独的方法表示出蛇来,但是如果将蛇单独实现,总有些细节实现起来特别麻烦 其实蛇移动并非牵一发而动全身,其实身子是没有发生变化的,关键是两点: a.头的移动 b.尾巴的移动 实现: 直接把蛇实现在地图

  • java实现简易贪吃蛇游戏

    本文实例为大家分享了java实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.封装贪吃蛇身体,抽象出贪吃蛇结点类Node,结点用ArrayList存储 import java.awt.*; public class Node { private int x; private int y; public Node(int x, int y) { this.x = x; this.y = y; } public Node(){ } public int getX() { return x; }

随机推荐