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

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

首页游戏大全疯狂捕鱼千炮版更新时间:2024-04-30

使用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 捕鱼1.0

* @time 2015.06.19

*/

public static void main(String[] args) {

//游戏画框

JFrame jf = new JFrame("疯狂捕鱼");

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; //背景图片

Fish[] fishs = new Fish[20]; //所有的鱼

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

boolean isExit; //鼠标是否在游戏界面

int score, 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); //画背景

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("楷体", Font.ITALIC, 20));

g.drawString("疯狂捕鱼V1.0 By~Synchronized", 10, 25);

g.drawString("子弹数:" bullet " 得分:" score, 350, 25);

g.drawString("右键切换渔网 VIP:" (net.power % 7 1), 590, 25);

if (bullet <= 0) {

g.setColor(Color.RED);

g.setFont(new Font("楷体", Font.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张图片太多我就没上传了

你觉得java好用吗 单选
0人 0%
非常好用
0人 0%
不太喜欢

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved