传智的光辉岁月-C#基础篇九OOP属性结构枚举

1.设计一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):-----------
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
有一个方法,可以显示这张票的信息.

业务:
不需要设计太多,只需要 提示用户 拥有的票的种类,然后让用户选择,选择后 按照价格打折后 显示给用户
强调:只需要两个类(Ticket 票据类,Saler 售票员类)

Ticket票据类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S01Morning
{
    /// <summary>
    /// 票据类
    /// </summary>
    public class Ticket
    {
        /// <summary>
        /// 票据的编号 种子
        /// </summary>
        public static int idSeed = 1;
        /// <summary>
        /// 票据编号
        /// </summary>
        public int id;

        /// <summary>
        /// 距离
        /// </summary>
        public int distance;

        /// <summary>
        /// 出发地
        /// </summary>
        public string startLocation;

        /// <summary>
        /// 目的地
        /// </summary>
        public string endLocation;

        public Ticket(int dis, string start, string end)
        {
            this.id = idSeed++;
            this.distance = dis;
            this.startLocation = start;
            this.endLocation = end;
        }

        #region 1.0 价格  + int Price()
        /// <summary>
        /// 价格
        /// </summary>
        /// <returns></returns>
        public int Price()
        {
            return distance * 1;
        }
        #endregion

        #region 2.0 显示票据内容 + void Show()
        /// <summary>
        /// 显示票据内容
        /// </summary>
        public void Show()
        {
            Console.WriteLine("编号:{0},出发地:{1} -> 目的地:{2},票价:{3}", this.id, this.startLocation, this.endLocation, this.Price());
        }
        #endregion

        #region 2.1 根据 优惠 输出打折后的价格信息 +void ShowWithDaZhe(float rate)
        /// <summary>
        /// 2.1 根据 优惠 输出打折后的价格信息
        /// </summary>
        /// <param name="rate">折率</param>
        public void ShowWithDaZhe(float rate)
        {
            Console.WriteLine("编号:{0},出发地:{1} -> 目的地:{2},票价:{3}", this.id, this.startLocation, this.endLocation, this.Price() * rate);
        }
        #endregion
    }
}

  Saler售货员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S01Morning
{
    /// <summary>
    /// 售票员
    /// </summary>
    public class Saler
    {
        /// <summary>
        /// 票据数组
        /// </summary>
        Ticket[] list;

        #region 构造函数  初始化票据
        /// <summary>
        /// 构造函数  初始化票据
        /// </summary>
        public Saler()
        {
            list = new Ticket[10];
            list[0] = new Ticket(600, "广州", "长沙");
            list[1] = new Ticket(150, "广州", "深圳");
            list[2] = new Ticket(1900, "广州", "北京");
            list[3] = new Ticket(1000, "广州", "台北");
            list[4] = new Ticket(40, "广州", "东莞");
            list[5] = new Ticket(800, "广州", "丽江");
            list[6] = new Ticket(3000, "广州", "拉萨");
            list[7] = new Ticket(3000, "广州", "东京");
            list[8] = new Ticket(10000, "广州", "巴黎");
            list[9] = new Ticket(7000, "广州", "莫斯科");
        }
        #endregion

        #region 0.0 开始工作 +void StartWork()
        /// <summary>
        /// 0.0 开始工作
        /// </summary>
        public void StartWork()
        {
            do{
                Selling();
                Console.WriteLine("\n是否要继续购买呢?(y/n)");
            }while(Console.ReadLine()=="y");
        }
        #endregion

        #region 1.0 卖票 +void Selling()
        /// <summary>
        /// 1.0 卖票
        /// </summary>
        public void Selling()
        {
            while (true)
            {
                //1.0 显示 当前的票
                ShowTickts();
                Console.WriteLine("您要买去哪的票呢?");
                int tId = int.Parse(Console.ReadLine().Trim());
                //2.0 根据用户选择 票据编号 获取 票据对象
                Ticket t = GetTicketById(tId);
                if (t != null)
                {
                    Console.WriteLine("恭喜您购买成功了如下车票:");
                    if (t.distance > 0 && t.distance <= 100)//0-100公里      票价不打折
                    {
                        t.Show();
                    }
                    else if (t.distance > 100 && t.distance <= 200)//101-200公里    总额打9.5折
                    {
                        t.ShowWithDaZhe(0.95f);
                    }
                    else if (t.distance > 200 && t.distance <= 300)//201-300公里    总额打9折
                    {
                        t.ShowWithDaZhe(0.9f);
                    }
                    else//300公里以上    总额打8折
                    {
                        t.ShowWithDaZhe(0.8f);
                    }
                    break;
                }
                else
                {
                    Console.WriteLine("对不起,您输入的编号有误,请重新输入!");
                }
            }
        }
        #endregion

        #region 1.1 显示票据信息 -void ShowTickts()
        /// <summary>
        /// 1.1 显示票据信息
        /// </summary>
        private void ShowTickts()
        {
            //循环票据数组
            for (int i = 0; i < list.Length; i++)
            {
                Ticket t = list[i];
                t.Show();
            }
        }
        #endregion

        #region 1.2 根据id 查找票据对象 -Ticket GetTicketById(int ticketId)
        /// <summary>
        /// 1.2 根据id 查找票据对象
        /// </summary>
        /// <param name="ticketId">id</param>
        /// <returns>票据对象</returns>
        private Ticket GetTicketById(int ticketId)
        {
            for (int i = 0; i < list.Length; i++)
            {
                Ticket t = list[i];
                if (t.id == ticketId)
                {
                    return t;
                }
            }
            return null;
        }
        #endregion
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S01Morning
{
    class Program
    {
        /// <summary>
        /// 阅读代码:找到 程序的入口!
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //1.0 创建售票员
            Saler s = new Saler();
            //2.0 开始工作
            s.StartWork();

            Console.ReadLine();
        }
    }
}

  

2.猜拳游戏---------------
先接收一个玩家的名字,玩家和机器人猜拳
接收玩家的 输入(1-石头;2-剪刀;3-布)
机器人 随机生成 1-3之间的数值
两个数值 按照规则 进行比较,最终显示输赢!

玩家类(Player)、机器人类(Robot)、裁判类(Judge)

//-----------------------------------------------
1.当 程序员 规定 一组数据(石头、剪刀、布) 用 【数值类型】来标识 的时候,需要严格的【限制】 这组 数值 的【取值范围】!
且 对这组数据 要求 有明确 的 【可读性】!
且 提供 给程序员 明确便捷的 操作语法!不容易写错!
解决方案:
【枚举-Enum】
1.1枚举的定义语法:
public enum FistType
{
/// <summary>
/// 枚举值:石头
/// </summary>
Rock = 1,

/// <summary>
/// 枚举值:剪刀
/// </summary>
Scissors = 2,

/// <summary>
/// 枚举值:布
/// </summary>
Cloth = 3
}

1.2枚举类型 变量 的访问
FistType type = FistType.Rock;
type = FistType.Scissors;

1.3可以直接将 枚举类型 作为 方法的 返回值类型 或者 参数类型

2.在C#中,class后跟的 是类名,但其只是 整个类的名字 的一部分而已!
真正的完整的类名 是 命名空间.类名!如:
namespace A
{
public class DongGuan
{
}
}
类名:DongGuan
类的全名称:A.DongGuan

出拳类型 枚举

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    /// <summary>
    /// 出拳类型 枚举
    ///     枚举的本质 就是 用代码的枚举值 来 替代 对应的 数值!
    /// </summary>
    public enum FistType
    {
        /// <summary>
        /// 枚举值:石头
        /// </summary>
        Rock = 1,

        /// <summary>
        /// 枚举值:剪刀
        /// </summary>
        Scissors = 2,

        /// <summary>
        /// 枚举值:布
        /// </summary>
        Cloth = 3
    }
}

  工具帮助类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    /// <summary>
    /// 工具类
    /// </summary>
    public class Helper
    {
        #region 1.0 获取用户输入的一个 整型数值 +int GetAUserNum()
        /// <summary>
        /// 1.0 获取用户输入的一个 整型数值
        /// </summary>
        /// <returns></returns>
        public static int GetAUserNum(string strMsg)
        {
            int num=-1;
            while (true)
            {
                Console.Write(strMsg);
                string strNum = Console.ReadLine();
                if (int.TryParse(strNum, out num))
                {
                    break;
                }
                else
                {
                    Console.WriteLine("请输入数值!");
                }
            }
            return num;
        }
        #endregion
    }
}

  裁判类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    /// <summary>
    /// 裁判类
    /// </summary>
    public class Judger
    {
        #region 1.0 机器人 判定 两个输入 的输赢 void Judge(int playerNum, int robotNum)
        /// <summary>
        /// 1.0 机器人 判定 两个输入 的输赢
        /// </summary>
        /// <param name="playerFistType">玩家输入</param>
        /// <param name="robotFistType">机器人输入</param>
        public void Judge(FistType playerFistType, FistType robotFistType)
        {
            //1.0 如果相等,则是平局
            if (playerFistType == robotFistType)
            {
                Console.WriteLine("平局~~!");
            }
            else//2.否则,对各种情况进行判断
            {
                // 石头1 吃 剪刀2 吃 布3  吃 石头
                //直接 用 两个 枚举值 进行 相减运算 (实际运算的 是 两个枚举值对应的 数值)
                int num = playerFistType - robotFistType;
                if (num == -1 || num == 2)
                {
                    Console.WriteLine("玩家赢了~~~~");
                }
                else {
                    Console.WriteLine("机器人赢了~~~~");
                }
            }
        }
        #endregion
    }
}

  玩家类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    /// <summary>
    /// 玩家类
    /// </summary>
    public class Player
    {
        public string name;

        public Player(string name)
        {
            this.name = name;
        }

        #region 1.0 玩家进行 猜拳 +int Play()
        /// <summary>
        /// 1.0 玩家进行 猜拳
        /// </summary>
        /// <returns></returns>
        public FistType Play()
        {
            while (true)
            {
                int num = Helper.GetAUserNum("输入值(1-石头;2-剪刀;3-布):");
                if (num >= 1 && num <= 3)
                {
                    //if (num == 1)
                    //    return FistType.Rock;
                    //else if (num == 2)
                    //    return FistType.Scissors;
                    //else
                    //    return FistType.Cloth;

                    return (FistType)num;//直接将 接收到 的 1~3 的一个数值 转成对应的枚举值!
                }
                else
                {
                    Console.WriteLine("数值必须在 1-3之间!");
                }
            }
        }
        #endregion
    }
}

  机器人类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    /// <summary>
    /// 机器人 类
    /// </summary>
    public class Robot
    {
        Random ran = new Random();

        #region 1.0 机器人返回 猜拳编号 +int Play()
        /// <summary>
        /// 1.0 机器人返回 猜拳编号
        /// </summary>
        /// <returns></returns>
        public FistType Play()
        {
             int num = ran.Next(1, 4);// 1 <= x < 4
             FistType type = (FistType)num;//将 数值 转成对应的 枚举值
             switch (type)
             {
                 case FistType.Rock:
                     {
                         Console.WriteLine("机器人出的 是 【石头】!");
                         break;
                     }
                 case FistType.Scissors:
                     {
                         Console.WriteLine("机器人出的 是 【剪刀】!");
                         break;
                     }
                 default:
                     {
                         Console.WriteLine("机器人出的 是 【布】!");
                         break;
                     }
             }
             return type;
        }
        #endregion
    }
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace S02猜拳
{
    class Program
    {
        /*  先接收一个玩家的名字,玩家和机器人猜拳
            接收玩家的 输入(1-石头;2-剪刀;3-布)
            机器人 随机生成 1-3之间的数值
            两个数值 按照规则 进行比较,最终显示输赢!
            玩家类(Player)、机器人类(Robot)、裁判类(Judger)
         */
        static void Main(string[] args)
        {
            //1.创建玩家 (接收玩家名字)
            Console.WriteLine("请输入玩家的名字:");
            string strName = Console.ReadLine().Trim();
            Player player = new Player(strName);
            //2.创建机器人
            Robot robot = new Robot();
            //3.创建 裁判
            Judger judger = new Judger();
            do
            {
                //1.接收玩家的输入
                FistType typeA = player.Play();
                //2.接收机器人的输入
                FistType typeB = robot.Play();
                //3.将两个输入 传给 裁判,判断并显示结果
                judger.Judge(typeA, typeB);
                //4.是否继续
                Console.WriteLine("是否继续?(y/n)");
            } while (Console.ReadLine() == "y");
        }
    }
}

  

