小小程序:娱乐游戏


      偶尔看以前练习的代码,看到这个小项目,想起了马老师,大一时候我们的技能老师。马老师,是一个很好的老师,对我们学生都很好,他是我学习编程的启蒙老师!当时学C#时,有点吃力,对于一个重来没怎么接触过电脑的人来说,学习编程,要了解什么是面向对象真的很难,我就是跟着马老师一步一步的学过来的,对我帮助很大。老师没事也和我们开玩笑,整点搞笑的东西,听他的课不感觉累,也不困,兴趣挺足的。还记得那句:Hi Man, Welcome To China!Let's Go!这个小项目也是老师写的,大家娱乐的,那时真的很乐呵,程序还可以这样写!是他带我入门的,而且还把《大话设计模式》介绍给我们,虽然没带着我们学,或讲解其中的设计模式,我后来是自己看了看,虽然理解不是很透,但对编程有很大提高,尤其是编程思想。老师那时可能觉得我们的理解能力不够,一个面向对象都理解不透,在整个设计模式,不累死才怪!呵呵。。。在大二的时候,就调班级了,马老师带其他班了,孙老师带我们。虽然在一个校园,校园也不是很大,但是自己老是就在那几个地方活动,也很少很这些老师照面,孙老师也是在课上能见到,私下也很少碰到。后来和一个同学聊起了马老师,(马老师是他们班的代课老师),说老师换工作了,不再教学了,进一个公司了,什么公司他们也不清楚!哎!学校又少了一个好老师!不知道以后还会不会遇到,看缘分吧!

     废话说了些,下面说说这个小项目:一个恶搞游戏的项目,用控制台写的,纯属恶搞,娱乐一下。(我们大一的一切练习都是用控制台写的,到大二才练习用WinForm做项目)

结构图:

主要是人物和怪兽的PK,人物主要有战士和法师,怪兽有怪物1:伟大的阿特蒙斯和怪物2:小泉纯一郎 ,我没改源码,只是加了一些注释,便于理解,老师当时也这是做着玩玩,娱乐一下!
主要有:Role类,Player类,Moster类,Warrior类,Moster1类和Monster2类,当然少不了Program类了。

Roel类是抽象的父类,Player类和Monster类都是继承Role的抽象类,继承父类的公共的属性方法;

Player类又有MaxGP字段,Attack抽象方法和Introduce抽象方法,Monster类有Attack抽象方法,都是为下面的继承做的;

Warrior类和Master类是继承自Player类,继承公共的属性字段,重写Itroduce和Attack方法,Monster1类和Moster2类继承Monster类的公共属性方法,重新写Introduce和Attack方法;

对于Player人物类和Monster怪物类都有:
姓名、攻击力、魔法值、血量、防御力、等级、经验值这些属性,想到把代码拿出来写一个抽象函数中,封装对应的字段属性,可以减少代码量;如果你在Plyer类和Monster类中都分别写的话,代码显得多,而且浪费功夫,代码的复用性;这样易于维护,如果要添加字段、属性,可以很好的添加,修改也是一样;尽量做到高内聚低耦合,修改Role类,对Player类和Monster类的构造函数有一定的影响。

 

这是Roel类的代码:抽象类,封装一些公共的字段、属性、方法,如:姓名、攻击力、魔法值、血量、防御力、等级、经验值;

关键字:abstract;值类型:int类型;修饰符:Protected;Public的Speak()方法,虽然没有到,不过扩展功能时,可能会用到!

代码如下:

View Code
/*
* 程序员:
* 时间:
* 功能:抽象公共角色类,为人物类和怪兽类继承的,
*/
using System;

