大家好,今天尝试用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类中实现。
总结
本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大的提升。
在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。
本项目在一定程度上还有缺陷,仅用于初学者学习,欢迎各位指正。
🥰以上就是本篇博客的全部内容,如果对你有用麻烦关注点赞收藏三连走一波!
👋如有问题欢迎留言,如有错误烦请指正,期待你的评论!
👨💻个人主页: 青00 (一起学Java)的博客_CSDN博客-一起学Java,Java领域博主🤳我的《一起学Java》板块持续更新中,欢迎各位编程爱好者前来观看!
转载:https://blog.csdn.net/m0_63947499/article/details/125339199