Java小游戏

这篇具有很好参考价值的文章主要介绍了Java小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、需求

             Java小游戏,java,开发语言

 二、思路一

        HP当然是怪物的一个属性成员,而武器是角色的一个属性成员,类型可以使字符串,用于描述目前角色所装备的武器。角色类有一个攻击方法,以被攻击怪物为参数,当实施一次攻击时,攻击方法被调用,而这个方法首先判断当前角色装备了什么武器,然后据此对被攻击怪物的HP进行操作,以产生不同效果

package com.homework.game;

public class Monster {
    //定义怪物名称
    public String monster_name;
    //定义怪物血量
    public int monster_hp;
    //定义构造方法
//    public Monster(){
//    }
    //定义有参数的构造方法,主函数中调用此方法可以传递怪物的名称和初始血量
    public Monster(String name,int hp){
        //给怪物名称和初始血量赋值
        this.monster_name = name;
        this.monster_hp = hp;
    }
//    //设置怪物的名称
//    public void setMonsterName(String name){
//        this.monster_name = name;
//    }
    //返回怪物名称
    public String getMonsterName(){
        return this.monster_name;
    }
    //设置怪物的血量
    public void setMonsterHp(int hp){
        this.monster_hp = hp;
    }
//返回怪物血量
    public int getMonsterHp(){
        return this.monster_hp;
    }
}





package com.homework.game;

import javax.sound.midi.SoundbankResource;
import java.util.Random;

public class Player {
    //创建玩家名称变量
    public String player_name;
    //创建玩家武器变量
    public String player_weapon;
    //设置玩家名称方法
    public void setPlayerName(String name){
        this.player_name = name;
    }
    //获取玩家名称方法
    public String getPlayerName(){
        return this.player_name;
    }
    //设置玩家武器
    public void setPlayWeapon(String weapon){
        this.player_weapon = weapon;
    }
    //获取玩家武器
    public String getPlayerWeapon(){
        return this.player_weapon;
    }
    //玩家攻击方法
    public void attackMethod(Monster monster){
//        System.out.println(monster.getMonsterHp());
//        System.out.println(this.player_weapon);
        if (monster.getMonsterHp() > 0){
            if("木剑".equals(this.player_weapon)){
               int hp = monster.getMonsterHp();
               hp = hp - 20;
               monster.setMonsterHp(hp);
               if (hp > 0){
                   System.out.println(this.player_name+"用"+this.player_weapon+"打了20HP,"+
                           monster.getMonsterName()+"还剩余"+monster.getMonsterHp()+"血量,可继续攻击");
               }else {
                   System.out.println(monster.getMonsterName()+"被击杀!!!");
                   return;
               }
            }else if("铁剑".equals(this.player_weapon)){
                if (monster.getMonsterHp() > 0){
                    int hp = monster.getMonsterHp();
                    hp = hp - 50;
                    monster.setMonsterHp(hp);
                    if (hp > 0){
                        System.out.println(this.player_name+"用"+this.player_weapon+"打了50HP,"+
                                monster.getMonsterName()+"还剩余"+monster.getMonsterHp()+"血量,可继续攻击");
                    }else {
                        System.out.println(monster.getMonsterName()+"被击杀!!!");
                        return;
                    }
                }else {
                    System.out.println(monster.getMonsterName()+"死了,不需要攻击了!!!");
                    return;
                }
            }else if("魔剑".equals(this.player_weapon)){
                if (monster.getMonsterHp() > 0){
                    int random = ((int)(Math.random()*10))+1;
                    int less_hp = (random > 5)?200:100;
                    if (less_hp == 200){
                        System.out.println("暴击了!!!!");
                    }
                    int hp = monster.getMonsterHp();
                    hp = hp - less_hp;
                    monster.setMonsterHp(hp);
                    if (hp > 0){
                        System.out.println(this.player_name+"用"+this.player_weapon+"打了"+less_hp+"HP"+
                                monster.getMonsterName()+"还剩余"+monster.getMonsterHp()+"血量,可继续攻击");
                    }else {
                        System.out.println(monster.getMonsterName()+"被击杀!!!");
                        return;
                    }
                }
            }else {
                System.out.println("没有武器,无法攻击");
            }
        }else {
            System.out.println(monster.getMonsterName()+"死了,无需攻击!!!");
        }
    }
}




package com.homework.game;

import java.util.Scanner;

public class TestMain {
    public static void main(String[] args) {
        System.out.println("------------------游戏开始------------------");
        //创建怪物对象
        Monster monster = new Monster("魔王",500);
        //创建玩家对象
        Player player = new Player();
        //创建两个录入对象

        Scanner player_name_scanner = new Scanner(System.in);

        Scanner player_weapon_scanner = new Scanner(System.in);
        //定义玩家名称变量
        System.out.println("请输入玩家名称:");
        String player_name = player_name_scanner.next();
        while(true){
            if(monster.getMonsterHp() > 0){
                System.out.println("请输入武器准备(木剑、铁剑、魔剑):");
                String player_weapon = player_weapon_scanner.next();
                player.setPlayerName(player_name);
                player.setPlayWeapon(player_weapon);
                player.attackMethod(monster);
            }else {
                System.out.println("--------------------You Win----------------------");
                break;
            }
        }
    }
}

 小结:

