[java编程日记]捕鱼达人(二)

简介: [java编程日记]捕鱼达人
public interface MenuInterface {
    /**
     * 输出选项菜单。
     * 格式可以参考下面的:
     * ================
     *   1.选择普通子弹
     *   2.选择十字子弹
     *   3.选择叉号子弹
     *   4.发出子弹
     *   5.增加最大鱼条数
     *   ===============
     *   请选择操作选项:
     */
    void printSelection();
    /**
     * 输出当前池塘中的鱼分布情况
     * 格式可以参考如下:
     * ========捕鱼达人=======
     *   |—1——2——3——4—|
     * 1|将鱼  |        |士鱼   |          |
     * 2|         |         |          |          |
     * 3|相鱼  |         |          |         |
     * 4|         |         |          |          |
     * ====================
     *
     * 表示第1行第1列有一条将鱼,
     * 第1行第3列有一条士鱼,
     * 第3行1列有一条相鱼,其他地方为空
     */
    void printPool();
    /**
     * 输出炮台剩余金钱、当前使用的子弹
     * 参考如下:
     *
     * 剩余金钱数:100
     * 当前子弹种类:十字弹
     *
     */
    void printBatteryMessage();
    /**
     * 输出所有菜单
     */
    void printMenu();
}

------------------------------------------------------------------------------------------------------------------------

另外的一个类存储位置,flex用来判断是否有鱼,有的话为1,没有的话是0。

public class MyPoint {
    private int row;
    private int col;
    private int flex;
    public MyPoint() {
    }
    public MyPoint(int row, int col, int flex) {
        this.row = row;
        this.col = col;
        this.flex = flex;
    }
    public int getRow() {
        return row;
    }//返回行数
    public void setRow(int row) {
        this.row = row;
    }//设置行数
    public int getCol() {
        return col;
    }//返回列数
    public void setCol(int col) {
        this.col = col;
    }//设置列数
    public int getFlex() {
        return flex;
    }
    public void setFlex(int flex) {
        this.flex = flex;
    }
}

3.方法的实现

用switch语句来进行选择,之后写了增加鱼和移动鱼的方法。

import org.w3c.dom.ls.LSOutput;
import java.awt.*;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
//point 是坐标的位置
public class Main {
    public static void main(String[] args) {
        System.out.println("---------------欢迎来到捕鱼达人------------------");
        System.out.println("---------------作者:    ***------------------");
        System.out.println();
        System.out.println();//第一步,打印欢迎游戏的界面
        /*加载*/
        ArrayList<MyPoint> points = new ArrayList<MyPoint>();//池子的初始化
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                MyPoint a = new MyPoint(i, j, 0);
                points.add(a);
            }
        }//flex 是判定是否有鱼儿,有的话是1,没有的话是0
        //i和j分别是第几行和第几列
        Pool pool = new Pool(9, 9, points);
        ArrayList<Fish> list = new ArrayList<Fish>();//鱼的存储
        Bullet bullet = new Bullet(1, 1, "普通子弹");
        Menu menu = new Menu(600, bullet, points, list);//points是池子表,list是鱼的表
        for (int i = 0; i < 5; i++) {
            AddFish(list, menu);//增加初始的鱼
        }
        menu.printMenu();//第二步,打印总菜单
        System.out.println("请输入您的选择:");
        while (true) {
            int choose;
            Scanner sc = new Scanner(System.in);
            choose = sc.nextInt();//玩家进行选择
            switch (choose) {
                case 1:
                    while (true) {
                        if (menu.money <= 0) {
                            System.out.println("你失败了,请重新来过");
                            break;
                        } else if (menu.money >= 1000) {
                            System.out.println("你赢了,请继续加油");
                            break;
                        }//判断游戏是否结束
                        int ch;
                        menu.printPool();//游戏界面
                        menu.printBatteryMessage();//背包界面,每一次都要显示界面
                        menu.printSelection();//操作界面
                        ch = sc.nextInt();
                        switch (ch) {
                            case 1:
                                Bullet bullet1 = new Bullet(1, 1, "普通子弹");
                                menu.bullet = bullet1;
                                MoveFish(list, menu);
                                break;
                            case 2:
                                Bullet bullet2 = new Bullet(1, 1, "十字子弹");
                                menu.bullet = bullet2;
                                MoveFish(list, menu);
                                break;
                            case 3:
                                Bullet bullet3 = new Bullet(1, 1, "叉号子弹");
                                menu.bullet = bullet3;
                                MoveFish(list, menu);
                                break;
                            case 4:
                                System.out.println("请输入你要攻击的坐标:");
                                int x = sc.nextInt();
                                int y = sc.nextInt();
                                HurtFish(list, menu, x, y);
                                MoveFish(list, menu);
                                break;
                            case 5:
                                AddFish(list, menu);
                                System.out.println("鱼池已经升级");
                                MoveFish(list, menu);
                                break;
                            case 6:
                                menu.money = menu.money + 100;
                                System.out.println("作弊码");
                                MoveFish(list, menu);
                                break;
                            default:
                                System.out.println("选择失败,请重新选择");
                                break;
                        }
                    }
                    choose = 0;
                    break;
                case 0:
                    System.out.println("退出游玩");
                    break;
                default:
                    System.out.println("选择失败,请重新选择");
                    break;
            }
            if (choose == 0) break;
        }
    }

