这几天学校内实训,搞什么贪吃蛇游戏。对于GUI编程我表示很无语,没办法,也得照做!

其实基本功能的源码并非我写出来的,只是在前人的基础上做了二次开发,增加了学校要求的实现吃宝物然后可以借助宝物实现“穿墙”,”穿身”的功能。

闲话少说,代码如下:

import javax.swing.JFrame;

public class SnakeGame {

public static void main(String[] args) {

SnakeFrame frame = new SnakeFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setTitle(“贪吃蛇游戏—实训项目”);

frame.setVisible(true);

}

}

//======第二个Java文件============

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.BorderFactory;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JPanel;

public class SnakeFrame extends JFrame {

private JLabel statusLabel;

private JLabel speedLabel;

private JLabel scoreLabel;

private JPanel snakePanel;

private JLabel baowuLabel;

private Snake snake;

private JMenuBar bar;

JMenu gameMenu;

JMenu speedMenu;

JMenuItem newItem;

JMenuItem pauseItem;

JMenuItem beginItem;

JMenuItem slowItem;

JMenuItem midItem;

JMenuItem fastItem;

public SnakeFrame() {

init();

ActionListener l = new ActionListener() {

public void actionPerformed(ActionEvent e) {

if (e.getSource() == pauseItem)

snake.isRun = false;

if (e.getSource() == beginItem)

statusLabel.setText(“Running”);

snake.isRun = true;

if (e.getSource() == newItem) {

newGame();

}

// ————菜单控制运行速度

if (e.getSource() == slowItem) {

snake.speed = Snake.SLOW;

speedLabel.setText(“慢    速”);

}

if (e.getSource() == midItem) {

snake.speed = Snake.MID;

speedLabel.setText(“中    速”);

}

if (e.getSource() == fastItem) {

snake.speed = Snake.FAST;

speedLabel.setText(“快    速”);

}

}

};

pauseItem.addActionListener(l);

beginItem.addActionListener(l);

newItem.addActionListener(l);

slowItem.addActionListener(l);

midItem.addActionListener(l);

fastItem.addActionListener(l);

addKeyListener(new KeyListener() {

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

// ————方向键改变蛇运行方向

case KeyEvent.VK_DOWN://

snake.changeDerection(Snake.DOWN);

break;

case KeyEvent.VK_UP://

snake.changeDerection(Snake.UP);

break;

case KeyEvent.VK_LEFT://

snake.changeDerection(Snake.LEFT);

break;

case KeyEvent.VK_RIGHT://

snake.changeDerection(Snake.RIGHT);

break;

// 空格键,游戏暂停或继续

case KeyEvent.VK_SPACE://

if (snake.isRun == true) {

snake.isRun = false;

snake.status = Snake.PAUSED;

break;

}

if (snake.isRun == false) {

snake.isRun = true;

snake.status = Snake.RUNNING;

break;

}

}

}

public void keyReleased(KeyEvent k) {

}

public void keyTyped(KeyEvent k) {

}

});

}

private void init() {

speedLabel = new JLabel();

snake = new Snake();

setSize(380, 460);

setLayout(null);

this.setResizable(false);

bar = new JMenuBar();

gameMenu = new JMenu(“游戏选项”);

newItem = new JMenuItem(“新游戏”);

gameMenu.add(newItem);

pauseItem = new JMenuItem(“暂    停”);

gameMenu.add(pauseItem);

beginItem = new JMenuItem(“开    始”);

gameMenu.add(beginItem);

speedMenu = new JMenu(“速度选择”);

slowItem = new JMenuItem(“慢    速”);

fastItem = new JMenuItem(“快    速”);

midItem = new JMenuItem(“中    速”);

speedMenu.add(slowItem);

speedMenu.add(midItem);

speedMenu.add(fastItem);

bar.add(gameMenu);

bar.add(speedMenu);

setJMenuBar(bar);

statusLabel = new JLabel();

scoreLabel = new JLabel();

snakePanel = new JPanel();

baowuLabel = new JLabel();

snakePanel.setBounds(0, 0, 300, 400);

snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));

add(snakePanel);

statusLabel.setBounds(300, 25, 60, 20);

add(statusLabel);

scoreLabel.setBounds(300, 20, 60, 20);

add(scoreLabel);

speedLabel.setBounds(310, 75, 60, 20);

add(speedLabel);

baowuLabel.setBounds(300, 35, 60, 20);

JLabel temp = new JLabel(“状态:”);

temp.setBounds(310, 5, 60, 20);

