《大鱼吃小鱼》这款游戏的历史渊源可以追溯到休闲游戏的兴起和发展。在游戏的早期发展阶段,开发者们开始探索各种简单而有趣的游戏玩法,以吸引玩家的注意力。在这样的背景下,《大鱼吃小鱼》应运而生,它结合了自然界的食物链原理与休闲游戏的轻松氛围,为玩家带来了一种新颖而有趣的游戏体验。
具体来说,这款游戏以神秘的海底世界为背景,让玩家扮演一条小鱼,通过不断吞噬比自己小的鱼类来逐渐成长,最终成为海洋中的霸主。在游戏中,每一关卡都设有玩法提示和海洋鱼类知识学习,使玩家在娱乐的同时也能学习到一些有关海洋生物的知识。
此外,游戏还添加了积分制度和动听愉快的背景音乐,使得整个游戏过程更加有趣和刺激。这种简单而富有挑战性的玩法,使得《大鱼吃小鱼》迅速流行起来,尤其是在白领阶层中,成为了一款广受欢迎的休闲游戏。
综上所述,《大鱼吃小鱼》这款游戏的历史渊源可以归结为休闲游戏的发展和探索,以及自然界食物链原理与游戏玩法的巧妙结合。这些因素共同促成了这款游戏的诞生和流行。
一、Java Swing是什么?
Java Swing是Java平台提供的一套图形用户界面(GUI)工具包,用于构建桌面应用程序的用户界面。Swing是AWT(Abstract Window Toolkit)的扩展和替代,提供了更丰富的组件集和更现代化的外观。Swing组件完全是用Java编写的,因此具有跨平台性,这意味着Swing应用程序在不同的操作系统(如Windows、Linux和macOS)上的外观和行为是一致的。
Swing提供了一系列GUI组件,包括按钮、文本框、列表、表格、滑块、进度条等,以及布局管理器,用于控制这些组件在界面上的排列和布局。它还提供了事件处理机制,允许开发者为组件添加交互行为,如点击事件、键盘事件等。
使用Swing,开发者可以创建复杂的桌面应用程序,包括具有多个窗口、对话框和自定义组件的界面。Swing还支持自定义组件的外观和行为,使开发者能够创建独特的用户界面。
总的来说,Java Swing是Java开发人员在构建桌面应用程序时经常使用的工具包之一,它提供了丰富的组件和灵活的布局管理,使得创建具有吸引力的用户界面变得相对容易。
二、Java Swing有哪些组件
JFrame:JFrame 是 Swing 组件的基础,用于显示程序界面。它是所有 Swing GUI 应用程序的顶层容器。
JPanel:JPanel 是一个容器,用于承载其他组件,如按钮、文本框等。它可以作为 JFrame 的内容面板,也可以作为其他容器的子面板。
JButton:JButton 是最常用的组件之一,用于创建可点击的按钮。
JLabel:JLabel 用于显示文本或图像,但不接受用户输入。
JTextField:JTextField 是一个单行文本框,允许用户输入单行文本。
JTextArea:JTextArea 是一个多行文本框,允许用户输入多行文本。
JComboBox:JComboBox 是一个下拉列表,允许用户从多个选项中选择一个。
JList:JList 用于显示一个可滚动的选项列表,用户可以选择一个或多个项目。
JScrollPane:JScrollPane 提供了滚动功能,可以将大型组件(如 JList 或 JTextArea)嵌入其中,以便在界面上滚动查看。
JMenuBar, JMenu, JMenuItem:这些组件用于创建菜单栏、菜单和菜单项,为用户提供程序功能的快速访问。
JSliderJFrame:JFrame 是 Swing 组件的基础,用于显示程序界面。它是所有 Swing GUI 应用程序的顶层容器。
JPanel:JPanel 是一个容器,用于承载其他组件,如按钮、文本框等。它可以作为 JFrame 的内容面板,也可以作为其他容器的子面板。
三.开始游戏制作
1.项目结构
2.代码如下:
总共设置了五种鱼类:
并对其按照战力 进行了排序(图片素材全都来自网络资源 由作者进行裁剪 如有侵权 敬请告知删除)
主角是懒羊羊
import javax.swing.*;
import java.awt.*;
public class BigEnemy extends Fish{
public BigEnemy()
{
power=3;
int r=(int)(Math.random()*2); //生成0,1两个随机数用来标志向左还是向右
if(r==0)
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=false;
//朝向右 从最左边出来
x=-168;
image=new ImageIcon("image/BigRight"+a+".png").getImage();
}else
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=true;
//朝向左,从最右边出来
x=1080;
image=new ImageIcon("image/BigLeft"+a+".png").getImage();
}
y=(int)(Math.random()*600);
length=250;
height=150;
}
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
if(isMoveLeft) {
g.drawImage(image, x--, y, length, height, null);
}
else
{
g.drawImage(image, x++, y, length, height, null);
}
}
}
import javax.swing.*;
import java.awt.*;
public class BossEnemy extends Fish{
public BossEnemy()
{
power=4;
int r=(int)(Math.random()*4); //生成0,1两个随机数用来标志向左还是向右
if(r==0)
{
isMoveLeft=false;
//朝向右 从最左边出来
x=-400;
image=new ImageIcon("image/BossRight"+1+".png").getImage();
}else
{
int a=(int)(Math.random()*3)+1;
isMoveLeft=true;
//朝向左,从最右边出来
x=1100;
image=new ImageIcon("image/BossLeft"+a+".png").getImage();
}
y=(int)(Math.random()*800);
length=350;
height=250;
}
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
if(isMoveLeft) {
g.drawImage(image, x--, y, length, height, null);
}
else
{
g.drawImage(image, x++, y, length, height, null);
}
}
}
import javax.swing.*;
import java.awt.*;
public class BugEnemy extends Fish{
public BugEnemy()
{
power=5;
int r=(int)(Math.random()*2); //生成0,1两个随机数用来标志向左还是向右
if(r==0)
{
isMoveLeft=false;
//朝向右 从最左边出来
x=-400;
image=new ImageIcon("image/boss1.GIF").getImage();
}else
{
isMoveLeft=true;
//朝向左,从最右边出来
x=1100;
image=new ImageIcon("image/MirenRight.png").getImage();
}
y=(int)(Math.random()*700);
length=350;
height=250;
}
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
if(isMoveLeft) {
g.drawImage(image, x--, y, length, height, null);
}
else
{
g.drawImage(image, x++, y, length, height, null);
}
}
}
import java.awt.*;
public class Fish {
//鱼的属性:初始位置
int power;//战力值
int x;
int y;
int length;
int height;
Image image;
boolean isMoveLeft=true;
//对图片进行裁剪
int x1,x2;
int y1,y2;
public void drawFish(Graphics g){
};
}
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class FishPanel extends JPanel {
int target=15 ;
int oldpower=1;
int score=0;//分数
int mini,mid,big,boss,king,music=0;//控制游戏中有多少条不同类的鱼
MySelf mySelf=new MySelf();
List<Fish> fishList=new ArrayList<Fish>();
int state=0;//0表示加载中;1表示游戏开始;2表示游戏暂停;3表示游戏结束
@Override
public void paint(Graphics g) {
super.paint(g);
switch(state)
{
case 0:
Image image=new ImageIcon("image/start.jpg").getImage();
g.drawImage(image,0,0,1024,680,null);
break;
case 1:
drawBackgroundImage(g);
// if(mySelf.power==2)
// {
// drawBgI(g);
// }else if(mySelf.power==3)
// {
//
// }
//绘制己方的小鱼
drawMyFish(g);
drawEnemyFish(g);
g.setColor(Color.PINK);
Font font=new Font("黑体",Font.BOLD,20);
g.setFont(font);
g.drawString("当前得分:"+score,15,20);
g.setColor(Color.YELLOW);
g.drawString("目标得分:"+target,500,20);
break;
case 2:
drawBackgroundImage(g);
// if(mySelf.power>=2)
// {
// drawBgI(g);
// }
//绘制己方的小鱼
drawMyFish(g);
drawEnemyFish(g);
break;
case 3:
drawBackgroundImage(g);
// if(mySelf.power>=2)
// {
// drawBgI(g);
// }
//绘制己方的小鱼
drawMyFish(g);
drawEnemyFish(g);
g.setColor(Color.PINK);
Font fon=new Font("黑体",Font.BOLD,20);
g.setFont(fon);
g.drawString("当前得分:"+score,15,20);//画笔写字
g.setColor(Color.GREEN);
Font f=new Font("黑体",Font.BOLD,50);
g.setFont(f);
g.drawString("GAME OVER",360,320);
break;
case 4:
drawBackgroundImage(g);
}
}
//绘制敌方鱼的方法
private void drawEnemyFish(Graphics g) {
for(int i=0;i<fishList.size();i++)
{
Fish fish=fishList.get(i);
fish.drawFish(g);
}
}
//绘制己方鱼的方法
private void drawMyFish(Graphics g) {
mySelf.drawFish(g);
}
//绘制游戏的背景图
public void drawBackgroundImage(Graphics g)
{
String str="image/bg3.jpeg";
if(mySelf.power==2)
{
str="image/bg4.jpeg";
}
else if(mySelf.power==3)
{
str="image/bg11.jpeg";
}
else if(mySelf.power==4)
{
str="image/bg12.jpeg";
}
else if(mySelf.power==5)
{
if(score<=5000)
{
str = "image/bg15.jpeg";
}
else
{
str="image/bg.png";
}
}
Image image= new ImageIcon(str).getImage();
g.drawImage(image,0,0,1024,680,null);
}
// public void drawBgI(Graphics g)
// {
// String str=null;
// if(mySelf.power==2)
// {
// str=
// }
// else if()
// Image image= new ImageIcon(str).getImage();
// g.drawImage(image,0,0,1024,640,null);
// }
public void move(int keycode){
switch(keycode)
{
case KeyEvent.VK_SPACE:
if(state==0) {
state = 1;
}
else if(state==3)
{
state=1;
}
break;
case KeyEvent.VK_LEFT:
if(state==1) {
mySelf.moveLeft();
repaint();
}
break;
case KeyEvent.VK_RIGHT:
if(state==1) {
mySelf.moveRight();
repaint();
}
break;
case KeyEvent.VK_UP:
if(state==1) {
mySelf.moveUp();
repaint();
}
break;
case KeyEvent.VK_DOWN:
if(state==1) {
mySelf.moveDown();
repaint();
}
break;
case KeyEvent.VK_ENTER:
if(state==1)
{
state=2;
}
else if(state==2)
{
state=1;
}
break;
}
}
//定时器的方法Timer
//生成其他鱼
//移动
public void action()
{
Timer timer=new Timer();
timer.schedule(new TimerTask() {
public void run() {
if(state==1){
//创建其他鱼
createEnemy();
//吃鱼
EatFish();
//不断改变其他鱼的位置
repaint();
}
}
},20,10);//delay延迟20毫秒后,period每隔10毫秒执行一次run里面的内容
}
/*
吃鱼功能
*/
private void EatFish() {
for(int i=0;i<fishList.size();i++)
{
Fish fish=fishList.get(i);
//碰撞检测:如果碰撞了执行
if(hit(fish))
{
//吃小鱼
if(mySelf.power>=fish.power)
{
if(score>=5000)
{
state=4;
}
sound("music/EatHim.wav");
//战力++
switch(fish.power)
{
case 1:score++;
break;
case 2: score+=5;
break;
case 3: score+=50;
break;
case 4: score+=100;
break;
case 5: score+=200;
}
if(score>=15&&score<50)
{
mySelf.power=2;
}
else if(score>=100&&score<=1000)
{
mySelf.power=3;
}
else if(score>=1000&&score<=3000)
{
mySelf.power=4;
}
else if(score>=3000)
{
mySelf.power=5;
}
//其他鱼要消失 从集合中删除鱼
fishList.remove(i);
if(mySelf.power>oldpower)
{
sound("music/ShengJi.wav");
oldpower++;
}
//自己变大
if(mySelf.power==1)
{
target=15;
}
else if(mySelf.power==2)
{
target=100;
mySelf.length=80;
mySelf.height=120;
}
else if(mySelf.power==3)
{
target=1000;
mySelf.length=130;
mySelf.height=195;
}
else if(mySelf.power==4)
{
target=3000;
mySelf.length=200;
mySelf.height=300;
}
else if(mySelf.power==5)
{
target=5000;
mySelf.length=250;
mySelf.height=300;
}
}
//被吃
else
{
state=3; //游戏状态改成三 表示游戏结束
sound("music/EatMe.wav");
//游戏结束
}
}
}
}
private boolean hit(Fish fish) {
int x=mySelf.x+ mySelf.length/2;
int y=mySelf.y+mySelf.height/2;
int x1=fish.x+fish.length/2;
int y1=fish.y+fish.length/2;
if(x>=fish.x&&x<=fish.x+fish.length)
{
if(y>=fish.y&&y<=fish.y+fish.height)
{
return true;
}
}
if(x1>=mySelf.x&&x1<=mySelf.x+mySelf.length)
{
if(y1>=mySelf.y&&y1<=mySelf.y+mySelf.height)
{
return true;
}
}
return false;
}
public void sound(String str)
{
try {
FileInputStream in = new FileInputStream(str);
AudioStream as=new
AudioStream(in);
AudioPlayer.player.start(as);
}catch(Exception e)
{
e.printStackTrace();
}
}
private void createEnemy() {
if(mySelf.power<2) {
if (mini++ % 200 == 0) {
fishList.add(new MiniEnemy());
}//每次间隔四秒创建一条鱼
if (mid++ % 400 == 0) {
fishList.add(new MidEnemy());
}
if (big++ % 800 == 0) {
fishList.add(new BigEnemy());
}
}
else if(mySelf.power>=2&&mySelf.power<3) {
if (mini++ % 200 == 0) {
fishList.add(new MiniEnemy());
}//每次间隔四秒创建一条鱼
if (mid++ % 200 == 0) {
fishList.add(new MidEnemy());
}
if (big++ % 800 == 0) {
fishList.add(new BigEnemy());
}
if (boss++ % 1500 == 0) {
fishList.add(new BossEnemy());
}
}
else if(mySelf.power>=3&&mySelf.power<4)
{
if (mini++ % 200 == 0) {
fishList.add(new MiniEnemy());
}//每次间隔四秒创建一条鱼
if (mid++ % 200 == 0) {
fishList.add(new MidEnemy());
}
if (big++ % 400 == 0) {
fishList.add(new BigEnemy());
}
if (boss++ % 1000 == 0) {
fishList.add(new BossEnemy());
}
if (king++ % 1500 == 0) {
fishList.add(new BugEnemy());
}
}
else if(mySelf.power>=4)
{
if (mini++ % 200 == 0) {
fishList.add(new MiniEnemy());
}//每次间隔四秒创建一条鱼
if (mid++ % 200 == 0) {
fishList.add(new MidEnemy());
}
if (big++ % 400 == 0) {
fishList.add(new BigEnemy());
}
if (boss++ % 600 == 0) {
fishList.add(new BossEnemy());
}
if (king++ % 1500 == 0) {
fishList.add(new BugEnemy());
}
}
// if(mid++%300==0)
// {
// fishList.add(new MidEnemy());
// }
if(music++ %1000==0)
{
int r=(int)(Math.random()*3)+1;
sound("music/bgm1."+r+".wav");
}
}
}
import javax.swing.*;
import java.awt.*;
public class MidEnemy extends Fish{
public MidEnemy(){
power=2;
int r=(int)(Math.random()*2); //生成0,1两个随机数用来标志向左还是向右
if(r==0)
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=false;
//朝向右 从最左边出来
x=-68;
image=new ImageIcon("image/MidRight"+a+".png").getImage();
}else
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=true;
//朝向左,从最右边出来
x=1080;
image=new ImageIcon("image/MidLeft"+a+".png").getImage();
}
y=(int)(Math.random()*600);
length=80;
height=120;
}
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
if(isMoveLeft) {
g.drawImage(image, x--, y, length, height, null);
}
else
{
g.drawImage(image, x++, y, length, height, null);
}
}
}
import javax.swing.*;
import java.awt.*;
public class MiniEnemy extends Fish {
public MiniEnemy(){
int r=(int)(Math.random()*2); //生成0,1两个随机数用来标志向左还是向右
if(r==0)
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=false;
//朝向右 从最左边出来
x=-68;
image=new ImageIcon("image/MiniLeft"+a+".png").getImage();
}else
{
int a=(int)(Math.random()*2)+1;
isMoveLeft=true;
//朝向左,从最右边出来
x=1080;
image=new ImageIcon("image/MiniRight"+a+".png").getImage();
}
y=(int)(Math.random()*500);
power=1;
length=68;
height=55;
}
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
if(isMoveLeft) {
g.drawImage(image, x--, y, length, height, null);
}
else
{
g.drawImage(image, x++, y, length, height, null);
}
}
}
import javax.swing.*;
import java.awt.*;
public class MySelf extends Fish{
public MySelf(){
power=1;
length=55;
height=68;
x=500;
y=350;
}
//父类鱼方法重写 实现绘制的功能
@Override
public void drawFish(Graphics g) {
super.drawFish(g);
Image image;
if(isMoveLeft){
image=new ImageIcon("image/lan12.png").getImage();
//向左移动
}else{
//向右移动
image=new ImageIcon("image/lan11.png").getImage();
}
//g.drawImage(image,x,y,68,100,null);
g.drawImage(image,x,y,length,height,null);
}
public void moveLeft()
{
isMoveLeft=true;
if(x>=-50)
{
x-=10;
}
}
public void moveRight()
{
isMoveLeft=false;
if(x<=980)
{
x+=10;
}
}
public void moveUp()
{
if(y>=0)
{
y-=10;
}
}
public void moveDown()
{
if(y<=640)
{
y+=10;
}
}
}
import javax.swing.*;
import java.awt.*;
public class Rule extends JFrame {
JPanel jPanel=new JPanel();
public Rule()
{
this.setTitle("规则图鉴");
this.setVisible(true);
this.setSize(800,630);
this.setLocation(20,20);
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setLocationRelativeTo(null);
this.add(jPanel);
ImageIcon image=new ImageIcon("image/rule.png");
JLabel jLabel=new JLabel(image);
jPanel.add(jLabel);
}
}
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.FileInputStream;
//1.创建窗体对象
//2.背景的绘制
//3.键盘的监听事件
//4.放入己方鱼
//5.让己方鱼移动
//6.创建敌方鱼
//7.碰撞检测(吃鱼)
public class Ui extends JFrame implements KeyListener {
private FishPanel fishPanel=new FishPanel();
JMenuBar JM=new JMenuBar();
JMenu m1=new JMenu("规则图鉴");
JMenuItem jMenuItem=new JMenuItem("规则图鉴");
public Ui(){
this.setTitle("海洋小霸王——金花");
this.setSize(1024,680);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.add(fishPanel);
fishPanel.action();
this.addKeyListener(this);
this.setJMenuBar(JM);
JM.add(m1);
m1.add(jMenuItem);
jMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new Rule();
}
});
}
public void init(){
while(true)
{
sound("music/bgm1.wav");
try
{
Thread.sleep(82800);
}catch (Exception e)
{
e.printStackTrace();
}
}
}
public void sound(String str)
{
try {
FileInputStream in = new FileInputStream(str);
AudioStream as=new
AudioStream(in);
AudioPlayer.player.start(as);
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args) {
Ui ui=new Ui();
ui.init();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
fishPanel.move(e.getKeyCode());
}
public void keyReleased(KeyEvent e) {
}
}
运行效果
升级之后变大并且更换了背景
升级之后可以变大 并且更换了背景