namespace DAL
{
///<summary>
/// 公共角色类
///</summary>
public abstract class Role
{

#region 字段
///<summary>
/// 姓名
///</summary>
protected string _Name;
///<summary>
/// 攻击力
///</summary>
protected int _ATK;
///<summary>
/// 魔法值
///</summary>
protected int _Mp;
///<summary>
/// 血量
///</summary>
protected int _Hp;
///<summary>
/// 防御力
///</summary>
protected int _Defence;
///<summary>
/// 等级
///</summary>
protected int _Grade;
///<summary>
/// 经验
///</summary>
protected int _Gp;
#endregion

#region 属性
///<summary>
/// 姓名
///</summary>
public string Name
{
get { return _Name; }
set { _Name = value; }
}
///<summary>
/// 攻击力
///</summary>
public int ATK
{
get { return _ATK; }
set { _ATK = value; }
}
///<summary>
/// 血量
///</summary>
public int Hp
{
get { return _Hp; }
set { _Hp = value; }
}
///<summary>
/// 防御力
///</summary>
public int Defence
{
get { return _Defence; }
set { _Defence = value; }
}
///<summary>
/// 等级
///</summary>
public int Grade
{
get { return _Grade; }
set { _Grade = value; }
}
///<summary>
/// 经验
///</summary>
public int Gp
{
get { return _Gp; }
set { _Gp = value; }
}
///<summary>
/// 魔法
///</summary>
public int Mp
{
get { return _Mp; }
set { _Mp = value; }
}
#endregion

#region 构造函数
///<summary>
/// Role类构造函数
///</summary>
///<param name="name">姓名</param>
///<param name="atk">攻击力</param>
///<param name="mp">魔法值</param>
///<param name="hp">血量</param>
///<param name="defence">防御力</param>
///<param name="grade">等级</param>
///<param name="gp">经验值</param>
public Role(string name, int atk, int mp, int hp, int defence, int grade, int gp)
{
this._Mp = mp;
this._Hp = hp;
this._Name = name;
this._ATK = atk;
this._Defence = defence;
this._Grade = grade;
this._Gp = gp;
}
#endregion

#region 方法
///<summary>
/// 说话方法
///</summary>
public void Speak()
{
Console.WriteLine("我是{0}", this.Name);
}
#endregion
}
}

这是Player类的代码:抽象类,继承自Role类;自有的一个字段:MaxGp;关键字abstract;抽象的Attack(Monster mo)和Introduce()方法,返回值为空;

对于抽象Attack(Monster mo)方法,传入对象Monster类实体,本程序是继承Monster的Monster1和Monster2(人物攻击怪兽);

代码如下:

View Code
/*
* 程序员:
* 时间:
* 功能:抽象公共人物类:继承角色类,攻击怪兽
*
*/
using System;

namespace DAL
{
///<summary>
/// 公共人物类
///</summary>
public abstract class Player:Role
{
///<summary>
/// 最大经验值
///</summary>
protected int _MaxGp;

public int MaxGp
{
get { return _MaxGp; }
set { _MaxGp = value; }
}

///<summary>
/// Player构造函数
///</summary>
///<param name="name">姓名</param>
///<param name="atk">攻击力</param>
///<param name="mp">魔法值</param>
///<param name="hp">血量</param>
///<param name="defence">防御力</param>
///<param name="grade">等级</param>
///<param name="gp">经验值</param>
///<param name="maxgp">最大经验值</param>
public Player(string name,int atk,int mp,int hp,int defence,int grade,int gp,int maxgp)
: base(name,atk ,mp ,hp ,defence ,grade ,gp)
{ this._MaxGp = maxgp; }

///<summary>
/// 攻击方法
///</summary>
public abstract void Attack(Monster mo);
///<summary>
/// 自我介绍
///</summary>
public abstract void Introduce();
}
}

这是Monster类的代码:抽象类,继承自Role类;关键字abstract;抽象的Attack(Player player)和Introduce()方法,返回值为空;

对于抽象Attack(Player player)方法,传入对象Player类实体,本程序是继承Player的Warrior(怪兽攻击人物);

代码如下:

View Code
/*
* 程序员:
* 时间:
* 功能:抽象怪兽类:继承角色类,攻击人物
*/

using System;

