浩克网 手游攻略 软件教程 使用300行java代码和149张图片制作一个单机版捕鱼游戏

使用300行java代码和149张图片制作一个单机版捕鱼游戏

时间:2026-09-10 11:37:43 来源:网络整理 浏览:0

用Java 300行写一个单人钓鱼游戏,效果如下。

package org.wf.game.fish;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class FishGame {

/**

* @param args

* @author wangfan

* @ version fishing 1.0

* @time 2015.06.19

*/

public static void main(String[] args) {

//游戏框架

JFrame jf=New JFrame ('Crazy Fishing');

jf.setSize(800, 480);

jf.setLocationRelativeTo(null);

jf.setResizable(false);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.setAlwaysOnTop(true);

//加载鱼塘

Pool pool=new Pool();

jf.add(pool);

//显示框架

jf.setVisible(true);

pool.action();

}

}

//鱼塘

class Pool extends JPanel {

private static final long serialVersionUID=1L;

BufferedImage bgImage//Hintergrund Bilder

Fish[] fishs=new fish [20]; //All the fish

Net Net=new Net();//渔网

布尔isExit//鼠标在游戏界面吗?

int分数,bullet=50//游戏分数,子弹数

public Pool() {

super();

File bg=new File('images/bg.jpg');

try {

bgImage=ImageIO.read(bg);

} catch (IOException e) {

e.printStackTrace();

}

//0-8和9-17对应1-9号鱼。

for (int i=0; i fishs.length/2 - 1; i++) {

fishs[i]=new Fish(i + 1);

fishs[i + 9]=new Fish(i + 1);

}

fishs[18]=new Fish(10);

fishs[19]=new Fish(11);

}

//绘制游戏元素

@Override

public void paint(Graphics g) {

g.drawImage(bgImage,0,0,null);//Zeichnen Hintergrund

for (Fish fish : fishs) {

g.drawImage(fish.fishImage,fish.fish_x,fish.fish_y,null);//画鱼

}

if (!isExit) {

g.drawImage(net.netImage,net.netX,net.netY,null);//画网

}

//绘制游戏描述文本

g.setColor(Color.GREEN);

G.setFont (new font ('italics, fonts. Italic, 20));

G. Pull rope ('crazy fishing V1.0 By~Synchronized' 10, 25);

G. Pull rope ('number of bullets:' bullet' score:' score, 350,25');

G. Pull the rope ('right click to switch fishing net VIP:' (net.power% 7 1), 590, 25);

if (bullet=0) {

g.setColor(Color.RED);

G.setFont (new font ('italics, fonts. Bold, 100));

g.drawString('Game Over', 150, 250);

bullet=0;

isExit=true;

net.power=-1;

}

}

//游戏启动方法

public void action() {

for (Fish fish : fishs) {

fish.start();

}

//鼠标监听器

MouseAdapter adapter=new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

int event=e.getModifiers();

if (event==4) {

net.change();

super.mousePressed(e);

} else if (event==16) {

//减少项目符号

if (bullet - (net.power % 7 + 1)=0) {

bullet=0;

} else {

bullet -=(net.power % 7 + 1);

}

//钓鱼

for (Fish fish : fishs) {

if (!fish.catched) {

catchFish(fish);

}

}

}

}

@Override

public void mouseMoved(MouseEvent e) {

net.moveTo(e.getX(), e.getY());

super.mouseMoved(e);

}

@Override

public void mouseEntered(MouseEvent e) {

isExit=false;

super.mouseEntered(e);

}

@Override

public void mouseExited(MouseEvent e) {

isExit=true;

super.mouseExited(e);

}

};

this.addMouseListener(adapter);

this.addMouseMotionListener(adapter);

while (true) {

repaint();

}

}

//打包钓鱼方法

public void catchFish(Fish fish) {

fish.catched=net.catchFish(fish);

if (fish.catched) {

score +=2 * fish.k;

bullet +=2 * fish.k;

}

}

}

//鱼

class Fish extends Thread {

int fish_x,fish _ y;//鱼的坐标

BufferedImage fishImage; //鱼的图片

BufferedImage[] fishImages=new BufferedImage[10]; //鱼动作的图片

BufferedImage[] catchImages; //鱼的被捕的图片

int fish_width, fish_height; //鱼的宽高

Random r=new Random(); //鱼y坐标的随机数

int blood; //鱼的血量值

boolean catched; //鱼是否被捕

int k, step_size; //鱼的血量等级,移动速度

public Fish(int m) {

super();

String preName=m 9 m + '' : '0' + m;

//通过for循环读取鱼动作图片数组

for (int i=0; i fishImages.length; i++) {

int j=i + 1;

String lastName=j 9 '10' : '0' + j;

File file=new File('images/fish' + preName + '_' + lastName + '.png');

try {

fishImages[i]=ImageIO.read(file);

} catch (IOException e) {

e.printStackTrace();

}

}

fishImage=fishImages[0];

fish_width=this.fishImage.getWidth();

fish_height=this.fishImage.getHeight();

fish_x=800;

fish_y=r.nextInt(450 - fish_height);

blood=m * 3;

this.k=m;

step_size=r.nextInt(5) + 1;

//初始化catchImages

if (m 7) {

catchImages=new BufferedImage[4];

} else if (m=7) {

catchImages=new BufferedImage[2];

}

//通过for循环读取鱼被捕图片数组

for (int i=1; i=catchImages.length; i++) {

File file=new File('images/fish' + preName + '_catch_0' + i + '.png');

try {

catchImages[i - 1]=ImageIO.read(file);

} catch (IOException e) {

e.printStackTrace();

}

}

}

//鱼移动的方法

public void move() {

fish_x -=step_size;

}

@Override

public void run() {

super.run();

while (true) {

move(); //调用鱼移动的方法

//如果鱼出界,重新生成

if (fish_x -fish_width || catched) {

turnOut(); //鱼被捕,颤动

newFish();

}

change(); //调用鱼摇摆游动的方法

try {

Thread.sleep(15);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

//重新生成一条鱼

public void newFish() {

fish_x=800;

fish_y=r.nextInt(450 - fish_height);

if (fish_y=450) {

//System.out.println(fish_height + ' ' + fish_y);

}

catched=false;

blood=k * 3;

step_size=r.nextInt(5) + 1;

}

//鱼摇摆游动的方法

int index=0;

public void change() {

index++;

fishImage=fishImages[index/3 % 10];

}

//鱼被捕动画的方法

public void turnOut() {

for (int i=0; i catchImages.length; i++) {

fishImage=catchImages[i];

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//渔网类

class Net {

int netX, netY;//网的坐标

int netWidth, netHeight;//网的宽高

BufferedImage netImage;//网的图片

public Net() {

super();

File file=new File('images/net_' + 1 + '.png');

try {

netImage=ImageIO.read(file);

} catch (IOException e) {

e.printStackTrace();

}

netX=300;

netY=300;

netWidth=netImage.getWidth();

netHeight=netImage.getHeight();

}

//鱼网切换的方法

int power=0;

public void change() {

power++;

int x=this.netX + this.netWidth/2;

int y=this.netY + this.netHeight/2;

File file=new File('images/net_' + (power % 7 + 1) + '.png');

try {

netImage=ImageIO.read(file);

} catch (IOException e) {

e.printStackTrace();

}

this.netWidth=netImage.getWidth();

this.netHeight=netImage.getHeight();

moveTo(x, y);

}

//渔网移动的方法

public void moveTo(int x, int y) {

this.netX=x - this.netWidth/2;

this.netY=y - this.netHeight/2;

}

//捕鱼

public boolean catchFish(Fish fish) {

//网的中心坐标

int zX=netX + netWidth/2;

int zY=netY + netHeight/2;

//鱼的身体部分中心坐标

int fX=fish.fish_x + fish.fish_width * 2/3;

int fY=fish.fish_y + fish.fish_height/2;

//如果网的中心坐标在鱼的身体部分

if (zX fish.fish_x zX fish.fish_x + fish.fish_width * 2/3

zY fish.fish_y zY fish.fish_y + fish.fish_height) {

fish.blood -=((power % 7 + 1) * 2);

//System.out.println(fish.blood);

} else if (fX netX fX netX + netWidth

fY netY fY netY + netHeight) {

//如果鱼的身体部分中心坐标在网里

fish.blood -=((power % 7 + 1) * 2);

//System.out.println(fish.blood);

}

return fish.blood=0;

}

}

149张图片太多我就没上传了

标题:使用300行java代码和149张图片制作一个单机版捕鱼游戏
链接:https://www.52hkw.com/news/rj/71992.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
Tiktok专用的梯子加速器(TK加速器全球加速)

Tiktok作为当前最火爆的短视频平台,受到了全球用户的热烈欢迎。然而,由于网络限制或者其他原因,很多用户在观看

2026-09-10
德国游戏排行榜前十名(德国出品的游戏)

中国的玩家可能在新闻里听过德国科隆游戏展,但对德国的游戏却感觉很陌生。游戏玩家大部分多少应该都体验过SL

2026-09-10
怎么不让快递放菜鸟驿站

菜鸟裹裹怎么禁止放快递?经常网购的小伙伴都知道,如果附近有菜鸟驿站,那么驿站的快递员会默认选择放在驿站中,并

2026-09-10
天国的姉弟のカンケイ四部合集(弹丸论破a1处刑合集)

Spike Chunsoft公布了《弹丸论破》四部合集《弹丸论破 三部曲合集+幸福弹丸论破S 超高中级的南国掷骰合宿》

2026-09-10