Java基于面向对象实现一个战士小游戏

Java基于面向对象实现一个战士小游戏

思路

  1. 定义一个 Warrior 类,该类具有以下属性:

  2. 姓名

  3. 体力值
  4. 攻击值
  5. 防御值

该类还应该具有以下方法:

  • attack(Warrior) 表示攻击另一个战士,需要传入被攻击的战士对象作为参数
  • defense() 表示进行防御
  • rest() 表示进行休息,恢复一定的体力值

  • 编写 Game 类,该类作为游戏的主类,应该具有以下属性:

  • player1 表示玩家1所选的战士

  • player2 表示玩家2所选的战士
  • round 表示当前回合数

该类还应该具有以下方法:

  • getPlayer1()getPlayer2() 分别返回玩家1和玩家2所选的战士对象
  • start() 表示游戏开始
  • roundStart() 表示每个回合开始
  • roundEnd() 表示每个回合结束
  • attack() 表示当前玩家进行攻击
  • defense() 表示当前玩家进行防御

代码实现

Warrior

public class Warrior {
    private String name;
    private int health;
    private int attack;
    private int defense;

    public Warrior(String name, int health, int attack, int defense) {
        this.name = name;
        this.health = health;
        this.attack = attack;
        this.defense = defense;
    }

    public void attack(Warrior enemy) {
        int damage = this.attack - enemy.defense;
        if (damage > 0) {
            enemy.health -= damage;
            System.out.println(this.name + "攻击了" + enemy.name + ",造成了" + damage + "点伤害。");
        } else {
            System.out.println(this.name + "攻击了" + enemy.name + ",但是" + enemy.name + "的防御值太高了,没有造成任何伤害。");
        }
    }

    public void defense() {
        System.out.println(this.name + "进行了防御。");
    }

    public void rest() {
        this.health += 10;
        System.out.println(this.name + "进行了休息,恢复了10点体力值,当前体力值为" + this.health + "。");
    }

    public boolean isAlive() {
        return this.health > 0;
    }

    public String getName() {
        return this.name;
    }

    public int getHealth() {
        return this.health;
    }

    public int getAttack() {
        return this.attack;
    }

    public int getDefense() {
        return this.defense;
    }
}

Game

import java.util.Random;
import java.util.Scanner;

public class Game {
    private Warrior player1;
    private Warrior player2;
    private int round;

    public Game(Warrior player1, Warrior player2) {
        this.player1 = player1;
        this.player2 = player2;
        this.round = 1;
    }

    public Warrior getPlayer1() {
        return this.player1;
    }

    public Warrior getPlayer2() {
        return this.player2;
    }

    public void start() {
        System.out.println("游戏开始!");
        Scanner scanner = new Scanner(System.in);

        while (player1.isAlive() && player2.isAlive()) {
            System.out.println("第" + round + "回合开始," + player1.getName() + " vs " + player2.getName() + ":");
            roundStart();
            System.out.println("第" + round + "回合结束。");
            round++;
            System.out.println("按任意键继续...");
            scanner.nextLine();
        }

        if (player1.isAlive()) {
            System.out.println(player1.getName() + "获胜!");
        } else {
            System.out.println(player2.getName() + "获胜!");
        }
    }

    private void roundStart() {
        Warrior current = getCurrentPlayer();
        System.out.println(current.getName() + "的回合:");
        System.out.println(current.getName() + ",请选择你的行动:");
        System.out.println("1. 攻击");
        System.out.println("2. 防御");
        System.out.println("3. 休息");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();

        switch (choice) {
            case 1:
                attack();
                break;
            case 2:
                defense();
                break;
            case 3:
                current.rest();
                break;
            default:
                System.out.println("无效的选择!");
        }
    }

    private void roundEnd() {
        System.out.println("回合结束,双方体力值:");
        System.out.println(player1.getName() + ": " + player1.getHealth());
        System.out.println(player2.getName() + ": " + player2.getHealth());
    }

    private void attack() {
        Warrior current = getCurrentPlayer();
        Warrior enemy = getEnemy();

        current.attack(enemy);
    }

    private void defense() {
        Warrior current = getCurrentPlayer();

        current.defense();
    }

    private Warrior getCurrentPlayer() {
        int random = new Random().nextInt(2);
        return random == 0 ? player1 : player2;
    }

    private Warrior getEnemy() {
        Warrior current = getCurrentPlayer();
        return current == player1 ? player2 : player1;
    }
}

示例说明

以下是两个示例。

示例1:玩家1攻击玩家2

public class Main {
    public static void main(String[] args) {
        Warrior player1 = new Warrior("张三", 100, 20, 10);
        Warrior player2 = new Warrior("李四", 100, 15, 15);

        Game game = new Game(player1, player2);
        game.start();
    }
}

这个例子中,玩家1的攻击值(20)比玩家2的防御值(15)高,所以玩家1能够对玩家2造成伤害。假设玩家1选择攻击操作,会输出以下信息:

张三的回合:
张三,请选择你的行动:
1. 攻击
2. 防御
3. 休息
1
张三攻击了李四,造成了5点伤害。
回合结束,双方体力值:
张三: 100
李四: 95
按任意键继续...

可以看到,玩家1攻击了玩家2,对其造成了5点伤害。

示例2:玩家2防御

public class Main {
    public static void main(String[] args) {
        Warrior player1 = new Warrior("张三", 100, 20, 10);
        Warrior player2 = new Warrior("李四", 100, 15, 15);

        Game game = new Game(player1, player2);
        game.start();
    }
}

这个例子中,假设玩家1选择攻击操作,玩家2选择防御操作,会输出以下信息:

张三的回合:
张三,请选择你的行动:
1. 攻击
2. 防御
3. 休息
1
张三攻击了李四,但是李四的防御值太高了,没有造成任何伤害。
回合结束,双方体力值:
张三: 100
李四: 100
按任意键继续...

可以看到,玩家2选择了防御操作,成功抵挡住了玩家1的攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基于面向对象实现一个战士小游戏 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java连接SQL Server数据库的方法

    下面我将详细讲解Java连接SQL Server数据库的方法,包括如何配置环境、创建数据库连接、执行SQL语句等步骤。 环境配置 在Java中连接SQL Server数据库,需要先下载Microsoft JDBC Driver for SQL Server。可以前往Microsoft官方网站下载对应版本的驱动程序。另外,需要安装SQL Server数据管理工…

    Java 2023年5月19日
    00
  • 深入了解Java核心类库–Date,Calendar,DateFormat类

    深入了解Java核心类库–Date、Calendar、DateFormat类 在Java核心类库中,Date、Calendar、DateFormat是非常重要的三个类。它们分别代表时间、日历及时间格式化的类,对于Java中时间、日期的操作和处理非常有用。下面是这三个类的详细攻略。 Date类 Date类是Java.util包下的类,用于处理时间相关的方法。…

    Java 2023年5月20日
    00
  • Java ArrayList.add 的实现方法

    下面是详细讲解 Java ArrayList.add 的实现方法的完整攻略。 ArrayList 的概念 ArrayList 是 Java 中非常常用的动态数组,它支持快速随机访问,但并不支持插入和删除操作,因为这些操作会涉及到大量的数据移动,使得效率非常低下。由于这个问题,Java 提供了 LinkedList 类型,支持在列表的任意位置插入或删除元素。 …

    Java 2023年5月26日
    00
  • Java别说取余(%)运算简单你真的会吗

    Java别说取余(%)运算简单你真的会吗? 什么是取余(%)运算? 在Java中,取余运算是用百分号(%)表示的运算符,用来计算两个数字的余数。 例如,12 % 5 的结果为2,因为12可以被5整除2次,剩下2。 取余运算可能出现的问题 在进行取余运算时,有时会出现我们意想不到的结果。这是因为在不同的情况下,取余运算所得到的余数可能不尽如人意。 负数取余的问…

    Java 2023年5月26日
    00
  • 什么是Java线程池?

    Java线程池是Java提供的一个用于管理和重复使用线程的机制。线程池将一组线程存储在内存中,当需要执行一些任务时,可以分配一个线程来处理任务,以提高性能和资源利用率。 Java线程池的使用攻略: 步骤1:创建一个线程池 Java线程池通常使用Executor工厂类来创建。 Executor提供了许多静态工厂方法来创建不同种类的线程池。其中,最常用的是Exe…

    Java 2023年5月11日
    00
  • SpringBoot2.3新特性优雅停机详解

    SpringBoot2.3新特性优雅停机详解 简介 在以往的项目中,我们在正常停止服务时,往往都是使用kill的方式来停止,这种方式虽然简单,但是可能会导致一些问题,比如程序被强制关闭时,可能会导致正在处理的请求直接中断等问题。SpringBoot2.3中新增了一个优雅停机的功能,可以让我们在停止服务时,更加安全和优雅。 优雅停机的原理 在之前的Spring…

    Java 2023年5月15日
    00
  • Mybatis 连接mysql数据库底层运行的原理分析

    下面我将介绍“Mybatis 连接mysql数据库底层运行的原理分析”的完整攻略。 概述 Mybatis 是一个优秀的数据访问框架,它支持自定义 SQL、存储过程以及高级映射。Mybatis 的底层数据库连接操作主要是由以下几个部分组成: 数据库连接池 数据源 SqlSessionFactory SqlSession 接下来我们将分别对这些部分进行详细的解析…

    Java 2023年5月20日
    00
  • Struts2 ActionContext 中的数据详解

    下面我将详细讲解一下“Struts2 ActionContext 中的数据详解”的完整攻略。 1. 什么是ActionContext ActionContext 是 Struts2 框架中的一个重要的类,它是一个 Map 对象,用于存储与请求执行过程有关的上下文信息。在 Struts2 中,每个请求都对应着一个请求上下文(ActionContext 对象),…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部