namespace DAL
{
///<summary>
/// 怪兽类
///</summary>
public abstract class Monster : Role
{
///<summary>
/// Monster构造函数
///</summary>
///<param name="name">姓名</param>
///<param name="atk">攻击力</param>
///<param name="mp">魔法值</param>
///<param name="hp">血量</param>
///<param name="defence">防御力</param>
///<param name="grade">等级</param>
///<param name="gp">经验值</param>
public Monster(string name,int atk,int mp,int hp,int defence,int grade,int gp)
: base(name,atk ,mp ,hp ,defence ,grade ,gp)
{ }
///<summary>
/// 怪物攻击玩家
///</summary>
///<param name="mo">玩家</param>
public abstract void Attack(Player player);

///<summary>
/// 自我介绍
///</summary>
public abstract void Introduce();
}
}

这是Warrior类的代码:继承Player类;对于构造函数的初值可以在创建对象是设置也行;重写Player类的Attack(Monster mo)和Introduce()方法;

代码如下:

View Code
/*
* 程序员:
* 时间:
* 功能:战士类,继承公共人物类,攻击怪兽
*/
using System;

namespace DAL
{
///<summary>
/// 战士类
///</summary>
public class Warrior : Player
{
///<summary>
/// 构造函数:传入姓名,设定初值
/// base(姓名,攻击力,魔法值,血量,防御力,等级,经验值,最大经验值)
///</summary>
///<param name="name">姓名</param>
public Warrior(string name)
: base(name, 80, 80, 100, 5, 1, 0, 100)
{ }

///<summary>
/// 重写Player类的Attack方法;
/// 攻击方法:传入攻击的对象,怪兽
///</summary>
///<param name="mo">怪兽</param>
public override void Attack(Monster mo)
{
//随机数:(0-10)
Random ran = new Random();
int i = ran.Next(0, 10);
int shanghai = 0;//伤害值
if (i == 8)//i为8时
{
Console.WriteLine("你得到战神的赐福,把{0} 击晕 3 秒", mo.Name);
Console.WriteLine("让我灭掉这眼前的蜥蜴吧,信春哥得永生 !!");
Console.WriteLine("死吧,臭虫!! ");
for (int j = 0; j < 3; j++)
{
Console.WriteLine("{0}秒", j + 1);
Console.WriteLine("你攻击{0} 造成{1}伤害!", mo.Name, this.ATK - mo.Defence + 1);
shanghai += this.ATK - mo.Defence + 1;//伤害值+=战士攻击力-怪兽防御力+1
}
mo.Hp -= shanghai;//怪兽血量=怪兽血量-伤害值
Console.WriteLine("你打掉 {0} {1} HP,还剩下 {2}HP\n ", mo.Name, shanghai, mo.Hp);
}
else
{
if (this.ATK > mo.Defence)
{
Console.WriteLine("你 的一击 惊涛骇浪 攻击{0} 造成{1}伤害", mo.Name, this.ATK - mo.Defence);
shanghai = this.ATK - mo.Defence;
mo.Hp -= shanghai;
Console.WriteLine("你打掉 {0} {1} HP,还剩下 {2}HP\n ", mo.Name, shanghai, mo.Hp);
}
else
{
Console.WriteLine("奶奶的高仿怪");
shanghai = 2;
mo.Hp -= shanghai;
Console.WriteLine("你打掉 {0} {1} HP,还剩下 {2}HP\n ", mo.Name, shanghai, mo.Hp);
}
}
}
///<summary>
/// 重写Player类的Introduce方法;
/// 战士自我介绍方法
///</summary>
public override void Introduce()
{
Console.WriteLine("{0} HP{1} MP{2} 攻击力{3} 防御力{4} ", this.Name, this.Hp, this.Mp, this.ATK, this.Defence);
}
}
}

这是Monster1类的代码:继承自Monster类;对于构造函数的初值可以在创建对象是设置也行;重写Monster类的Attack(Player player)和Introduce()方法;

代码如下:

View Code
/*
* 程序员:
* 时间:
* 功能:怪物1类,攻击人物类
*/