add(temp);

temp = new JLabel(“分数:”);

temp.setBounds(310, 105, 60, 20);

add(temp);

temp = new JLabel(“速度:”);

temp.setBounds(310, 55, 60, 20);

add(temp);

temp = new JLabel(“宝物:”);

temp.setBounds(310, 155, 60, 20);

add(temp);

}

private void newGame() {

this.remove(snakePanel);

this.remove(statusLabel);

this.remove(scoreLabel);

speedLabel.setText(“慢    速”);

statusLabel = new JLabel();

scoreLabel = new JLabel();

snakePanel = new JPanel();

snake = new Snake();

snakePanel = new SnakePanel(snake);

snakePanel.setBounds(0, 0, 300, 400);

snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));

Runnable r1 = new SnakeRunnable(snake, snakePanel);

Runnable r2 = new StatusRunnable(snake, statusLabel, scoreLabel, baowuLabel);

Thread t1 = new Thread(r1);

Thread t2 = new Thread(r2);

t1.start();

t2.start();

add(snakePanel);

statusLabel.setBounds(310, 25, 60, 20);

add(statusLabel);

scoreLabel.setBounds(310, 125, 60, 20);

add(scoreLabel);

baowuLabel.setBounds(310, 175, 60, 20);

add(baowuLabel);

}

}

==========第三个Java文件===========================

view plainprint?

import java.awt.Color;

import java.awt.Component;

import java.awt.Graphics;

import java.util.ArrayList;

import javax.swing.JLabel;

import javax.swing.JPanel;

class Snake {

boolean isRun;// ———是否运动中

ArrayList body;// —–蛇体

Node food;// ——–食物

Color color;

int derection;// ——–方向

int score;

int status;

int speed;

int baowu;

int baowuchuxian=0;

public static final int SLOW = 500;

public static final int MID = 300;

public static final int FAST = 100;

public static final int RUNNING = 1;

public static final int PAUSED = 2;

public static final int GAMEOVER = 3;

public static final int LEFT = 1;

public static final int UP = 2;

public static final int RIGHT = 3;

public static final int DOWN = 4;

public Snake() {

speed = Snake.SLOW;

score = 0;

baowu = 0;

isRun = false;

status = Snake.PAUSED;

derection = Snake.RIGHT;

body = new ArrayList();

body.add(new Node(30, 10));

body.add(new Node(20, 10));

body.add(new Node(10, 10));

makeFood();

}

// ————判断食物是否被蛇吃掉

// ——-如果食物在蛇运行方向的正前方,并且与蛇头接触,则被吃掉

private boolean isEaten() {

Node head = body.get(0);

if (derection == Snake.RIGHT && (head.x + Node.W) == food.x && head.y == food.y && color!=Color.black)

return true;

if (derection == Snake.LEFT && (head.x – Node.W) == food.x && head.y == food.y && color!=Color.black)

return true;

if (derection == Snake.UP && head.x == food.x && (head.y – Node.H) == food.y && color!=Color.black)

return true;

if (derection == Snake.DOWN && head.x == food.x  && (head.y + Node.H) == food.y && color!=Color.black)

return true;

if (derection == Snake.RIGHT && (head.x + Node.W) == food.x && head.y == food.y && color==Color.black){

baowu++;

System.out.println(“+++++++++增加了一个宝物!++++++++++”);

return true;

}

if (derection == Snake.LEFT && (head.x – Node.W) == food.x && head.y == food.y && color==Color.black){

baowu++;

System.out.println(“+++++++++增加了一个宝物!++++++++++”);

return true;

}

if (derection == Snake.UP && head.x == food.x && (head.y – Node.H) == food.y && color==Color.black){

baowu++;

System.out.println(“+++++++++增加了一个宝物!++++++++++”);

return true;

}

if (derection == Snake.DOWN && head.x == food.x  && (head.y + Node.H) == food.y && color==Color.black){

baowu++;

System.out.println(“+++++++++增加了一个宝物!++++++++++”);

return true;

}

else {

return false;

}

}

// ———-是否碰撞

private boolean isCollsion() {

Node node = body.get(0);

// ————碰壁

if (derection == Snake.RIGHT && node.x == 290 && baowu==0)

return true;

if (derection == Snake.UP && node.y == 0 && baowu==0)

return true;

if (derection == Snake.LEFT && node.x == 0 && baowu==0)

return true;

if (derection == Snake.DOWN && node.y == 390 && baowu==0)

return true;

//=====================有宝物,实现穿墙功能=======================

if (derection == Snake.RIGHT && node.x == 300 && baowu>0){

baowu–;

node.x=0;

return false;

}

if (derection == Snake.UP && node.y == -10 && baowu>0){

baowu–;

node.y=390;

return false;

}

if (derection == Snake.LEFT && node.x == -10 && baowu>0){

baowu–;

node.x=290;

return false;

}

if (derection == Snake.DOWN && node.y == 400 && baowu>0){

baowu–;

node.y=0;

return false;

}

// ————–蛇头碰到蛇身

Node temp = null;

int i = 0;

for (i = 1; i < body.size(); i++) {

temp = body.get(i);

if (temp.x == node.x && temp.y == node.y)

break;

}

if (i < body.size()&& baowu==0)

return true;

if(i

0)

{

baowu–;

return false;

}else{

return false;

}

}

// ——-在随机的地方产生食物

public void makeFood() {

Node node = new Node(0, 0);

boolean isInBody = true;

int x = 0, y = 0;

int X = 0, Y = 0;

int i = 0;

while (isInBody) {

x = (int) (Math.random() * 15);

y = (int) (Math.random() * 20);

X = x * Node.W;

Y = y * Node.H;

for (i = 0; i < body.size(); i++) {

if (X == body.get(i).x && Y == body.get(i).y)

break;

}

if (i < body.size())

isInBody = true;

else

isInBody = false;

}

baowuchuxian++;

if(baowuchuxian==3){

color=Color.black;

food = new Node(X, Y);

baowuchuxian=0;

}else{

color=Color.red;

food = new Node(X, Y);

}

}

// ———改变运行方向

public void changeDerection(int newDer) {

if (derection % 2 != newDer % 2)// ——-如果与原来方向相同或相反,则无法改变

derection = newDer;

}

public void move() {

if (isEaten()) {    // —–如果食物被吃掉

body.add(0, food);    // ——–把食物当成蛇头成为新的蛇体

score += 10;

makeFood();      // ——–产生食物

} else if (isCollsion()){    // ———如果碰壁或自身

isRun = false;

status = Snake.GAMEOVER;    // —–结束

} else if (isRun) {      // —-正常运行(不吃食物,不碰壁,不碰自身)

Node node = body.get(0);

int X = node.x;

int Y = node.y;

// ————蛇头按运行方向前进一个单位

switch (derection) {

case 1:

X -= Node.W;

break;

case 2:

Y -= Node.H;

break;

case 3:

X += Node.W;

break;

case 4:

Y += Node.H;

break;

}

body.add(0,new Node(X, Y));

System.out.println(body.get(0).x+”==”+body.get(0).y);

// —————去掉蛇尾

body.remove(body.size() – 1);

//System.out.println(body.get(X)+”==”+body.get(Y));

}

}

}