之后来写方法。

增加鱼的方法

 public static void AddFish(ArrayList<Fish> list, Menu menu) {
        int count = list.size();
        if (count > 10) {
            System.out.println("鱼的数目已经达到最大值,增加失败");
            return;
        }//鱼的数量过多
        Fish jiangyu = new Fish();
        Fish shiyu = new Fish();
        Fish xiangyu = new Fish();
        jiangyu.setHP(1);
        jiangyu.setValue(1);
        shiyu.setHP(2);
        shiyu.setValue(2);
        xiangyu.setHP(3);
        xiangyu.setValue(3);//鱼的种类的初始化,创造出三条鱼
        int row = 0, col = 0;
        Random r = new Random();
        while (true) {
            int flag = 1;
            int number = r.nextInt(4) + 1;//生成随机数1~4
            if (number == 1) {
                row = 1;
                col = r.nextInt(9) + 1;
            }
            if (number == 2) {
                row = 8;
                col = r.nextInt(9) + 1;
            }
            if (number == 3) {
                col = 1;
                row = r.nextInt(9) + 1;
            }
            if (number == 4) {
                col = 8;
                row = r.nextInt(9) + 1;
            }
            for (int i = 0; i < list.size(); i++) {
                if ((list.get(i).getRow() == row) && (list.get(i).getCol() == col)) {
                    flag = 0;
                }
                break;
            }//判断生成的位置是否有鱼
            if (flag == 1) {
                break;
            }
        }
        int number = r.nextInt(10) + 1;//生成随机数1~10
        if (number == 1) {
            xiangyu.setRow(row);
            xiangyu.setCol(col);
            list.add(xiangyu);
        } else if (number > 1 && number < 5) {
            shiyu.setRow(row);
            shiyu.setCol(col);
            list.add(shiyu);
        } else if (number >= 5) {
            jiangyu.setRow(row);
            jiangyu.setCol(col);
            list.add(jiangyu);
        }//鱼的添加
        menu.money = menu.money - 20;
        int dex = 0;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (menu.points.get(dex).getRow() == row && menu.points.get(dex).getCol() == col) ;
                menu.points.get(dex).setFlex(1);
                dex = dex + 1;
            }
        }//遍历池子表,在坐标对应的地方赋值1;
        return;
    }//增加鱼的函数

移动鱼的方法如下

