努力做一个优秀的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(@"Data\ShowList.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(); }