贪吃蛇java源代码

这个贪吃蛇是我学完Java之后的课程设计作业,做了有挺久的,做完这个小游戏,自己对Java的一些知识也更了解了些。其中包括按完按钮后焦点的处理啊,还有就是图形的闪烁问题。我当时做的时候基本是在自己电脑上完成的,后来才放到学校机房测试的。说来也奇怪,这个代码开始在我自己电脑上运行的时候并没有闪烁,所以我也就没想过要处理闪烁的问题,可是后来在学校机房闪烁的十分严重,所以才又用双缓冲来处理闪烁。

双缓冲解决图形闪烁源代码:

@Overridepublic void update(Graphics g) {// TODO Auto-generated method stubImageBuffer = createImage(this.getWidth(), this.getHeight());GraImage = ImageBuffer.getGraphics(); // 获取图形缓冲区的图形上下文paint(GraImage); // 用paint方法中编写的绘图过程对图形缓冲区绘图GraImage.dispose(); // 释放图形上下文资源g.drawImage(ImageBuffer, 0, 0, this); // 将图形缓冲区绘制到屏幕上}

运行效果:

下面是贪吃蛇完整源代码:

SnakeBody.java

package com.java.snake;import java.awt.Color;public class SnakeBody {private int x;private int y;private Color color;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}
}

GameUi.java