/*

*组成蛇身的单位,食物

*/

class Node {

public static final int W = 10;

public static final int H = 10;

int x;

int y;

public Node(int x, int y) {

this.x = x;

this.y = y;

}

}

/**

********蛇体画板*********

**/

class SnakePanel extends JPanel {

Snake snake;

public SnakePanel(Snake snake) {

this.snake = snake;

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

Node node = null;

for (int i = 0; i < snake.body.size(); i++) {// —红蓝间隔画蛇身

if (i % 2 == 0){

g.setColor(Color.blue);

}

else{

g.setColor(Color.green);

}

node = snake.body.get(i);

g.fillRect(node.x, node.y, node.H, node.W);// *******************试用*********************

}

node = snake.food;

g.setColor(snake.color);

g.fillRect(node.x, node.y, node.H, node.W);

}

}

// ———-记录状态的线程

class StatusRunnable implements Runnable {

private JLabel baowuLabel;

private JLabel scoreLabel;

private JLabel statusLabel;

private Snake snake;

public StatusRunnable(Snake snake, JLabel statusLabel, JLabel scoreLabel,JLabel  baowuLabel) {

this.statusLabel = statusLabel;

this.scoreLabel = scoreLabel;

this.baowuLabel = baowuLabel;

this.snake = snake;

}

public void run() {

String sta = “”;

String spe = “”;

while (true) {

switch (snake.status) {

case Snake.RUNNING:

sta = “Running”;

break;

case Snake.PAUSED:

sta = “Paused”;

break;

case Snake.GAMEOVER:

sta = “GameOver”;

break;

}

statusLabel.setText(sta);

scoreLabel.setText(“” + snake.score);

baowuLabel.setText(“” + snake.baowu);

try {

Thread.sleep(100);

} catch (Exception e) {

}

}

}

}

