C#实例练手之test10-1
————2020/11/20
写作目的:相互学习交流,提供实例,练习C#,有啥问题,可以直接留言,也可以加我vx:poyeezy996.
目标题目:
1.参照P209例8.7进行实验,要求用到抽象类以及抽象方法。
2. 定义玩家类(Player)、枪类(Gun)。以及派生于玩家类的警察类(Police)
和坏人类(Robber),派生于枪类的手枪类(Handgun)和机关枪类
(MachineGun);
3. 手枪类可以造成1点初始伤害值,并且发出的声音为“biubiu” 。机关枪类可
以造成2点初始伤害值,发出的声音为“boomboom”
。
4. 警察类有初始20点血量,可以使用手枪对坏人射击,造成手枪的伤害值的伤害,
也可以选择前进一步,使得手枪伤害值提高100%;坏人类有初始20点血量,可
以使用机关枪对警察射击,造成机关枪的伤害值的伤害,也可以选择前进一步,
使得机关枪伤害值提高50%。
5. 在Main函数中循环坏人与警察进行选择判断,分别轮流输入数字进行操作。前
进增加伤害:1,开枪造成伤害:2。
6. 直至一方血量低于0,结束游戏。
目标生成内容:
思路讲解:
这一个题目涉及到的知识点其实吧,很简单。
1.抽象类以及抽象方法
(首先来看看抽象类和抽象方法是什么呢)
自己看书或者百度吧,记得抽象类不能实例化就行了。
1.1基本语法
1.1.1
抽象类:
abstarct class 类名{
//声明类成员
}
1.1.2
抽象方法:
abstract [修饰符] 返回值类型 方法名 ([形参列表]);
2.定义基类和派生类
using System;
namespace test10_1
{
public abstract class Player
{
public int hp; //血量
public abstract void forward();
public Player(int hp) {
this.hp = hp; }
}
class Police : Player
{
public override void forward()
{
Console.WriteLine("前进1步,伤害提升100%");
}
public Police(int hp=20) : base(hp) {
}//定义初始值
}
class Robber : Player
{
public override void forward()
{
Console.WriteLine("前进1步,伤害提升50%");
}
public Robber(int hp=20) : base(hp) {
}
}
abstract class Gun
{
public string voice;
public double damage;
public abstract void shoot();
public Gun(string voice,double damage) {
this.voice = voice;this.damage = damage; }
}
class Handgun:Gun
{
public override void shoot()
{
Console.Write("警察使用手枪向坏人射击。");
}
public Handgun(string voice="biu~biu", double damage=1) : base(voice,damage) {
}
}
class Machinegun : Gun
{
public override void shoot()
{
Console.Write("坏人使用手枪向警察射击。");
}
public Machinegun(string voice="boom~boom", double damage=2) : base(voice,damage) {
}
}
对于上面的代码,根据题目要求,基类有Player、Gun,派生类分别是Police、Robber;Handgun、Machinegun.
要完成动作,前进和射击的功能,我们在基类中分别定义抽象方法forward、shoot,在派生类中,对抽象方法重写,并对属性给定默认值,接下来对后面的对象创建,我们就可以不用给定值了
3.处理逻辑
这里是带佬给出来的思路
图都有了,自己看呗,不会留言区见。
于是我们就处理一下下面的逻辑问题。
class testprogram
{
static void Main()
{
int i;
int people=1;
Police pc = new Police();
Robber rb = new Robber();
Handgun hg = new Handgun();
Machinegun mg = new Machinegun();
Console.WriteLine("警察共有"+pc.hp+"滴血,射击一次造成"+hg.damage+"伤害");
Console.WriteLine("坏人共有" + rb.hp + "滴血,射击一次造成" + mg.damage + "伤害");
Console.WriteLine("开始游戏:");
while (pc.hp > 0 && rb.hp > 0)
{
if (people % 2 != 0)
{
Console.Write("坏人选择操作:1:前进1步,伤害提高50%;2:射击,造成"+ mg.damage +"点伤害。请选择:");
i = Convert.ToInt32(Console.ReadLine());
switch (i)
{
case 1:
rb.forward();
mg.damage *= 1.5;
people += 1;
break;
case 2:
mg.shoot();
Console.WriteLine(mg.voice);
pc.hp -= (int)mg.damage;
if(pc.hp<=0){
Console.WriteLine("警察死亡!");}
else{
Console.WriteLine("警察受到" + mg.damage + "点伤害,还剩" + pc.hp + "血");
}
people += 1;
break;
}
}
else if (people % 2 == 0)
{
Console.Write("警察选择操作:1:前进1步,伤害提高100%;2:射击,造成"+ hg.damage +"点伤害。请选择:");
i = Convert.ToInt32(Console.ReadLine());
switch (i)
{
case 1:
pc.forward();
hg.damage *= 2;
people += 1;
break;
case 2:
hg.shoot();
Console.WriteLine(hg.voice);
rb.hp -= (int)hg.damage;
if (rb.hp <= 0) {
Console.WriteLine("坏人死亡!"); }
else {
Console.WriteLine("坏人受到" + hg.damage + "点伤害,还剩" + rb.hp + "血");
}
people += 1;
break;
}
}
}
Console.ReadLine();
}
}
}
ps:上面两行代码在一起才能运行哦
嗯哼,首先定义一个i作为派生类在行动时的选择;people作为后面判定该谁进行选择用。
直接看,while一个都不能死,死了就不玩了。
if看到谁行动了
switch看选择啥选择中,把伤害算一下,people要累加。单数时坏人,双数是jc
于是代码就这样:你一枪我一枪的,演起来了电视桥段,最终正义或许回来迟,但是他永远不会缺席。
PS:我可真想把这玩意放到无限大.
今天完。
转载:https://blog.csdn.net/qq_45078184/article/details/109864342