package com.java.snake;import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;import javax.swing.*;public class GameUi extends JFrame {int flag = 1;JLabel jl = new JLabel();JLabel fs = new JLabel();JButton start = new JButton("开始");JButton stop = new JButton("暂停");JButton restart = new JButton("重玩");JButton exit = new JButton("退出");boolean p = true;JPanel pan = new JPanel();GridLayout grid = new GridLayout(1, 5);Random r1 = new Random();Random r2 = new Random();int a = (r1.nextInt(53) + 1) * 10 - 4;int b = (r2.nextInt(35) + 6) * 10 - 1;int score = 0;int foodNumber = 0;final int HW = 9;int x = (r1.nextInt(35) + 10) * 10 - 4;int y = (r2.nextInt(35) + 6) * 10 - 1;LinkedList<SnakeBody> snake = new LinkedList<SnakeBody>();int direction = 1;SnakeBody tail;SnakeBody head;class Mytask implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubALL: while (true) {head = snake.getFirst();/** 判断蛇是否吃到食物,如果吃到食物则产生一个随机数,若产生的随机数在蛇的身体上则重新再产生一个随机数*/if (head.getX() == a && head.getY() == b) {SnakeBody c = new SnakeBody();snake.add(c);++foodNumber;score += 10;fs.setText("分数:" + score);/* 判断生成的食物是不是在蛇的身体里 */for (int i = 0; i < snake.size(); i++) {SnakeBody d = snake.get(i);if (d.getX() == a && d.getY() == b) {a = (r1.nextInt(53) + 1) * 10 - 4;b = (r2.nextInt(35) + 6) * 10 - 1;}}}int x1 = head.getX();int y1 = head.getY();/* 判断是否触到边缘 */if (x1 < 6 || x1 > 536 || y1 < 59 || y1 > 419) {gameover();break ALL;}/* 判断是否吃到自己的身体 */else {for (int i = 3; i < snake.size(); i++) {SnakeBody d = snake.get(i);if (d.getX() == x1 && d.getY() == y1) {gameover();break ALL;}}}if (p != false) {moving(direction);update(getGraphics());}try {//Thread.sleep(500 - foodNumber / 2 * 100);//可设置等级,等级不同可以有不同的速度Thread.sleep(100);} catch (Exception e) {}}}private void gameover() {// TODO Auto-generated method stubjl.setText("GAME OVER");jl.setBounds(150, 150, 400, 100);jl.setForeground(Color.red);jl.setFont(new Font("宋体", Font.BOLD, 55));add(jl);update(getGraphics());}}Thread timer = new Thread(new Mytask());public GameUi() {// TODO Auto-generated constructor stubthis.setTitle("我的贪吃蛇");this.setSize(552, 435);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);initSnakeBody();initEvent();fs.setText("分数:" + score);add(pan, BorderLayout.NORTH);pan.setLayout(grid);pan.add(start);pan.add(stop);pan.add(restart);pan.add(exit);pan.add(fs);this.requestFocus();start.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (e.getSource() == start) {p = true;}GameUi g = getUi();g.requestFocus();}});stop.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (e.getSource() == stop)p = false;}});restart.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (e.getSource() == restart) {new GameUi();dispose();}}});exit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (e.getSource() == exit)System.exit(EXIT_ON_CLOSE);}});timer.start();}protected GameUi getUi() {return this;}@Override/* 画边缘,蛇身,食物 */public void paint(Graphics g) {// TODO Auto-generated method stubsuper.paint(g);Graphics2D g_2d = (Graphics2D) g;g_2d.setColor(Color.BLACK);g_2d.setStroke(new BasicStroke(2f));g_2d.drawLine(5, 58, 547, 58);// 上面的那根线g_2d.drawLine(5, 58, 5, 430);// 左边的那根线g_2d.drawLine(5, 430, 547, 430);// 下面的那根线g_2d.drawLine(547, 58, 547, 430);// 右边的那根线g_2d.setColor(Color.black);for (int i = 0; i < snake.size(); i++) {SnakeBody b = snake.get(i);g.fillRect(b.getX(), b.getY(), HW, HW);}g.setColor(Color.red);g.fillRect(a, b, HW, HW);}Image ImageBuffer = null;Graphics GraImage = null;@Overridepublic void update(Graphics g) {// TODO Auto-generated method stubImageBuffer = createImage(this.getWidth(), this.getHeight());GraImage = ImageBuffer.getGraphics(); // 获取图形缓冲区的图形上下文paint(GraImage); // 用paint方法中编写的绘图过程对图形缓冲区绘图GraImage.dispose(); // 释放图形上下文资源g.drawImage(ImageBuffer, 0, 0, this); // 将图形缓冲区绘制到屏幕上}/* 初始化蛇身 */public void initSnakeBody() {// TODO Auto-generated method stubfor (int i = 0; i < 5; i++) {SnakeBody b = new SnakeBody();b.setX(x + i * HW + i);b.setY(y);snake.add(b);}tail = snake.getLast();head = snake.getFirst();}/* 蛇移动的时候身体的变化 */public void moving(int direction) {tail = snake.removeLast();head = snake.getFirst();switch (direction) {// 1:左;2:上;3:右;4:下case 1:tail.setX(head.getX() - HW - 1);tail.setY(head.getY());break;case 2:tail.setX(head.getX());tail.setY(head.getY() - HW - 1);break;case 3:tail.setX(head.getX() + HW + 1);tail.setY(head.getY());break;case 4:tail.setX(head.getX());tail.setY(head.getY() + HW + 1);break;}snake.addFirst(tail);}/* 方向控制 */public void initEvent() {this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent event) {// TODO Auto-generated method stubswitch (event.getKeyCode()) {case KeyEvent.VK_UP:if (direction == 2 || direction == 4) {break;}direction = 2;break;case KeyEvent.VK_DOWN:if (direction == 2 || direction == 4) {break;}direction = 4;break;case KeyEvent.VK_LEFT:if (direction == 1 || direction == 3) {break;}direction = 1;break;case KeyEvent.VK_RIGHT:if (direction == 1 || direction == 3) {break;}direction = 3;break;}}});}
}

Test.java

package com.java.snake;public class Test {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubnew GameUi();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50621.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪吃蛇游戏代码详解

内容目录 什么是帧帧 如果时间片足够小 就是动画 一秒 三十帧 六十帧 连起来就是动画 拆分就是静态的图片 键盘监听 定时器 Timer 代码步骤在功能集合类中 重点 &#xff08;步骤&#xff09; 1 先定义数据 2 先用画笔将数据画上去 3 加入到监听事件中 &#xff08;键盘监听事件…

贪吃蛇完整代码----GUI

整个代码分为三部分 1.游戏开始界面2.data基本图片的添加3.面板&#xff0c;将小蛇画到面板上 这是游戏完整界面 1. 游戏开始界面 public class StartGame {public static void main(String[] args) {JFrame frame new JFrame();frame.setBounds(10,10,900,720);frame.se…

python贪吃蛇代码

文末用python写好了贪吃蛇代码可直接复制使用&#xff01; 今天和大家分享一下贪吃蛇的代码&#xff0c;主要是贪吃蛇的一些基本知识&#xff0c;以及怎么去玩。 首先&#xff0c;我们先了解一下什么是贪吃蛇&#xff1f;它是一个具有多种功能的游戏&#xff0c;可以通过点击屏…

java贪吃蛇源代码

最简单的贪吃蛇游戏代码&#xff0c;有需要的可以下载看看 原创不易&#xff0c;转载请注明出处&#xff1a;java贪吃蛇源代码 代码下载地址&#xff1a;http://www.zuidaima.com/share/1737620634422272.htm 项目截图 运行截图 游戏结束

java贪吃蛇源码

欢迎访问我的个人博客 https://jialaner.cn/​​​​​​​ java是一种面向对象的语言&#xff0c;有着其中不用质疑的优点。学习java将近三个月了&#xff0c;一直在琢磨着“万物皆对象”的意义&#xff0c;却总是只知其表不知其意&#xff0c;做完这个java贪吃蛇后才有了那么…

贪吃蛇代码实现

贪吃蛇代码实现 游戏说明 游戏界面当中没有打印相关的按键说明&#xff0c;这里先逐一列出。 贪吃蛇游戏按键说明&#xff1a; 按方向键上下左右&#xff0c;可以实现蛇移动方向的改变。 短时间长按方向键上下左右其中之一&#xff0c;可实现蛇向该方向的短时间加速移动。 按…

贪吃蛇html游戏代码

拿来即用! 1代码如下 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>贪吃蛇</title><style>#map {width: 400px;height: 400px;border: 1px solid black;}/*地图的样式*/.divMap {width: 18px;height: 18px…

贪吃蛇源代码

#include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h>#define FrameX 4 //游戏窗口左上角的X轴坐标 #define FrameY 4 //游戏窗口左上角的Y轴坐标 #define Frame_height 20 //游戏窗口的高度 #define Frame_width 20…

c++贪吃蛇源代码 完整版

文章目录 c 实现贪吃蛇&#xff0c; 完整源码0.非常重要的注意事项1.数据结构分析&#xff1a;2.程序运行分析3.难点分析1.蛇移动怎么显示&#xff1f;2.怎么控制吃到食物后蛇的速度的变化&#xff1f;3.怎么解决屏幕闪烁&#xff1f; 4.一些废话5.源代码6.运行效果展示7.总结 …

Python贪吃蛇游戏详细代码和注释

在写Python游戏项目时&#xff0c;最重要的时python中的pygame库。安装pygame库和用法在我CSDN博客另一篇文章上。这里就不详细说了。下边时运行游戏界面。 下边是详细的代码和注释 import pygame,sys,random,time from pygame.locals import * #从pygame模块导入常用的函数…

贪吃蛇Python版 源码+代码分析

跳转目录 前言运行示例程序分析捕获键盘操作输出游戏画面 代码分析一安装运行环境游戏地图的实现炸弹的实现食物的实现蛇的实现 初步测试键盘控制的实现主程序game函数图形界面显示分数, 得分结束函数游戏主函数 源码下载 前言 该程序未使用pygame库, 而是采用keyboard库的on_p…

1.02亿美元从数字资产基金撤出!BTC价格已经触底!预示下跌趋势即将逆转?

根据CoinShares的一份报告&#xff0c;上周全球数字资产基金流出总额为1.02亿美元&#xff0c;美国数字资金外流共计9800万美元&#xff0c;而欧洲仅为200万美元&#xff0c;这表明美国市场的不稳定程度越来越高。 事实上&#xff0c;数字资产基金是一种投资工具&#xff0c;旨…

c语言 搜索彩票期数,根据福利彩票的规则用c++编写一个买彩票开奖的程序,求程序代码,谢谢...

满意答案 haslis3ila 2016.03.13 采纳率&#xff1a;58% 等级&#xff1a;7 已帮助&#xff1a;611人 1、完整代码如下&#xff0c;已经过VS2012编译及实际测试 2、基本上不存在什么缺憾&#xff0c;唯一的缺憾是很难中奖。#include #include #include #include using names…

电影解说怎么操作?电影解说都用什么配音软件?

我们都知道&#xff0c;短视频现在非常火爆&#xff0c;我们平时刷视频&#xff0c;可以看到很多的电影解说&#xff0c;不仅语言生动&#xff0c;而且配音很逼真&#xff0c;很多人以为电影解说的配音都是自己配音的&#xff0c;其实不然。以目前的市场现状来说&#xff0c;绝…

使用 ChatGPT 生成数据,4 个示例

如今&#xff0c;国家列表和货币列表等标准数据源很容易在互联网上获得。然而&#xff0c;丰富或重新格式化这些数据通常非常耗时。在本文中&#xff0c;我们探讨如何使用 ChatGPT 有效地生成和增强数据。我们将提供示例来演示 ChatGPT 的功能。 示例 1 — 获取 CSV 格式的世界…

java实现双色球生成器

题目要求&#xff1a; 思路&#xff1a; 生成红球&#xff1a; 使用random对象随机生成1-33的数字&#xff0c;使用长度为6的数组接收&#xff0c;比较生成树在数组里是否有重复如果重复就&#xff0c;本次随机数作废&#xff0c;重新生成不重复就放入数组使用Arrays.sort&am…

python彩票号码生成器

突然想到好久没动代码了&#xff0c;手痒痒&#xff0c;但是又不知道弄啥。想了想平时自己闲来无事都会买彩票&#xff0c;路过买两块&#xff0c;中不中全看天意。 但是经常买彩票的时候不知道选什么号码&#xff0c;犹豫的几分钟时间就浪费了&#xff0c;所以写了个彩票号码…

什么是CMP(同意管理平台)与Cookies?

有时访问网站时&#xff0c;会弹出弹窗或下面弹出横条&#xff0c; 这就是CMP。 什么是个人数据&#xff1f; 个人数据或个人信息是可用于识别活着的个人的信息。不同的数据保护法&#xff0c;如GDPR和CCPA&#xff0c;对个人数据的定义不同&#xff0c;但大体上它们都同意这样…

信息学奥赛C++语言:可口可乐

【题目描述】 便利店给出以下的优惠&#xff1a;“每3个空瓶可以换1瓶可口可乐。” 现在&#xff0c;您准备从便利店买一些可口可乐&#xff08;N瓶&#xff09;&#xff0c;您想知道您最多可以从便利店拿到多少瓶可口可乐。下图给出N8的情况。方法是&#xff1a;喝完8瓶可乐之…

喝汽水问题(使用c语言解决)

目录 问题描述 解题方法一 解题思路&#xff1a; 代码实现 解题方法二 解题思路&#xff1a; 代码实现 解题方法三 解题思路: 代码实现 总结 问题描述 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&…