如何用java编写一个简单的多人PK游戏

如何用java编写一个简单的多人PK游戏

  • 类与对象---PK游戏的编写
    • 素材取用----王者荣耀和BILIBILI
      • 创建两个对战的角色(PK游戏最少需要两名角色)
        • 创建孙尚香和Van
          • 设置孙尚香和Van的属性
          • 设置孙尚香和Van的技能
            • -设计技能的流程
            • 设置孙尚香和Van的技能
          • 如何确定他们技能的使用对象----使用方法:参数
      • 开始设置他们的PK程序
        • 设置选择英雄
        • 买装备
        • 使用技能
        • 对战过程的设计
        • 判断胜负
      • 加入的第三个角色与胜利者PK
        • 创建新角色类
        • 选出胜利者
        • 让胜利者与加入的第三个角色PK
        • 判断最终游戏的胜负
      • 我的问题:如何简化技能的设置以致我们可以在对战对象较多时不用重复设置方法就能应对所有对象?

类与对象—PK游戏的编写

素材取用----王者荣耀和BILIBILI

创建两个对战的角色(PK游戏最少需要两名角色)

创建孙尚香和Van

- 创建Van和孙尚香的类文件
public class Van//或者SunShangxiang
{
}
设置孙尚香和Van的属性
 设置属性:变量和常量

           格式:属性属于的类型 属性名字
           变量:String classID/int ad
           常量:final int classID=0.01//final为最终变量

//以此设置孙尚香和Van的名字、攻击力…各种对战时所需要的属性

//设置Van(孙尚香)角色的属性
	String nameID;
	int ad;
	int ap;
	int hp;
	int lv;
