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日

相关文章

  • 你知道将Bean交给Spring容器管理有几种方式(推荐)

    将Bean交给Spring容器管理的方式 在Spring中,我们可以将Bean交给Spring容器管理,从而实现依赖注入和控制反转。下面是将Bean交给Spring容器管理的几种方式。 1. 使用@Component注解 @Component是Spring中最常用的注解之一,用于将一个类声明为Bean,并交给Spring容器管理。下面是一个简单的示例: @C…

    Java 2023年5月18日
    00
  • SpringBoot如何手写一个starter并使用这个starter详解

    Spring Boot 如何手写一个 Starter 并使用这个 Starter 的完整攻略 在本文中,我们将详细讲解如何手写一个 Spring Boot Starter 并使用这个 Starter 的完整攻略。我们将使用 Spring Boot、Maven 和自定义 Starter 来实现这个工具。 步骤一:创建 Maven 项目 首先,我们需要一个 Ma…

    Java 2023年5月15日
    00
  • IDEA编译乱码Build Output提示信息乱码

    当使用IntelliJ IDEA进行编译时,我们有时会遇到编译乱码和Build Output提示信息乱码的问题。下面是解决这些问题的攻略。 问题1:编译乱码 问题描述 编译代码时提示以下错误信息: java.lang.Exception: some error message 在IDEA输出窗口中显示: Error:java: 编码 ON 的不可映射字符 解…

    Java 2023年5月20日
    00
  • Android图片的Base64编码与解码及解码Base64图片方法

    针对这个话题,以下是详细讲解“Android图片的Base64编码与解码及解码Base64图片方法”的完整攻略。 什么是Base64编码 Base64编码是一种用于将二进制数据转为文本数据的编码方式,主要用途是将数据在网络上进行传输,例如在网页中展示图片等。 如何在Android中进行Base64编码 在Android中,我们可以使用Base64类进行Bas…

    Java 2023年5月20日
    00
  • java队列实现方法(顺序队列,链式队列,循环队列)

    Java中队列数据结构可以通过顺序队列、链式队列和循环队列三种方法来实现。下面我们将针对这三种方法分别进行详细讲解。 顺序队列实现方法 1. 定义数据结构 首先我们需要定义一个存储元素的数组,以及头尾指针front和rear来记录队列中的元素位置。 public class SeqQueue<T> { private T[] data; // 存…

    Java 2023年5月26日
    00
  • 使用Maven打包时包含资源文件和源码到jar的方法

    下面我将详细讲解使用Maven打包时包含资源文件和源码到jar的方法。 1. 配置maven-assembly-plugin插件 首先需要在项目的pom.xml文件中添加maven-assembly-plugin插件的配置。 <build> <plugins> <plugin> <groupId>org.apa…

    Java 2023年5月19日
    00
  • 举例讲解Java中Piped管道输入输出流的线程通信控制

    讲解Java中Piped管道输入输出流的线程通信控制的攻略如下: 什么是Piped管道输入输出流 Java中的Piped输入输出流是一种基于管道(pipe)的流方式。管道是一种常见的进程间通信(IPC)的方式。Piped输入输出流提供了一个可以连接线程的管道,其中一个线程通过写入实现输出流的数据传递,而另一个线程通过读取实现输入流的数据读取。 Piped的使…

    Java 2023年5月26日
    00
  • Terry七月Ruby读书笔记(比较详细)第2/4页

    你好,针对“Terry七月Ruby读书笔记(比较详细)第2/4页”的完整攻略,我将分享以下内容: 1. 阅读前的准备 在阅读该笔记之前,我们需要先掌握 Ruby 的基本语法知识,并且了解 Ruby 中常用的代码结构和函数库。如果我们对 Ruby 还不是很了解,可以先通过官方文档、教程或者其他学习资源进行学习。 2. 分析文章的结构 在开始阅读该笔记时,我们应…

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