// ———-蛇运动以及记录分数的线程

class SnakeRunnable implements Runnable {

public SnakeRunnable(Snake snake, Component component) {

this.snake = snake;

this.component = component;

}

public void run() {

while (true) {

try {

snake.move();

component.repaint();

Thread.sleep(snake.speed);

} catch (Exception e) {

}

}

}

private Snake snake;

private Component component;

}

应该是没有什么编译问题,我今天刚编译完测试通过。如果还有什么问题,可以及时联系我!

java防穿墙技术_Java贪吃蛇(穿身穿墙宝物)源码相关推荐

  1. 前端技术搭建贪吃蛇小游戏(内含源码)

    The sand accumulates to form a pagoda ✨ 写在前面 ✨ 功能介绍 ✨ 页面搭建 ✨ 样式设置 ✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了井字游戏,今 ...

  2. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  3. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  4. java贪吃蛇游戏代码下载_java实现贪吃蛇游戏代码(附完整源码)

    免费资源网,https://freexyz.cn/ 先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing ...

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

    先给大家分享源码,喜欢的朋友点此处下载. 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = ...

  6. Java经典小游戏——贪吃蛇简单实现(附源码)

    文章目录 一.使用知识 二.使用工具 三.开发过程 3.1素材准备 3.2 开发过程 3.2.1 创建项目 3.2.2 页面设计 3.23 画蛇 3.24创建蛇的食物 3.2.5增加蛇的存活状态 3. ...

  7. Python贪吃蛇小游戏_完整源码免费分享

    文章目录 Python 贪吃蛇小游戏 1. 导包 2. 配置初始化参数 3. 主函数及运行主体 4. 画食物的函数 5. 画贪吃蛇的函数 6. 画网格的函数(非必选,觉得多余的可以忽略此项) 7. 操 ...

  8. 贪吃蛇游戏实践(附源码),链表的应用!

    本文由"壹伴编辑器"提供技术支 前言 今天我们介绍的项目,是各位大多数人都有玩过,就算没玩过也不可能没听过的一款经典游戏,那就是 贪 吃 蛇 . 制作一个贪吃蛇游戏也有许多不同的方 ...

  9. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

最新文章

  1. oracle 数据有引号,oracle插入字符串数据时字符串中有'单引号问题
  2. “静态常量”与“ #define”与“枚举”
  3. 华为鸿蒙系统是否上线,网友曝华为鸿蒙系统已经上线!官方回应:空欢喜一场...
  4. java 工厂模式 计算器_java设计模式之简单工厂模式
  5. OpenCV学习笔记(九): 漫水填充:floodFill()
  6. C语言排序方法------快速排序
  7. Algs4-1.2.14实现Transaction中的equals()方法
  8. 程序员常用的网站和博客
  9. (转载)JavaScript中的原型和对象机制
  10. 台达触摸屏编程软件(Scredit)官方免费版 v2.00.23
  11. 人人都可以做深度学习应用:入门篇(下)
  12. Eth-Trunk 链路聚合
  13. 科技公司官网小程序-总体介绍
  14. JS实现双人五子棋简易游戏(上)
  15. 数学杂记(1)一些无处安放的数学推导
  16. C语言解决一个人有100元钱,打算买100只鸡。到市场上面一看,公鸡一只3元,母鸡一只5元,小鸡3只一元,试求用100元买100只鸡,各买多少合适?
  17. Linux 之复制文件或目录(copy)
  18. 计算机毕业设计系列基于SSM的网上书城系统
  19. 线控加速踏板安全设计
  20. Spotfire使用经验——使用文档属性(Document Property)实现数据集范围的动态限定

热门文章

  1. 一个故事看懂Linux文件权限管理
  2. 基于asp.net在线订餐外卖网站设计-计算机毕业设计
  3. git拉取远程分支到本地并同步分支
  4. 【Java与Python实现】最实际与高效生成数据库高级声明式SQL脚本神器研发
  5. 集成学习笔记12-Stacking算法分析与案例调参实例
  6. luci L大_【听寓言】大明白胡萝卜:大力神和马车夫+鹰、寒鸦和牧羊人
  7. 使用putty连接远程在vim中鼠标右键不能粘贴问题解决
  8. xvfb运行java脚本_使用xvfb-run运行firefox(Selenium WebDriver)
  9. 使用PHP免费发送定时短信
  10. java做橡皮擦效果_基于canvas剪辑区域功能实现橡皮擦效果