public static void MoveFish(ArrayList<Fish> list, Menu menu) {
        for (int i = 0; i < list.size(); i++) {
            int rol = list.get(i).getRow();
            int col = list.get(i).getCol();
            while (true) {
                list.get(i).move();
                if (list.get(i).getRow() <= 0 || list.get(i).getRow() >= 10) {
                    list.get(i).setRow(rol);
                    list.get(i).setCol(col);
                    continue;
                }//不能移动到池子的外面
                if (list.get(i).getCol() <= 0 || list.get(i).getCol() >= 10) {
                    list.get(i).setRow(rol);
                    list.get(i).setCol(col);
                    continue;
                }//不能移动到池子的外面
                int a = 0;
                int j = 0;
                for (j = 0; j < list.size(); j++) {
                    if (j == i) continue;
                    if ((list.get(j).getRow() == list.get(i).getRow()) && ((list.get(j).getCol() == list.get(i).getCol()))) {
                        list.get(i).setRow(rol);
                        list.get(i).setCol(col);
                        a = 1;//判断器
                        break;
                    }//移动的位置有鱼
                }
                if (a == 1) continue;//不能移动到有鱼的地方
                break;
            }
            //rol 1~9 col 1~9
            //menu.points.get((rol-1) * 9 + col-1).setFlex(0);
            //menu.points.get((list.get(i).getRow()-1) * 9 + list.get(i).getCol()-1).setFlex(1);
        }
    }//移动鱼的函数

攻击鱼的方法如下

 public static void HurtFish(ArrayList<Fish> list, Menu menu, int x, int y) {
        if (menu.bullet.Type == "普通子弹") {
            int hurt = menu.bullet.Power;
            menu.money = menu.money - 1;
            for (int i = 0; i < list.size(); i++) {
                HurtFish1(list, menu, x, y, i, hurt);
            }
            }
            if (menu.bullet.Type == "十字子弹") {
                int hurt = menu.bullet.Power;
                menu.money = menu.money - 5;
                for (int i = 0; i < list.size(); i++) {
                    HurtFish1(list, menu, x, y, i, hurt);
                    HurtFish1(list, menu, x - 1, y, i, hurt);
                    HurtFish1(list, menu, x + 1, y, i, hurt);
                    HurtFish1(list, menu, x, y - 1, i, hurt);
                    HurtFish1(list, menu, x, y + 1, i, hurt);
                }
            }
            if (menu.bullet.Type == "叉号子弹") {
                int hurt = menu.bullet.Power;
                menu.money = menu.money - 5;
                for (int i = 0; i < list.size(); i++) {
                    HurtFish1(list, menu, x, y, i, hurt);
                    HurtFish1(list, menu, x - 1, y - 1, i, hurt);
                    HurtFish1(list, menu, x + 1, y + 1, i, hurt);
                    HurtFish1(list, menu, x - 1, y + 1, i, hurt);
                    HurtFish1(list, menu, x + 1, y - 1, i, hurt);
                }
            }
        }//攻击鱼的函数
    public static void HurtFish1(ArrayList<Fish> list, Menu menu, int x, int y, int i, int hurt) {
        if (list.get(i).getRow() == x && list.get(i).getCol() == y) {
            list.get(i).getDamage(hurt);
            if (!list.get(i).isAlive()) {
                System.out.println("攻击成功,击杀鱼" + "(" + x + "," + y + ")");
                list.remove(i);
                AddFish(list, menu);
                menu.money = menu.money + 20;
                menu.money = menu.money + list.get(i).getValue();
            } else {
                System.out.println("攻击成功,这条鱼" + "(" + x + "," + y + ")" + "还有HP:" + list.get(i).getHP());
            }
            return;
        }
        return;
    }

一个综合案例就这样写完了,其中的思路都很重要,要理清楚对象之间的关机。运行结果:

输入4

输入8 1

谢谢观看,总共1000行代码

相关文章
|
1月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
190 0
|
1月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
146 6
|
1月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
145 0
|
2月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
550 1
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
437 100
|
2月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
282 1
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
220 16
|
3月前
|
安全 Java Shell
Java模块化编程(JPMS)简介与实践
本文全面解析Java 9模块化系统(JPMS),帮助开发者解决JAR地狱、类路径冲突等常见问题,提升代码的封装性、性能与可维护性。内容涵盖模块化核心概念、module-info语法、模块声明、实战迁移、多模块项目构建、高级特性及最佳实践,同时提供常见问题和面试高频题解析,助你掌握Java模块化编程精髓,打造更健壮的应用。
|
3月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
3月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
572 3