using System;
namespace DAL
{
///<summary>
/// 怪物1:伟大的阿特蒙斯
///</summary>
public class Monster1 : Monster
{
///<summary>
/// 怪物1的构造函数:传入等级,设定初值
/// base(姓名,攻击力,魔法值,血量,防御力,等级,经验值)
///</summary>
///<param name="grade">等级</param>
public Monster1(int grade)
: base("伟大的阿特蒙斯", 5 * grade, 10 * grade, 100 * grade, 2 * grade, grade, 25 * grade)
{

}

#region
///<summary>
/// 叫声方法
/// 怪兽1:伟大的阿特蒙斯的叫声
///</summary>
public void Cry()
{
Console.WriteLine("汪汪~~~~");
}

///<summary>
/// 重写公共怪兽类的攻击方法,传入人物类实体
///</summary>
///<param name="player">人物实体</param>
public override void Attack(Player player)
{
//随机数:(0-100)
System.Random ran = new Random();
int shanghai;//伤害值
int i = ran.Next(0, 100);
if (i == 0)//随机数为1
{
Console.WriteLine("\n 你偷了 伟大的阿特蒙斯 的手纸 他愤怒了 给你了一记 《《恶魔之吻》》 你的hp急速下降 \n");
shanghai = this.ATK - player.Defence;//伤害=怪兽攻击力-人物防御力
player.Hp -= shanghai;//人物血量=人物血量-伤害值
int num = 1;
while (i <= 7)
{
Console.WriteLine("-{0}hp", shanghai / 7 + 1);
num++;
}
Console.WriteLine("你被 伟大的守护者阿特蒙斯 打掉 {0} HP,你还剩下 {1}HP\n ", shanghai, player.Hp);
}
else
{
if (i % 7 == 0)//随机数被7整除的数
{
Console.WriteLine("伟大的守护者阿特蒙斯,请求上天的神圣力量" + "发狂攻击 \n ");
Console.WriteLine("小子你杯具了 !!!\n ");
shanghai = this.ATK * 2 - player.Defence;//攻击力加倍
Console.WriteLine("你被 伟大的守护者阿特蒙斯 愤怒的一击 打掉 {0} HP,你还剩下 {1}HP\n ", shanghai, player.Hp);
player.Hp -= shanghai;
}
else//其他数
if (this.ATK > player.Defence)
{
shanghai = this.ATK - player.Defence;
player.Hp -= shanghai;
Console.WriteLine("你受到 伟大的阿特蒙斯 疯狂的攻击 你减少的 {0}hp ,你还剩下 {1}HP\n", shanghai, player.Hp);
}
else
{
player.Hp -= 2;
Console.WriteLine("奶奶个忒的 防御太高了吧 !!!、\n");
Console.WriteLine("你受到 伟大的阿特蒙斯 的攻击 你减少的 2 hp ,你还剩下 {1}HP\n", player.Hp);
}
}
}

///<summary>
/// 重写Monster的Introduce()方法
/// 怪兽1:伟大的阿特蒙斯自我介绍
///</summary>
public override void Introduce()
{
Console.WriteLine("卑微的爬虫,你们竟敢闯入我 伟大的阿特蒙斯 的厕所偷窥 不可饶恕 你悲哀哎了,\n 不过今天心情好 给你一个选择,可以做我的奴隶," +
"我可一绕你一命,不然你将成为我领地的尘埃\n ");
this.Cry();
}
#endregion
}
}

这是Monster2类的代码:继承自Monster类;对于构造函数的初值可以在创建对象是设置也行;重写Monster类的Attack(Player player)和Introduce()方法;

View Code
/*
* 程序员:
* 时间:
* 功能:怪物2:继承公共怪物类,攻击人物
*/
using System;