计的角色类的攻击方法很长,并且方法中有一个冗长的if…else结构,且每个分支的代码的业务逻辑很相似,只是很少的地方不同。

再者,上述设计思路,违反了O【Open】C【Close】P原则。在这个设计中,如果以后我们增加一个新的武器,如倚天剑,每次攻击损失500HP,那么,我们就要打开角色类,修改攻击方法。而我们的代码应该是对修改关闭的,当有新武器加入的时候,应该使用扩展完成,避免修改已有代码。

一般来说,当一个方法里面出现冗长的if…else或switch…case结构,且每个分支代码业务相似时,往往预示这里应该引入多态性来解决问题。而这里,如果把不同武器攻击看成一个策略,那么引入策略模式(Strategy Pattern)是明智的选择

Tip:OCP原则,即开放关闭原则,指设计应该对扩展开放,对修改关闭。

Tip:策略模式,英文名Strategy Pattern,指定义算法族,分别封装起来,让他们之间可以相互替换,此模式使得算法的变化独立于客户。

三、思路二

        因上述原因,我们重新设计,得到以下思路

Java小游戏,java,开发语言

 

package com.homework.game2;
//定义一个攻击接口,以怪物作为参数,各类武器实现这个攻击接口
public interface Attack {
    public void attcak(Monsters monsters);
}


package com.homework.game2;
//武器----木剑
public class WoodenSword implements Attack {
    @Override
    public void attcak(Monsters monsters) {
       //通知怪物失去对应血量
        monsters.bloodLoss(20,"木剑");
    }
}



package com.homework.game2;
//武器----铁剑类
public class IronSword implements Attack{
    @Override
    public void attcak(Monsters monsters) {
        //通知怪物掉血50
        monsters.bloodLoss(50,"铁剑");
    }

}


package com.homework.game2;

import javax.sound.midi.SoundbankResource;

//武器-----魔剑类
public class MagicSword implements Attack{
    @Override
    public void attcak(Monsters monsters) {
        int random = ((int)(Math.random()*10))+1;
        if(random > 5){
            System.out.println("魔剑暴击了,击杀200Hp!!!");
            monsters.bloodLoss(200,"魔剑");
        }else {
            monsters.bloodLoss(100,"魔剑");
        }
    }
}


package com.homework.game2;
//怪物类
public class Monsters {
    //定义怪物的名称
    public String monsters_name;
    //定义怪物的血量
    public int monsters_hp;
//    //构造方法,用来创建对象
//    public Monsters(){}
//    //定义怪物的构造方法,在主方法中传入参数,初始化怪物属性
    public Monsters(String name,int hp){
        this.monsters_name = name;
        this.monsters_hp = hp;
    }
//    //获取怪物名称方法
//    public String getMonstersName(){
//        return this.monsters_name;
//    }
//    //设置怪物血量
//    public void setMonstersHp(int hp){
//        this.monsters_hp = hp;
//    }
//    //获取怪物血量
//    public int getMonsterHp(){
//        return this.monsters_hp;
//    }
    //怪物掉血的方法,参数  1.掉血量;2.使用的武器
    Players players =new Players("王也");
    public void bloodLoss(int hp,String weapon_name){
        if(this.monsters_hp > 0){
            this.monsters_hp = this.monsters_hp - hp;
            if(this.monsters_hp > 0){
                System.out.println(players.getPlayersName()+"用"+weapon_name+"攻击了"+this.monsters_name+hp+
                        "Hp,剩余"+this.monsters_hp+"Hp,可以继续攻击");
            }else {
                System.out.println(this.monsters_name+"死了,无需攻击");
            }
        }else {
            System.out.println(this.monsters_name+"死了,无需攻击");
            return;
        }
    }
}




package com.homework.game2;
//玩家类
public class Players {
    //定义玩家名称
    public String players_name;
    //定义玩家武器
    public Attack players_weapon;
    //设置玩家构造方法,初始化玩家名称
    public Players(String name){
        this.players_name = name;
    }
//    //设置玩家名称方法
//    public void setPlayersName(String name){
//        this.players_name = name;
//    }
    //获取玩家名称方法
    public String getPlayersName(){
        return this.players_name;
    }
    //接口回调 Attack weapon 接口回调变量
    //设置玩家武器方法,传入接口参数,将变量赋值给this.players_weapon
    public void setPlayersWeapon(Attack weapon){
        this.players_weapon = weapon;
    }
//    //获取玩家武器方法
//    public Attack getPlayersWeapon(){
//        return this.players_weapon;
//    }
    //玩家攻击方法
    public void player_AttcakMethod(Monsters monsters){
        this.players_weapon.attcak(monsters);
    }

}



package com.homework.game2;

