《大鱼吃小鱼》这款游戏的历史渊源可以追溯到休闲游戏的兴起和发展。在游戏的早期发展阶段,开发者们开始探索各种简单而有趣的游戏玩法,以吸引玩家的注意力。在这样的背景下,《大鱼吃小鱼》应运而生,它结合了自然界的食物链原理与休闲游戏的轻松氛围,为玩家带来了一种新颖而有趣的游戏体验。
具体来说,这款游戏以神秘的海底世界为背景,让玩家扮演一条小鱼,通过不断吞噬比自己小的鱼类来逐渐成长,最终成为海洋中的霸主。在游戏中,每一关卡都设有玩法提示和海洋鱼类知识学习,使玩家在娱乐的同时也能学习到一些有关海洋生物的知识。
此外,游戏还添加了积分制度和动听愉快的背景音乐,使得整个游戏过程更加有趣和刺激。这种简单而富有挑战性的玩法,使得《大鱼吃小鱼》迅速流行起来,尤其是在白领阶层中,成为了一款广受欢迎的休闲游戏。
综上所述,《大鱼吃小鱼》这款游戏的历史渊源可以归结为休闲游戏的发展和探索,以及自然界食物链原理与游戏玩法的巧妙结合。这些因素共同促成了这款游戏的诞生和流行。
文章目录
- 一、Java Swing是什么?
- 二、Java Swing有哪些组件
- 三.开始游戏制作
- 1.项目结构
- 2.代码如下:
- 运行效果
一、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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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表示游戏结束@Overridepublic 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=newAudioStream(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;}@Overridepublic 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;}@Overridepublic 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;}
//父类鱼方法重写 实现绘制的功能@Overridepublic 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=newAudioStream(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) {}
}
运行效果
升级之后变大并且更换了背景
升级之后可以变大 并且更换了背景