namespace DAL
{
///<summary>
/// 怪物2:小泉纯一郎
///</summary>
public class Monster2 : Monster
{
///<summary>
/// 怪物2的构造函数:传入等级,设定初值
/// base(姓名,攻击力,魔法值,血量,防御力,等级,经验值)
///</summary>
///<param name="grade">等级</param>
public Monster2(int grade)
: base("小泉纯一郎 ", 0, 0, 1000 * grade, grade, grade, 1000 * grade)
{

}
///<summary>
/// 重写公共怪兽类的攻击方法,传入人物类实体
///</summary>
///<param name="player"></param>
public override void Attack(Player player)
{
Random ran = new Random();
int i = ran.Next(0, 10);
if (i == 0)
{
Console.WriteLine(" 可怜的小泉强不到手纸,就进行了一次 “剖腹” 抗议");
this.Hp -= 100;//怪物2血量减少100
Console.WriteLine("小泉纯一郎 自残 减少100hp ,现在的HP是 {0}hp \n", this.Hp);
}
else
{
Console.WriteLine(" 小泉纯一郎 哭着喊着给你加了血,还让你扁他!!");
player.Hp += 10;//人物血量增加10
Console.WriteLine("小泉纯一郎 求你 给你增加10hp ,现在的HP是 {0}hp \n", player.Hp);
}
}
///<summary>
/// 重写Monster的Introduce()方法
/// 怪兽2:小泉纯一郎自我介绍
///</summary>
public override void Introduce()
{
Console.WriteLine("我是刚从伟大的阿特蒙斯老大的厕所爬出来,大哥给点手纸吧,你全拿光了,我没有了,我只能用袜子了!@!");
Console.WriteLine("求求你了!!");
}
}
}

这是Program类的代码:有两个枚举类,分别是怪兽的名字和玩家做的选择;在Main中根据选择,创建法师和战士时,都是用Warrior类,没单独写法师类;

一个静态的返回值为Monster类的Create方法,传入等级和怪兽名,实例怪兽将其返回;一个静态的返回值为空的PK方法,传入人物和怪兽实体,进行PK;

代码如下:

View Code
using System;
using DAL;