public class TestMain {
    public static void main(String[] args) {
        //创建怪物对象
        Monsters monsters = new Monsters("大魔王",200);
        //创建玩家对象
        Players players = new Players("王也");
        players.setPlayersWeapon(new WoodenSword());
        players.player_AttcakMethod(monsters);
        players.setPlayersWeapon(new IronSword());
        players.player_AttcakMethod(monsters);
        players.setPlayersWeapon(new MagicSword());
        players.player_AttcakMethod(monsters);
    }
}

改进后的代码有如下优点:

第一,虽然类的数量增加了,但是每个类中方法的代码都非常短,没有了以前攻击方法那种很长的方法,也没有了冗长的if…else,代码结构变得很清晰。

第二,类的职责更明确了。在第一个设计中,角色不但负责攻击,还负责给怪物减少HP和判断怪物是否已死。这明显不应该是角色的职责,改进后的代码将这两个职责移入怪物内,使得职责明确,提高了类的内聚性。

第三,引入Strategy[策略]模式后,不但消除了重复性代码,更重要的是,使得设计符合了OCP。如果以后要加一个新武器,只要新建一个类,实现武器接口,当角色需要装备这个新武器时,客户代码只要实例化一个新武器类,并赋给角色的武器成员就可以了,已有的角色和怪物代码都不用改动。这样就实现了对扩展开发,对修改关闭文章来源地址https://www.toymoban.com/news/detail-670299.html

到了这里,关于Java小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java小游戏——飞翔的小鸟(java初学作品)

    注:学习了java基础后,做出来的一个小作品,可以用来巩固学习 飞翔的小鸟能够作为Java基础的收官之作,包涵了Java很多的基础知识,在学习完Java基础后,尝试编写一些东西,能够起到很好的查漏补缺的作用。这里实现了Java小游戏飞翔的小鸟的一些基本功能。另外,随着学

    2024年02月10日
    浏览(43)
  • Java实现王者荣耀小游戏

    主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小兵每隔一段时间自动生成,在王者峡谷下路

    2024年02月04日
    浏览(43)
  • Java拼图小游戏------《Java程序设计》课程设计

    目录 1.1 研究的背景  1.2 研究的意义  1.3 国内外研究现状  国内研究现状: 国外研究现状:          2.1 Java技术          2.2 GUI技术           2.3 内容设计要求及算法的实现 内容: 要求: 设计算法实现:          3.1设计流程图          3.2系统界面展示          

    2024年02月04日
    浏览(43)
  • Java小游戏-俄罗斯方块

    摘 要 随着时代的不断发展,个人电脑也在不断普及,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或工作之余休闲娱乐的首选,从最开始的Windows系统自带的黑白棋、纸牌、扫雷等游戏开始,到现在目不暇接的各种游戏,游戏已经成为人们在使用计算机进行工作或

    2024年02月03日
    浏览(53)
  • 2048小游戏 java版(代码+注释)

            一个纯纯小白,想写点什么,也想学习一下怎么在这里写东西,就简单的写个2048小游戏。写的不好,大佬就不用看了,希望和大家交流学习,有写的不好或有更好的建议也欢迎提出来。(需要用的可直接粘贴复制)(轻喷) 目录 游戏展示 讲解  代码        

    2024年02月09日
    浏览(49)
  • Java制作“简易王者荣耀”小游戏

    第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame   运行类 运行结果如下:

    2024年02月04日
    浏览(51)
  • 万年历【小游戏】(Java课设)

    Java实现的小游戏 适合作为Java课设!!! jdk1.8+Idea或eclipse 本系统源码地址:https://download.csdn.net/download/qq_50954361/87801830 更多Java课设系统源码地址:更多Java课设系统源码地址 更多Java小游戏运行效果展示:更多Java小游戏运行效果展示 Java课设部署教程:Java课设部署教程 注意事

    2024年02月15日
    浏览(46)
  • 【Java编程指南】猜数字小游戏

    目录 一、前言 二、Random类 1.导包 2.创建对象 3.生成随机数 4.更改范围 5.演示 三、猜数字 1.需求 2.生成随机数范围 3.不限次数 4.规定次数 学习概述 :Java编程指南第6天、第7天我们学习了分支、循环结构,今天我们利用前面学过的知识点,加上一个 Random 类,动手完成一个 猜

    2023年04月08日
    浏览(44)
  • 【Java实现小游戏】飞翔的小鸟(源码)

    游戏玩法:通过鼠标点击使小鸟上下移动穿过柱子并完成得分,小鸟碰到柱子或掉落到地面上都会结束游戏。 (游戏内图片)     下面是实现这个游戏的代码:    Brid类:    BridGame类: Column类: Ground类:    

    2024年02月12日
    浏览(40)
  • java版本实现推箱子小游戏

    推方块 游戏简介: 由 ↑,↓,←,→键来控制方向,点击空格键表示重玩当前关卡。 核心代码部分 :就是如何处理人的移动和人和箱子一起时的移动,这里需要对人要走的下一步和人推着箱子一起走的下一步进行判断分析,如果没有被阻挡就可以继续走下一步。(有兴趣

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包