时间: 2024-12-29 02:27:00

传智的光辉岁月-C#基础篇九OOP属性结构枚举的相关文章

传智的光辉岁月-C#基础篇一编译原理

时间过的真快,不知不觉已经从传智出来,工作一个月了啊,想想当初自己的所有努力和付出都是值得的,当初来传智可以说是走头无路,唯有努力的向前冲,在这里满满的正能量,激烈着我一直努力,胜利就在前面,只要你能坚持坚持~~~对于我这样的一个新手而言,现在最重要的就是技术积累,一入IT深似海,我要学的东西还真的很多很多... 以前一直没时间,现在在工作之余,想把自己以前学的东西整理一套笔记,供.NET爱好者,和自己以后翻阅参考.... 好了直接上代码... using System; namespace H

传智的光辉岁月-C#基础篇七类和静态成员

1.new关键字做的4个事情 1.1 开辟堆空间 a.开辟多大的空间呢? 当前类 所有的 成员变量类型所占空间的总和 + 类型指针(方法表的地址) b.开辟了空间干什么用呢? 存放 成员变量 1.2 创建对象 a.将对应类型 中的 实例成员模板区 里的 实例变量 复制到 堆空间空间中: b.将 对应类型 的 方法表地址 设置 对象! 1.3 调用构造函数 a.将 前面创建 的对象 的堆地址,先传给 构造函数里的 this! b.再 执行 构造函数里的代码! 1.4 返回堆地址 2.静态成员 和