namespace Pro
{
//(枚举)怪兽
enum Monsters
{
小泉纯一郎, 伟大的阿特蒙斯
}
//(枚举)选项
public enum Select
{
go = 1,
comea,
comeb,
over
}

class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎来到魔兽世界 娱乐搞笑版 !!!\n");

Console.WriteLine("勇士们,进行你们的旅程吧!!!\n");
Console.Write("英雄请告诉我你的名字:");
string name = Console.ReadLine();
Console.WriteLine(@"{0} , 你好。我是精灵助手,你可以选择的角色:
1:战士
  / \
  |.|  
  |.|
  |:|   __
,_|:|_,  / )
  (Oo  / _I_
  +\ \ ||^ ^|
    \ \||_0→
     \ /.:.\-\
     |.:. /-----\
     |___|::oOo::|
     /  |:<_T_>:|
""...."" 我以战神的名义铲除一切怪物,誓死捍卫家园!本名:误事
2:魔法师
请选择你的角色:
", name);

//选择角色
string str = Console.ReadLine();
Console.WriteLine("你的选择:"+str);
Player player;
if (str == "1")
{
player = new Warrior(name);
Console.WriteLine("伟大的 误事 欢迎进入 艾泽拉斯 大陆 \n 开始我们的生涯吧 !!");
}
else
{
//法师和战士共用一个类,如果喜欢可以加自己的一个类,娱乐一下!
player = new Warrior(name);
Console.WriteLine("伟大的 法师 欢迎进入 艾泽拉斯 大陆 \n 开始我们的生涯吧 !!");
}

//开始战斗
while (true)
{
Console.WriteLine(@"艾泽拉斯大陆

1:进入牛棚~(@^_^@)~休息一下
2:进入阿特蒙斯领地
3:虐待小泉
其他:退出

请选择:
");

int at;
int.TryParse(Console.ReadLine(), out at);
Console.WriteLine("你的选择:"+at.ToString());
switch ((Select)at)
{
case Select.go://休息一下
Console.WriteLine(" 进入牛头人的窝棚,美美的睡了一觉");
System.Threading.Thread.Sleep(100);
if (player.Hp < 100)
{
Console.WriteLine("美丽的牛头人萨满看上了你,给你一带药水,你体力回复如初!!");
player.Hp += 100; player.Grade += 1;
}
else
{
player.Hp += 50;
}
//显示当前状态:
Console.WriteLine("{0} 血量 {1} 攻击力 {2} 经验值 {3}/{4} 等级 {5}", player.Name, player.Hp, player.ATK, player.Grade, player.MaxGp, player.Grade);

break;
case Select.comea://进入阿特蒙斯领地
Random ran = new Random();//生成怪物的等级
Console.WriteLine("注意前面有个黑黝黝的大猴子 !!\n ");
PK(player, Create(ran.Next(1, player.Grade + 3), Monsters.伟大的阿特蒙斯)); break;
case Select.comeb://虐待小泉
Random ra = new Random();//生成怪物的等级
Console.WriteLine("前面有一个看似无害的小泉!!\n");
PK(player, Create(ra.Next(1, player.Grade + 3), Monsters.小泉纯一郎));
break;
default: return;

}
}
}

///<summary>
/// 创建怪物
/// 传入等级,怪物
///</summary>
///<param name="lev"></param>
///<param name="m"></param>
///<returns></returns>
public static Monster Create(int level, Monsters moName)
{
Monster monster = null;
switch (moName)
{
case Monsters.小泉纯一郎:
monster = new Monster2(level); break;
case Monsters.伟大的阿特蒙斯:
monster = new Monster1(level); break;
}
//怪物介绍
monster.Introduce();
return monster;
}
///<summary>
/// PK方法:传入人物和怪物实体
///</summary>
///<param name="per"></param>
///<param name="mo"></param>
public static void PK(Player player, Monster monster)
{
Console.WriteLine("你遇到的{0}", monster.Name);
Console.WriteLine("1:扁他\n2:逃跑");
string str = Console.ReadLine();
Console.WriteLine("你的选择:"+str);
if (str == "1")
{
while (true)
{
Console.ReadKey();//暂停
Console.WriteLine("轮到我{0}攻击了{1}寿司吧!!\n ", player.Name, monster.Name);
player.Attack(monster);//人物攻击怪兽
if (monster.Hp <= 0)
{
Console.WriteLine("{0} 见他老妈去了\n ", monster.Name);

player.Gp += monster.Gp;
if (player.Gp >= player.MaxGp)
{
player.Gp = player.Gp - player.MaxGp;
player.Grade += 1;
}
//显示状态
Console.WriteLine("{0} 血量 {1} 攻击力 {2} 经验值 {3}/{4} 等级 {5}", player.Name, player.Hp, player.ATK, player.Grade, player.MaxGp, player.Grade);
break;
}
Console.ReadKey();
Console.WriteLine("轮到我{0}攻击了,小子你死了!!\n ", monster.Name);
monster.Attack(player);//怪兽攻击人物
if (player.Hp <= 0)
{
Console.WriteLine("{0}的霸图生涯在{1}的打击下,失败了 你见到了上帝\n ", player.Name, monster.Name);

break;
}
}
}
else
{
Console.WriteLine("你逃了!\n ");
}
}
}
}

嗯,写完啦!没事的,可以自己调一下,娱乐一下!

没有写法师的类,感兴趣可以自己写一下!也可以将这个程序改成WinForm程序,显示的部分,就把对应的数据显示出来;对于创建对象时的构造函数的参数,

可以通过控件点选,将对应的值赋进去;还可以加一些保存状态的类,下次玩时,不用重头开始!这只是一个小程序做的也很简单,只为娱乐一下!

(怎么感觉像写小学生作文呢?)
(atk:攻击力;mp:魔法;defense:防御;grade:等级;hp:血量;gp 经验;attack:攻击;

  cry叫声;introduce:介绍;role:角色;warrior:战士;Master:法师;monster:怪物)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值