• 努力做一个优秀的programmer [ C# 影院售票系统]


    Cinema.cs类

        [Serializable]
        // 电影院类
        public class Cinema
        {
            public Cinema()
            {
                //二进制
                SoldTickets = new List<Ticket>();
                //时间表
                Schedule = new Schedule();
                //座位
                Seats = new Dictionary<string, Seat>();
            }
    
    
            public Schedule Schedule { get; set; }
    
            public Dictionary<string, Seat> Seats { get; set; }
    
            public List<Ticket> SoldTickets { get; set; }
    
            // 加载放映场次
            public void Load()
            {
                using (FileStream fs = new FileStream("student.dat",FileMode.Open))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    this.SoldTickets = bf.Deserialize(fs) as List<Ticket>;
                }
            }
    
    
            // 保存销售信息
            public void Save()
            {
                using (FileStream fs = new FileStream("student.dat",FileMode.Create))
                {
                    //序例化
                    BinaryFormatter bf = new BinaryFormatter();
                  
                    bf.Serialize(fs, SoldTickets);
                }
    
            }
        }
    }

    Common.cs类

     // 电影类型 枚举
        public enum MovieType
        {   
            //喜剧片
            Comedy,
            //战争片
            War,
            //爱情片
            Romance,
            //动作片
            Action,
            //卡通片
            Cartoon,
            //惊悚片
            Thriller,
            //冒险片
            Adventure
        }
    }

    FreeTicket.cs类

     [Serializable]
    
        // 赠票
        public class FreeTicket:Ticket
        {
            public FreeTicket() { }
            public FreeTicket(string customerName,ScheduleItem scheduleItem,Seat seat):base(scheduleItem,seat)
            {
                this.CustomerName = customerName;
                this.Price = CalcPrice();
            }
    
            //赠票人姓名
            public string CustomerName { get; set; }
    
    
            // 计算赠票票价
            public override double CalcPrice()
            {
                return 0;
            }
    
    
            // 打印赠票
            public override void Print()
            {
                string path = (this.ScheduleItem.Time + " " + this.Seat.SeatNum).Replace(":", "-") + ".txt";
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                    {
                        sw.WriteLine("*******************************");
                        sw.WriteLine("      青鸟影院(赠票)         ");
                        sw.WriteLine("-------------------------------");
                        sw.WriteLine("电影名:" + ScheduleItem.Movie.MovieName);
                        sw.WriteLine("时间:" + this.ScheduleItem.Time);
                        sw.WriteLine("座位号:" + this.Seat.SeatNum);
                        sw.WriteLine("赠送人:"+this.CustomerName);
                        sw.WriteLine("价格:" + this.Price);
                        sw.WriteLine("*******************************");
                    }
                }
            }
        }
    }

    Movie.cs类

        [Serializable]
        // 电影类
        public class Movie
        {
            public Movie() { }
            public Movie(string actor, string director, string movieName, MovieType movieType, string poster, double price)
            {
                this.Actor = actor;
                this.Director = director;
                this.MovieName = movieName;
                this.MovieType = movieType;
                this.Poster = poster;
                this.Price = price;
            }
    
            //导演
            public string Actor { get; set; }
            //演员
            public string Director { get; set; }
            //电影名
            public string MovieName { get; set; }
            //电影类型
            public MovieType MovieType { get; set; }
            //海报路径
            public string Poster { get; set; }
            //电影价格
            public double Price { get; set; }
        }
    }

    Schedule.cs类

    [Serializable]
        //放映计划类
        public class Schedule
        {
            public Schedule() { Items = new Dictionary<string, ScheduleItem>(); }
            public Schedule(Dictionary<string, ScheduleItem> items)
            {
                this.Items = items;
            }
    
            public Dictionary<string, ScheduleItem> Items { get; set; }
    
            //加载XML中的放映场次信息
            public void LoadItems()
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(@"DataShowList.xml");
                    XmlNode root = doc.DocumentElement;
    
                    foreach (XmlNode var in root.ChildNodes)//Movie
                    {
                        Movie movie = new Movie();
                        foreach (XmlNode var2 in var.ChildNodes)//Name
                        {
                            switch (var2.Name)
                            {
                                case "Name":
                                    movie.MovieName = var2.InnerText;
                                    break;
                                case "Poster":
                                    movie.Poster = var2.InnerText;
                                    break;
                                case "Director":
                                    movie.Director = var2.InnerText;
                                    break;
                                case "Actor":
                                    movie.Actor = var2.InnerText;
                                    break;
                                case "Price":
                                    movie.Price = Convert.ToDouble(var2.InnerText);
                                    break;
                                case "Type":
                                    movie.MovieType = (MovieType)Enum.Parse(typeof(MovieType), var2.InnerText);
                                    break;
                                case "Schedule":
                                    foreach (XmlNode var3 in var2.ChildNodes)//Item
                                    {
                                        ScheduleItem item = new ScheduleItem(movie, var3.InnerText);
                                        this.Items.Add(var3.InnerText, item);
                                    }
                                    break;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

    ScheduleItem.cs类

      [Serializable]
    
        // 放映场次
        public class ScheduleItem
        {
            public ScheduleItem() { }
            public ScheduleItem(Movie movie,string time)
            {
                this.Movie = movie;
                this.Time = time;
            }
    
            //电影
            public Movie Movie { get; set; }
            //放映时间
            public string Time { get; set; }
        }
    }

    Seat.cs类

       [Serializable]
    
        // 座位类
        public class Seat
        {
            public Seat() { }
            public Seat(string seatNum,Color color)
            {
                this.SeatNum = seatNum;
                this.Color = color;
            }
    
            //座位号
            public string SeatNum { get; set; }
            //颜色
            public Color Color { get; set; }
        }
    }

    StudentTicket.cs类

        [Serializable]
    
        // 学生票
    
        public class StudentTicket:Ticket
        {
            public StudentTicket() { }
            public StudentTicket(ScheduleItem scheduleItem,Seat seat,double discount):base(scheduleItem,seat)
            {
                this.Discount = discount;
                this.Price = CalcPrice();
            }
    
            //折扣
            public double Discount { get; set; }
    
            // 计算学生票价格
            public override double CalcPrice()
            {
                return this.ScheduleItem.Movie.Price * this.Discount /10;
            }
            // 打印学生票
            public override void Print()
            {
                string path = (this.ScheduleItem.Time + " " + this.Seat.SeatNum).Replace(":", "-") + ".txt";
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                    {
                        sw.WriteLine("*******************************");
                        sw.WriteLine("      青鸟影院(学生票)         ");
                        sw.WriteLine("-------------------------------");
                        sw.WriteLine("电影名:" + ScheduleItem.Movie.MovieName);
                        sw.WriteLine("时间:" + this.ScheduleItem.Time);
                        sw.WriteLine("座位号:" + this.Seat.SeatNum);
                        sw.WriteLine("折扣:"+this.Discount);
                        sw.WriteLine("价格:" + this.Price);
                        sw.WriteLine("*******************************");
                    }
                }
            }
        }
    }

    Ticket.cs类

     [Serializable]
        // 电影票父类
        public class Ticket
        {
            public Ticket() { }
            public Ticket(ScheduleItem scheduleItem,Seat seat)
            {
                this.ScheduleItem = scheduleItem;
                this.Seat = seat;
                this.Price = CalcPrice();
            }
    
            //价格
            public double Price { get; set; }
            //放映场次
            public ScheduleItem ScheduleItem { get; set; }
            //座位
            public Seat Seat { get; set; }
    
            // 计算价格
            public virtual double CalcPrice()
            {
                return this.ScheduleItem.Movie.Price;
            }
    
            // 打印电影票
            public virtual void Print()
            {
                string path = (this.ScheduleItem.Time + " " + this.Seat.SeatNum).Replace(":", "-") + ".txt";
                using (FileStream fs = new FileStream(path,FileMode.Create))
                {
                    using (StreamWriter sw = new StreamWriter(fs,Encoding.Default))
                    {
                        sw.WriteLine("*******************************");
                        sw.WriteLine("          青鸟影院             ");
                        sw.WriteLine("-------------------------------");
                        sw.WriteLine("电影名:"+ScheduleItem.Movie.MovieName);
                        sw.WriteLine("时间:"+this.ScheduleItem.Time);
                        sw.WriteLine("座位号:"+this.Seat.SeatNum);
                        sw.WriteLine("价格:"+this.Price);
                        sw.WriteLine("*******************************");
                    }
                }
            }
        }
    }

    TicketUtil.cs类

     // 创建电影票工具类
        // 使用简单工厂模式创建票
        public class TicketUtil
        {
            public static Ticket CreateTicket(ScheduleItem item,Seat seat,string customerName,double discount,string type)
            {
                Ticket ticket = null;
                switch (type)
                {
                    case "normal":
                        ticket = new Ticket(item, seat);
                        break;
                    case "free":
                        ticket = new FreeTicket(customerName, item, seat);
                        break;
                    case "student":
                        ticket = new StudentTicket(item, seat, discount);
                        break;
                }
                return ticket;
            }
        }
    }

    主窗体代码:

            //实例化影院类(所有存储都是以影院类为基础)
            Cinema cinema = new Cinema();
            //存储lable控件信息
            Label lbl = new Label();
    
            //获取新放映列表
            private void tsmiNew_Click(object sender, EventArgs e)
            {
                BingTreeView();
            }
    
            //选择内容发生改变
            private void tvMovies_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (this.tvMovies.SelectedNode.Level == 1)
                {
                    string time = this.tvMovies.SelectedNode.Text;
                    ScheduleItem item = cinema.Schedule.Items[time];
                    this.lblActor.Text = item.Movie.Actor;
                    this.lblDirector.Text = item.Movie.Director;
                    this.lblMovieName.Text = item.Movie.MovieName;
                    this.lblPrice.Text = item.Movie.Price.ToString();
                    this.lblTime.Text = item.Time;
                    this.lblType.Text = item.Movie.MovieType.ToString();
                    this.picMovie.Image = Image.FromFile(@"Image" + item.Movie.Poster);
                    this.lblCalcPrice.Text = item.Movie.Price.ToString();
    
    
                    //将所有座位设置为黄色
                    foreach (Seat var in cinema.Seats.Values)
                    {
                        var.Color = Color.Yellow;
                    }
    
                    //在已售出的票中循环判断
                    foreach (Ticket ticket in cinema.SoldTickets)
                    {
                        foreach (Seat seat in this.cinema.Seats.Values)
                        {
                            //场次相同且座位号相同
                            if (ticket.ScheduleItem.Time == time && ticket.Seat.SeatNum == seat.SeatNum)
                            {
                                //更新座位颜色
                                seat.Color = Color.Red; 
                            }
                        }
                    }
                    // 将座位颜色更新到Label上显示
                    foreach (Seat seat in cinema.Seats.Values)
                    {
                        foreach (Label lbl in tpCinema.Controls)
                        {
                            // 座位号相同证明是对应Label
                            if (lbl.Text == seat.SeatNum)
                            {
                                lbl.BackColor = seat.Color;
                            }
                        }
                    }
                }
            }
    
            //点击普通票
            private void rdoNormal_CheckedChanged(object sender, EventArgs e)
            {
                this.cmbDisCount.Enabled = false;
                this.txtCustomer.Enabled = false;
                this.lblCalcPrice.Text = lblPrice.Text;
            }
    
            //点击赠票
            private void rdoFree_CheckedChanged(object sender, EventArgs e)
            {
                this.txtCustomer.Enabled = true;
                this.cmbDisCount.Enabled = false;
                this.lblCalcPrice.Text = lblPrice.Text;
            }
    
            //点击学生票
            private void rdoStudent_CheckedChanged(object sender, EventArgs e)
            {
                if (this.lblPrice.Text != "")
                {
                    this.cmbDisCount.Enabled = true;
                    this.txtCustomer.Enabled = false;
                    this.lblCalcPrice.Text = (Convert.ToDouble(this.lblPrice.Text) * Convert.ToDouble(this.cmbDisCount.Text) / 10).ToString();
                }
    
            }
    
            //加载
            private void FrmCinema_Load(object sender, EventArgs e)
            {
                this.rdoNormal.Checked = true;
                this.cmbDisCount.SelectedIndex = 0;
                InitSeats(5, 7);
                skinEngine1.SkinFile = "Wave.ssk"; 
            }
    
            //选择折扣变化:
            private void cmbDisCount_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (this.lblPrice.Text != "")
                {
                    this.lblCalcPrice.Text = (Convert.ToDouble(this.lblPrice.Text) * Convert.ToDouble(this.cmbDisCount.Text) / 10).ToString();
                }
    
            }
    
            // 获取放映列表绑定到TreeView
            private void BingTreeView()
            {
                this.tvMovies.Nodes.Clear();
                //加载XML
                cinema.Schedule.LoadItems();
                //绑定到TreeView
                TreeNode root = null;
                foreach (ScheduleItem var in cinema.Schedule.Items.Values)
                {
                    if (root == null || root.Text != var.Movie.MovieName)
                    {
                        //根节点
                        root = new TreeNode(var.Movie.MovieName);
                        this.tvMovies.Nodes.Add(root);
                    }
                    //子节点
                    root.Nodes.Add(var.Time);
                }
            }
    
            // 初始化座位
            private void InitSeats(int row, int col)
            {
                for (int i = 0; i < row; i++)
                {
                    for (int j = 0; j < col; j++)
                    {
                        Label lb = new Label();
                        lb.BackColor = Color.Yellow;
                        lb.Location = new Point(20 + j * 100, 50 + i * 70);
                        lb.Font = new Font("Courier New", 11);
                        lb.Name = (i + 1) + "-" + (j + 1);
                        lb.Size = new Size(80, 30);
                        lb.TabIndex = 0;
                        lb.Text = (i + 1) + "-" + (j + 1);
                        lb.TextAlign = ContentAlignment.MiddleCenter;
                        lb.Click += lb_Click;
                        tpCinema.Controls.Add(lb);
                        //添加座位对象到CInema的Seats集合中
                        Seat seat = new Seat(lb.Text, Color.Yellow);
                        cinema.Seats.Add(seat.SeatNum, seat);
                    }
                }
            }
    
            private void lb_Click(object sender, EventArgs e)
            {
                if (this.tvMovies.Nodes.Count == 0 || this.tvMovies.SelectedNode.Level ==0)
                {
                    return;
                }
    
                lbl = sender as Label;
                if (lbl.BackColor == Color.Red)
                {
                    MessageBox.Show("已售出");
                }
                else
                {
                    if (DialogResult.OK == MessageBox.Show("是否购买", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question))
                    {
                        //取得放映时间
                        string time = this.tvMovies.SelectedNode.Text;
                        //使用时间作为键找到放映场次对象
                        ScheduleItem item = cinema.Schedule.Items[time];
    
                        string type = string.Empty;
                        type = rdoNormal.Checked ? "normal" : rdoFree.Checked ? "free" : "student";
                        Ticket ticket = TicketUtil.CreateTicket(item, cinema.Seats[lbl.Text], txtCustomer.Text, Convert.ToDouble(cmbDisCount.Text), type);
    
                        //添加到已销售的集合中
                        cinema.SoldTickets.Add(ticket);
                        //出票
                        ticket.Print();
                        //更新颜色
                        lbl.BackColor = Color.Red;
                        cinema.Seats[lbl.Text].Color = Color.Red;
                    }
                }
    
            }
    
            //保存
            private void tsmiSave_Click(object sender, EventArgs e)
            {
                cinema.Save();
                MessageBox.Show("保存成功");
           }
    
            //继续销售
            private void tsmiMovies_Click(object sender, EventArgs e)
            {
                cinema.Load();
                // 将座位颜色更新到Label上显示
                foreach (Seat seat in cinema.Seats.Values)
                {
                    foreach (Label lbl in tpCinema.Controls)
                    {
                        // 座位号相同证明是对应Label
                        if (lbl.Text == seat.SeatNum)
                        {
                            lbl.BackColor = seat.Color;
                        }
                    }
                }
            }
    
            private void tsmiExit_Click(object sender, EventArgs e)
            {
                this.Close();
            }
  • 相关阅读:
    二叉树
    基础1
    tcp/udp
    异步io模块(自定义)
    select+异步
    异步发送请求的几种方式
    多线程,进程实现并发请求
    位解包运算
    从前端程序员的视角看小程序的稳定性保障
    运行node 报错 throw er; // Unhandled 'error' event
  • 原文地址:https://www.cnblogs.com/SFHa/p/8920004.html
Copyright © 2020-2023  润新知