设置孙尚香和Van的技能
-设计技能的流程
- 将其放入类方法里来实现
格式:返回值类型 方法名 (参数类型 参数名){//方法名}
         void 技能名(攻击对象类 攻击对象的名){
         }
- 选定技能使用对象
public void ack_3(Van van){
    
}//其中van就是技能作用的对象,它是以对象的形式作为方法的参数
- 将其技能伤害值赋予一个num(由于伤害值可能是浮点数所以这里需要将其强制转化为整数)
int num=(int)(500+0.75*ad+125*lv)
- 用hp(血量)减少来表示技能造成的伤害效果
van.hp -=num;
- 输出技能使用结果
System.out.print(nameID+"使用技能攻了"+van.nameID);
System.out.println(van.nameID+"减少了"+num+"血量,还剩hp"+van.hp);
设置孙尚香和Van的技能
- 孙尚香类的技能:

  对于目标范围内的敌人造成500/625/750(+75%物理加成)点物理伤害
//设置孙尚香的技能
		public void ack_3(Van van) {
			//孙尚香类的技能 :对于目标范围内的敌人造成500/625/750(+75%魔法加成)点魔法伤害
			int num=(int)(500+0.75*ad+125*lv);//将结果强制转为整数型--小数点后全部直接省略
			//计算一次技能攻击之后的血量
			van.hp -=num;
			
			//输出攻击结果
			System.out.print(nameID+"使用技能攻击了"+van.nameID);
			System.out.println(van.nameID+"减少了"+num+"血量,还剩hp"+van.hp);
			}
- Van类的技能:

  对范围内的敌人造成700/1000/1300(+90%物理加成)点物理伤害
//设置Van的技能
	public void ack_3(SunShangxiang ssx) {
		//Van类的技能 :对范围内的敌人造成700/1000/1300(+90%物理加成)点物理伤害
		int num=(int)(700+0.9*ad+300*lv);//将结果强制转为整数型--小数点后全部直接省略
		//计算一次技能攻击之后的血量
		ssx.hp -=num;
		
		//输出攻击结果
		System.out.print(nameID+"使用技能攻击了"+ssx.nameID);
		System.out.println(ssx.nameID+"减少了"+num+"血量,还剩hp"+ssx.hp);
		
		
	}
如何确定他们技能的使用对象----使用方法:参数
-  参数:参数类型 参数名;

-  参数名:在方法中参数名是在方法被调用的时候传入的一个参数

   它可以是一个数值也可以是一个对象,

   而在这个方法中我们以对象van和ssx作为参数名

   在调用技能的时候我们就将van和ssx的数据传入这个方法中

开始设置他们的PK程序

一个主函数就是一个程序–简单的PK程序也是如此

设置选择英雄

也就是创建使用的英雄这个对象

- 创建对象

      关键字:new
  
      格式:类名 对象名=关键字 类名
          
- 创建ssx和van对象
//首先创建双方的对象
		SunShangxiang ssx=new SunShangxiang();
		Van van=new Van();

买装备

也就是给我们创建角色各种属性来赋值

- 赋值格式:

hy.属性名字=赋值;–属性的赋值

- 给van和ssx赋值
//给两个对象属性赋值
		ssx.nameID="孙尚香";
		ssx.hp=10000;
		ssx.ad=100;
		ssx.ap=359;
		ssx.lv=18;
		
		van.nameID="佟大为";
		van.hp=9854;
		van.ad=342;
		van.ap=108;
		van.lv=10;

使用技能

也就是在程序里面使用创建对象的方法

- 方法使用格式:

 hy.方法名();--方法的引用

- ssx和van的技能的使用

  ssx.ack_3(van);

 van.ack_3(ssx);

对战过程的设计

在对战过程中我们需要多次互相的技能使用才能决一胜负,所以我们设计一个循环结构使他们循环PK

- 设计van和ssx的循环PK结构
//用while创建循环对战过程
		while(ssx.hp>0&&van.hp>0) {
		ssx.ack_3(van);
		
		van.ack_3(ssx);
		}
		

但是这样当一个人血量先小于零

时还会再次攻击这会导致双方血量都小于零不好判断最终对战结果

所以我们设计一个if判断语句使血量小于零的对象不可以再次攻击

- 添加一个if结构
//用while创建循环对战过程
		while(ssx.hp>0&&van.hp>0) {
		ssx.ack_3(van);
		
		//为了保证孙尚香每次攻击之前血量都大于0
				if(van.hp>0) {
				van.ack_3(ssx);}
		}
		

判断胜负

在PK游戏中谁的血量小于零谁就输了,所以我们使用一个if结构来判断谁输谁赢

- 判断胜负程序
//判断哪一方胜利
		if(ssx.hp>0) {
			System.out.print(ssx.nameID+"更勇!!");
		}
		else
		{System.out.print(van.nameID+"更勇!!");}

加入的第三个角色与胜利者PK

由于需要第三个角色,所以我们需要先创建一个新的角色类

创建新角色类

- 和上面创建角色类一样的方法
     -设置属性:变量和常量
              格式:属性属于的类型 属性名字
              变量:String classID/int ad
              常量:final int classID=0.01//final为最终变量

     -技能格式:返回值类型 方法名 (参数类型 参数名){//方法名}
        void 技能名(攻击对象类 攻击对象的名){
        }

创建先辈类

//设置属性
	String nameID;
	int ad;
	int hp;
	int lv;
//设计技能
	public void chouqidan() {
		
	//田所浩二类的技能 :对于目标范围内的敌人造成500/625/750(+75%魔法加成)点魔法伤害
		int num=(int)(500+0.75*ad+125*lv);
		//技能造成伤害以血量减少实现
		van.hp -=num;
		//输出技能攻击结果
		System.out.print(nameID+"使用臭气弹攻击力"+van.nameID);
		System.out.println("使其减少了"+num+"的血量,王还hp还剩"+van.hp);
	}

在这里会遇到一个问题—有两个可以攻击的对象

 - 解决办法一 ---写两个一样的方法分别以另外两个对象为参数
//设计技能
	public void chouqidan(Van van) {
		
	//田所浩二类的技能 :对于目标范围内的敌人造成500/625/750(+75%魔法加成)点魔法伤害
		int num=(int)(500+0.75*ad+125*lv);
		//技能造成伤害以血量减少实现
		van.hp -=num;
		//输出技能攻击结果
		System.out.print(nameID+"使用臭气弹攻击力"+van.nameID);
		System.out.println("使其减少了"+num+"的血量,王还hp还剩"+van.hp);
	}
	
	public void chouqidan(SunShangxiang ssx) {
		
		//田所浩二类的技能 :对于目标范围内的敌人造成500/625/750(+75%魔法加成)点魔法伤害
			int num=(int)(500+0.75*ad+125*lv);
			//技能造成伤害以血量减少实现
			ssx.hp -=num;
			//输出技能攻击结果
			System.out.print(nameID+"使用臭气弹攻击力"+ssx.nameID);
			System.out.println("使其减少了"+num+"的血量,王还hp还剩"+ssx.hp);
		}

在另外两个类中也需要再加一个以先辈类对象为参数的方法

  • ssx

    public void ack_3(Xianbei tiansuohaoer) {
    			//孙尚香类的技能 :对于目标范围内的敌人造成500/625/750(+75%魔法加成)点魔法伤害
    			int num=(int)(500+0.75*ad+125*lv);//将结果强制转为整数型--小数点后全部直接省略
    			//计算一次技能攻击之后的血量
    			tiansuohaoer.hp -=num;
    			
    			//输出攻击结果
    			System.out.print(nameID+"使用技能攻击了"+tiansuohaoer.nameID);
    			System.out.println(tiansuohaoer.nameID+"减少了"+num+"血量,还剩hp"+tiansuohaoer.hp);
    		}
    
  • van

    public void ack_3(Xianbei tiansuohaoer) {
    		//Van类的技能 :对范围内的敌人造成700/1000/1300(+90%物理加成)点物理伤害
    		int num=(int)(700+0.9*ad+300*lv);//将结果强制转为整数型--小数点后全部直接省略
    		//计算一次技能攻击之后的血量
    		tiansuohaoer.hp -=num;
    		
    		//输出攻击结果
    		System.out.print(nameID+"使用技能攻击了"+tiansuohaoer.nameID);
    		System.out.println(tiansuohaoer.nameID+"减少了"+num+"血量,还剩hp"+tiansuohaoer.hp);
    		
    		
    	}
    
  • 将新的角色类在对战程序中创建类

    类比于上述角色类对象的创建

    //加入第三个角色的属性用于擂台对战
    		tiansuohaoer.nameID="野兽先辈";
    		tiansuohaoer.ad=200;
    		tiansuohaoer.hp=2500;
    		tiansuohaoer.lv=3;
    

选出胜利者

 以if语句来通过判断血量值来判断谁胜谁负
//选出胜利的那一个英雄与另外一个英雄PK
		if(ssx.hp>0) {
	
		    }
			else {
		
			}
				

让胜利者与加入的第三个角色PK

再次用while语句来设置循环对战并分别加入if else语句中

  • 分别设置循环对战

    • 孙尚香与野兽先辈

      while(ssx.hp>0&&tiansuohaoer.hp>0) {
      				ssx.ack_3(tiansuohaoer);
      				
      				//为了保证田所浩二每次攻击之前血量都大于0
      						if(tiansuohaoer.hp>0) {
      							tiansuohaoer.chouqidan(ssx);}
      			}
      
    • Van和野兽先辈

      while(tiansuohaoer.hp>0&&van.hp>0) {
      				tiansuohaoer.chouqidan(van);
      				
      				//为了保证田所浩二每次攻击之前血量都大于0
      						if(tiansuohaoer.hp>0) {
      							tiansuohaoer.chouqidan(van);}
      				
      				}
      
  • 将其加入if else结构中组成选择和对战程序

    //选出胜利的那一个英雄与另外一个英雄PK
    		if(ssx.hp>0) {
    			while(ssx.hp>0&&tiansuohaoer.hp>0) {
    				ssx.ack_3(tiansuohaoer);
    				
    				//为了保证田所浩二每次攻击之前血量都大于0
    						if(tiansuohaoer.hp>0) {
    							tiansuohaoer.chouqidan(ssx);}
    			}
    		}
    			else {
    				while(tiansuohaoer.hp>0&&van.hp>0) {
    				tiansuohaoer.chouqidan(van);
    				
    				//为了保证田所浩二每次攻击之前血量都大于0
    						if(tiansuohaoer.hp>0) {
    							tiansuohaoer.chouqidan(van);}
    				
    				}
    			}
    

判断最终游戏的胜负

用if结构来判断最终的胜者

//判断哪一方胜利
		//由于所需要判断的对象有三个,所以我使用三个if结构而不是if else结构来判断他们的胜利
		if(ssx.hp>0) {
			System.out.print(ssx.nameID+"更勇!!");
		}
		if(van.hp>0)
		{System.out.print(van.nameID+"更勇!!");}
	
	     if(tiansuohaoer.hp>0)
	    {System.out.print(tiansuohaoer.nameID+"更勇!!");}

我的问题:如何简化技能的设置以致我们可以在对战对象较多时不用重复设置方法就能应对所有对象?

你可能感兴趣的:(Java,java,游戏)