努力做一个优秀的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();
        }
原文地址:https://www.cnblogs.com/SFHa/p/8920004.html