Java实现贪吃蛇大作战小游戏的示例代码
作者:陈橘又青 发布时间:2023-09-25 21:16:15
标签:Java,贪吃蛇
大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。
效果展示
效果展示
一、游戏界面
二、得分情况
项目介绍
项目背景
“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个 操作简单、界面美观、功能较齐全 的“贪吃蛇”游戏。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
总体需求
本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。需要满足以下几点要求:
(1)利用方向键来改变蛇的运行方向。
(2)空格键暂停或继续游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。
实现过程
(1)绘制窗体对象。
(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。
(3)使用键盘监听事件和定时器实现小蛇的移动。
(4)小蛇与食物碰撞的实现。
(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。
(6)退出条件:当游戏积分到达指定分数,游戏退出。
代码展示
主类 :Demo类
package Demo;
/**
* 1.画出窗体对象
*
*
* @author 青00-Java
*
*/
public class Demo0 {
}
MyPanel类 构造方法
package Demo;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
//画布类
public class MyPanel extends JPanel implements KeyListener,ActionListener{//继承
private static final Component This = null;
//键盘监听交互接口
int length;
int score;
int[] snakeX=new int[500];//坐标
int[] snakeY=new int[500];
String fx;
boolean ifStart=false;
//定时器
Timer timer =new Timer(100,this);
int foodx;
int foody;
Random random =new Random();
public MyPanel(){
init();
//添加监听事件
this.setFocusable(true);
this.addKeyListener(this);
score=0;
}
初始化方法
public void init(){
length=3;
fx="r";
//初始化小蛇的位置
snakeX[0]=100;
snakeY[0]=150;
snakeX[1]=75;
snakeY[1]=150;
snakeX[2]=50;
snakeY[2]=150;
foodx=25+25*random.nextInt(57);
foody=125+25*random.nextInt(27);
System.out.println(foodx);
System.out.println(foody);
timer.start();
}
绘制方法
@Override
protected void paintComponent(Graphics g){//画笔对象
super.paintComponent(g);
//绘制顶部的标题
new ImageIcon("C:/Users/Desktop/img/title2.png").paintIcon(this,g,25,11);//创建对象
//绘制游戏区域
g.fillRect(25, 125, 1450, 700);
//绘制小蛇
//蛇头
new ImageIcon("C:/Users/Desktop/img/l.png").paintIcon(this, g, snakeX[0], snakeY[0]);
//蛇身
for(int i=1;i<length;i++){
new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(This, g, snakeX[i], snakeY[i]);
}
//游戏的提示语
if(ifStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按压空格键继续游戏", 550,500);
g.drawString("无尽模式", 650,400);
}
//画出食物的位置
new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(this, g, foodx, foody);
}
@Override//按压
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
ifStart=!ifStart;
}
if(ifStart==true){
if(keyCode==KeyEvent.VK_LEFT&&fx!="r"){
fx="l";
}else if(keyCode==KeyEvent.VK_RIGHT&&fx!="l"){
fx="r";
}else if(keyCode==KeyEvent.VK_UP&&fx!="d"){
fx="u";
}else if(keyCode==KeyEvent.VK_DOWN&&fx!="u"){
fx="d";
}
}
repaint();
}
定时器执行方法
@Override
public void actionPerformed(ActionEvent e) {
//改变蛇的位置
if(ifStart==true){
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
if(fx.equals("l")){
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25){
snakeX[0]=1450;
}
}else if(fx.equals("r")){
snakeX[0]=snakeX[0]+25;
if(snakeX[0]>1450){
snakeX[0]=25;
}
}else if(fx.equals("u")){
snakeY[0]=snakeY[0]-25;
if(snakeY[0]<120){
snakeY[0]=800;
}
}else if(fx.equals("d")){
snakeY[0]=snakeY[0]+25;
if(snakeY[0]>800){
snakeY[0]=120;
}
}
//判断是否吃了食物
if(snakeX[0]==foodx&&snakeY[0]==foody){
length++;
score++;
if(score==100){
ifStart=!ifStart;
}
foodx=25+25*random.nextInt(57);
foody=125+25*random.nextInt(27);
System.out.print("当前食物坐标("+foodx+",");
System.out.print(foody+")");
System.out.println("|||当前分数:"+score+" ");
}
repaint();
}
timer.start();
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
框架Ui类
package Demo;
import javax.swing.JFrame;
public class Ui {
public static void main(String[] args){
JFrame frame=new JFrame("无尽版贪吃蛇");
frame.setSize(1500, 900);
frame.setLocationRelativeTo(null);//居中显示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(true);
frame.add(new MyPanel());
frame.setVisible(true);
}
}
项目结构
本程序用于初学者学习,共封装三个类,分别是Demo类,MyPanel类,框架Ui类,结构简单,所有方法均在MyPanel类中实现。
来源:https://blog.csdn.net/m0_63947499/article/details/125339199
0
投稿
猜你喜欢
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- 本文实例为大家分享了flutter实现倒计时加载页面的具体代码,供大家参考,具体内容如下效果图实现步骤1、pubspec.yaml中添加依赖
- 最近在开发的过程中,一个列表的查询,涉及到了多表的关联查询,由于持久层使用的是mongodb,对这个非关系型数据使用的不是很多,所以在实现此
- 序列化与反序列化序列化:把对象转换成字节的过程,称为对象序列化反序列化:把字节恢复成对象的过程,称为反序列化对象的持久化概念:把字节保存的硬
- 简介对于一个APP来说,肯定会有一个AppBar,这个AppBar一般包含了APP的导航信息等。虽然我们可以用一个固定的组件来做为AppBa
- 摘要:vs2019新鲜出炉,配置opencv又有哪些不一样呢,这个教程将会一步一步的教你如何配置opencv和跑动opencv一个简单的项目
- 概述:App几乎都离不开与服务器的交互,本文主要讲解了flutter网络请求三种方式 flutter自带的HttpClient、 第三方库h
- 面试题1:你了解线程池么?简单介绍一下。java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池
- Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人
- 一、场景描述仪器数据文件的格式包含Pdf、Word、Excel等多种,不同种格式的文件其数据的采集方式不同,因此定义仪器数据采集接口,并定义
- 本文主要为大家整理Java常见的面试题,供大家参考,具体内容如下1. Java中sleep和wait的区别① 这两个方法来自不同
- 在正式的进入主题之前,我们先来了解下深拷贝和前拷贝的概念:浅拷贝:会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝,如果属性是基本
- 实际需求<if test="computationRule == '1'"> F
- 这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 下面是我自己收集整理的2017年Java岗位的面试题,可以用它来好好准备面试。一、Java基础1. String类为什么是final的。2.
- 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。此解视Semaphore为锁,以保
- Android内部没有控件来直接显示文档,跳转WPS或其他第三方文档App体验性不好,使用腾讯X5内核能很好的解决的这一问题。一、下载腾讯X
- 话不多说,请看代码:package com.lxj.demo;import java.io.BufferedReader;import ja