传智的光辉岁月-C#基础篇八构造函数和面向对象思想

3.关于 对象创建的几个关键词 Dog d1 = new Dog(); Dog d1 叫做 声明变量 new Dog() 叫做 实例化(创建)对象 4.关于对象.方法和 this 的关系 Dog d1 = new Dog();//在new关键字 开辟堆空间,创建完对象,开始调用构造函数的时候,会把对象的地址 传给 构造函数里的 this d1.ShowLove();//在调用方法时,会先将 d1里保存的 对象地址 传给 方法里的 this,然后再执行方法体: 5.静态方法 只能 访问 静态成员,

传智的光辉岁月-C#基础篇五值类型和引用类型

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01Method { class Program { static void Main(string[] args) { //int a1 = 11; //int b2 = 22; //Add2Num(a1, b2);//在调用方法时,为 方法括号中 传递的 值 就叫做 实参(实际参数) //Add2Nu

传智的光辉岁月-C#基础篇十小练习

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P03练习 { class Program { static void Main(string[] args) { Test05(); } public static void Test01() { /*请编写1个方法,求一列数的规则如下: 1.1.2.3.5.8.13.21.34.55...... 求指定

传智的光辉岁月-C#基础篇六飞行棋

飞行棋业务:我们要能够让2个玩家 在地图上 按照游戏规则 进行游戏 玩家类 变量:玩家位置,玩家名称,玩家标识,玩家是否在陷阱中 方法:投骰子,移动 地图类 变量:地图数据数组 方法:初始化地图数据,绘制地图,显示Logo 游戏规则类 变量: 方法:第一次游戏说明,判断玩家位置是否有障碍物,根据不同障碍物执行不同操作,判断游戏是否结束 using System; using System.Collections.Generic; using System.Linq; using System.T

传智的光辉岁月-C#基础篇三流程控制1

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01Review { class Program { //全局变量如果没有初始化也没有复制,那么编译器会给它默认值: // 数值类型默认值:0 // bool 默认值:false // string 默认值:null //1.2全局变量(类的成员变量) static int count; static v

传智的光辉岁月-C#基础篇三流程控制2

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01ReviewAndWhile { class Program { static void Main(string[] args) { //Reg(); MulLoop(); Console.ReadLine(); } #region 9.2 多重循环练习:注册 void Reg() //9.2 多重循

传智的光辉岁月-C#基础篇四数组

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01Array { class Program { static void Main(string[] args) { int[] arr = new int[2] { 22, 33 }; double dd = arr[0]; ArrTurnBig(); Console.ReadLine(); } #r