首页 > 代码库 > 影院售票系统
影院售票系统
大致思路
本项目共有十个类:
---------------
看电影类(Cimema)-->电影类(Movie)--->枚举lei(MovieType)
放映计划类(Schedule)-->放映场次(ScheduleItem)
座位类(Seat)
电影票(Ticket)-->免费票(FreeTicket)-->学生票(StudentTicket)-->工厂类(TicketFactor
类图框架
类中的关系上面有说到
开始码代码
先上十大类
1.Cimema看电影类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_017{ //看电影 保存 放映计划(Schedule)和座位类(Seat)(顶级类) //放映计划类里面有放映场次累 [Serializable] public class Cimema { #region 初始化数据 //无参构造(当任何时候调用Cimema时都把 座位集合 票集合 放映计划初始化) public Cimema() { Seats = new Dictionary<string, Seat>(); list = new List<Ticket>(); Schedule = new Schedule(); } #endregion #region 保存信息 //放映计划(释放以保存的放映计划) public Schedule Schedule { get; set; } //座位 座位集合属性(把20个座位的颜色和文本那拿到放到到集合中将来要做对比) public Dictionary<string, Seat> Seats { get; set; } //以出售电影飘得集合(把用户每点一次的购买结果保存到票的集合中将来要反序列化出来) public List<Ticket> list { get; set; } #endregion #region 持久化到硬盘 //保存票的情况(会调用list中的值形成IO文本) public void Save() { } //读取售票情况(会把IO/序列中的值反馈到票的集合中读取) public void Load() { } #endregion }}
2.Movie电影类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_017{ //电影类用来存放电影的属性 ,标上可被序列化的期望 [Serializable] public class Movie { #region 单机数状节点时在详情里面初始化 //电影名字 public string MovieName { get; set; } //电影海报的名字 public string Postor { get; set; } //导演 public string Director { get; set; } //主演 public string Actor { get; set; } //电影类型(枚举)将来要涉及到给枚举赋值的方法 public MovieType MovieType { get; set; } //定价 public int Price { get; set; } #endregion #region 两个初始化构造 public Movie() { } public Movie(string movieName, string poster, string director, string actor, MovieType movieType, int price) { this.MovieName = movieName; this.Postor = poster; this.Director = director; this.Actor = actor; this.MovieType = movieType; this.Price = price; } #endregion }}
3.Schedule放映计划
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;namespace D_017{ //放映 计划,保存影院当天的放映计划 [Serializable] public class Schedule { #region 描述放映计划 //放映场次(时间 和 放映场次-->电影(Movie)) public Dictionary<string, ScheduleItem> Item { get; set; } #endregion #region 初始化放映计划 public Schedule() { // 放映计划中的放映列表 Item = new Dictionary<string, ScheduleItem>(); } #endregion #region 解析放映计划(每一个时间段对应一个放映计划) //读取xml的方法 public void LoadItems() { //开始手打 XmlDocument doc = new XmlDocument(); doc.Load("ShowList.xml"); XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { //一个item就是一个放映计划和放映计划的名字 Movie movie = new Movie();//xml中转站到详细Movie类里面的属性 movie.MovieName = item["Name"].InnerText; movie.Postor = item["Poster"].InnerText; movie.Director = item["Director"].InnerText; movie.Actor = item["Actor"].InnerText; //前面解释道要给枚举赋值的方法手打一遍 movie.MovieType = (MovieType)Enum.Parse(typeof(MovieType), item["Type"].InnerText); movie.Price = Convert.ToInt32(item["Price"].InnerText); //如果你仔细看xml文件会发现 有两个节点的名字相同 //Analysis:用三个foreach循环遍历出来 //Analysis:下面这种方法 foreach (XmlNode it in item["Schedule"].ChildNodes) { //一个it就是一个放映场次 new ScheduleItem(); ScheduleItem sh=new ScheduleItem(); sh.Time=it.InnerText; sh.Movie=movie; Item.Add(sh.Time,sh);//放映计划集合 } } } #endregion }}
4.ScheduleItem放映场次
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace D_017{ //影院每天放映计划的场次 ,保存每场电影的信息(时间 和 电影--->属性) [Serializable] public class ScheduleItem { #region 属性 //放映时间 public string Time { get; set; } //本场所放映的电影 public Movie Movie { get; set; } #endregion #region 两个构造 public ScheduleItem() { } public ScheduleItem(string time, Movie movie) { this.Time = time; this.Movie = movie; } #endregion }}
5.Seat座位
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace D_017{ //保存影院的座位信息 [Serializable] public class Seat { #region 单个座位信息 //座位卖出的状态颜色 public System.Drawing.Color Color { get; set; } //座位号 public string SeatNum { get; set; } #endregion #region 两个构造 public Seat() { } public Seat(string seatnum, System.Drawing.Color color) { this.SeatNum = seatnum; this.Color = color; } #endregion }}
6.MovieType枚举
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace D_017{ //枚举类 电影类型 英文的 [Serializable] public enum MovieType { Comedy,//喜剧片 War,//战争片 Romance,//浪漫篇 Action,//动作片 Cartoon,//卡通片 Thriller,//惊悚片 Adventure //冒险片 }}
7.Ticket电影票父类
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace D_017{ //电影票父类。保存电影票信息 [Serializable] public class Ticket { #region 售出票的属性(工厂调用) //放映场次 public ScheduleItem ScheduleItem { get; set; } //座位对象 public Seat Seat { get; set; } //优惠价 public int Price { get; set; } #endregion #region 父类玩票的方法 //计算票价的方法 public virtual void CalcPrice() { this.Price = ScheduleItem.Movie.Price; } //打印售票信息的虚方法 public virtual void Print() { } //显示当前售出票的虚方法 public virtual void Show() { } #endregion #region 两个构造 public Ticket() { } public Ticket(ScheduleItem scheduleItem, Seat seat, int price) { this.ScheduleItem = scheduleItem; this.Seat = seat; this.Price = price; } #endregion }}
8.FreeTicket赠票:Ticket
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_017{ //免费票子类.继承父类Ticket,保存特殊的增票信息 [Serializable] public class FreeTicket:Ticket { #region 子类特有的名字属性(工厂调用) //获得赠票者的名字属性 public string CustomerName { get; set; } #endregion #region 重写 //重写父类计算票价的方法 public override void CalcPrice() { this.Price = ScheduleItem.Movie.Price; } //重写父类打印售票信息的方法 public override void Print() { base.Print(); } //重写父类显示当前售出票的信息 public override void Show() { base.Show(); } #endregion #region 两个构造 public FreeTicket() { } public FreeTicket(ScheduleItem scheduleItem,Seat seat,string customername) { this.ScheduleItem = scheduleItem; this.Seat = seat; this.CustomerName = customername; } #endregion }}
9.StudentTicket学生票:Ticket
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_017{ //学生票子类,继承父类 Ticket 保存特殊的学生票信息 [Serializable] public class StudentTicket:Ticket { #region 子类特有的属性折扣(工厂调用) //学生票的折扣 public int Discount { get; set; } #endregion #region 重写 //重写父类计算票价的方法 public override void CalcPrice() { this.Price = ScheduleItem.Movie.Price; } //重写父类打印售票信息的方法 public override void Print() { base.Print(); } //重写父类显示当前售出票的信息 public override void Show() { base.Show(); } #endregion #region 两个构造 public StudentTicket() { } public StudentTicket(ScheduleItem scheduleItem, Seat seat, int discount) { this.ScheduleItem = scheduleItem; this.Seat = seat; this.Discount = discount; } #endregion }}
10.TicketFactory工厂类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace D_017{ //工厂类 [Serializable] public class TicketFactory { //创建电影票 public static Ticket CreateTicket(ScheduleItem scheduitem, Seat seat, int discount, string CustomeName, string type) { Ticket tick = null; switch (type) { case "student": tick = new StudentTicket(scheduitem, seat, discount); break; case "free": tick = new FreeTicket(scheduitem, seat, CustomeName); break; case "": tick = new Ticket(scheduitem, seat, discount); break; } return tick; } }
代码有些还没有完成不过最难的部分已经概括了(有注释)
主窗体中的代码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace D_017{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } //用来存放lab的集合左边是座位号,右边是lab(用来刷新) Dictionary<string, Label> labs = new Dictionary<string, Label>(); Cimema cimema = new Cimema(); private void Form1_Load(object sender, EventArgs e) { comboBox1.Enabled = false; textBox1.Enabled = false; InitSeats(); } //动态加载lab控件 private void InitSeats() { //逻辑循环创建Lable for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 4; j++) { Label lab = new Label(); lab.Text = j + "-" + i; lab.BackColor = Color.Yellow; lab.Width = 60; lab.Font = new Font("楷体", 14); lab.TextAlign = ContentAlignment.MiddleCenter; //以上的用来设置字体 //这个Location需要想一会 lab.Location = new Point(20 + (i - 1) * 90, 20 + (j - 1) * 55); //+=注册事件 -=注销事件 lab.Click += lab_Click; //把每一个Seat中的 座位号 和 颜色 赋值 Seat seat = new Seat(lab.Text, BackColor); //把20个lable 不同的座位和颜色 保存到 Cimema 中的Seat集合中 //现在的集合中的 颜色都一样 cimema.Seats.Add(lab.Text, seat); //保存用户单机改变颜色的lable //又把20个lable存到了labs集合当中 颜色也都是一样的 存了两便 labs.Add(lab.Text, lab); //绑定到tabPage2控件上 tabPage2.Controls.Add(lab); } } } //四大模块里面最难的一块(每选中一个lable就把当前的售票信息添加到Cimame 中的list单列集合中 list = new List<Ticket>();) string type = ""; void lab_Click(object sender, EventArgs e) { //判断是那种票 if (radioButton2.Checked) { type = "free"; } else if (radioButton3.Checked) { type = "student"; } //首先获取当前lable的文本值 Label l = (Label)sender; //调用工厂函数 根据时间 座位号 价格 折扣 类型 拿到对应的场次 票 Ticket tick = TicketFactory.CreateTicket(cimema.Schedule.Item[label14.Text], cimema.Seats[l.Text], int.Parse(label16.Text), textBox1.Text, type); //消息框 DialogResult result = MessageBox.Show("是否购买?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information); //如果选择了是 if (result == DialogResult.Yes) { //持久化到硬盘中改变用户选中lable的颜色 cimema.Seats[l.Text].Color = Color.Red; //更新座位 foreach (string item in cimema.Seats.Keys) { labs[item].BackColor = cimema.Seats[item].Color; } //计算价格 tick.CalcPrice(); cimema.list.Add(tick);//把卖出的加到集合中 label16.Text = tick.Price.ToString();//把价格加上去 tick.Print();//打印售票的方法 } } //获取放映场次 private void 获取ToolStripMenuItem_Click(object sender, EventArgs e) { //每次调用都清除一遍 treeView1.Nodes.Clear(); //调用以初始化好放映列表 cimema.Schedule.LoadItems(); //给treeview添加子节点的声明 xxx.Nodes.Add(); TreeNode tr=null; //制空一个字符串 string name=""; //遍历看电影(Cimema)中的放映场次(看我里面有初始化吧(相当于调用了SchedulItem)中的集合..Item(以付值)) foreach (ScheduleItem item in cimema.Schedule.Item.Values) { //如果Movie中的电影名字不是空的(不相等) //如果名字不相等只绑定名字 if (item.Movie.MovieName != name) { //把item.MovieName添加到TreeNode中 tr = new TreeNode(item.Movie.MovieName); //绑定到treeView1 treeView1.Nodes.Add(tr); } //如果名字相等就绑定时间 TreeNode tree = new TreeNode(item.Time); //偷偷的把放映场次绑定到Tag中 tree.Tag = item; tr.Nodes.Add(tree); name = item.Movie.MovieName; } } //treeView选中事件改变详细框里面的值 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { //获取treeNode选中的Tag偷偷隐藏得值 TreeNode node = treeView1.SelectedNode; //强转成ScheduleItem类型 不要转成Movie 要不然时间不好拿到 ScheduleItem sh = (ScheduleItem)node.Tag; //一次给详细信息里面的控件赋值 label2.Text = sh.Movie.MovieName; pictureBox1.Image = Image.FromFile(sh.Movie.Postor); label11.Text = sh.Movie.Director; label12.Text = sh.Movie.Actor; label13.Text = sh.Movie.MovieType.ToString(); label14.Text = Convert.ToString(sh.Time); label15.Text = sh.Movie.Price.ToString(); //清空座位 foreach (Seat item in cimema.Seats.Values) { item.Color = Color.Yellow; } foreach (Ticket it in cimema.list) { foreach (Seat seat in cimema.Seats.Values) { if (it.ScheduleItem.Time == label14.Text && it.Seat.SeatNum == seat.SeatNum) { seat.Color = Color.Red; } } } //更新座位 foreach (string item in cimema.Seats.Keys) { labs[item].BackColor = cimema.Seats[item].Color; } } //RadioButton1选中事件改变特殊票框的值 private void radioButton1_CheckedChanged(object sender, EventArgs e) { comboBox1.Text = "0"; textBox1.Text = "0"; comboBox1.Enabled = false; textBox1.Enabled = false; label16.Text = "0"; } //RadioButton2选中事件改变特殊票框的值 private void radioButton2_CheckedChanged(object sender, EventArgs e) { comboBox1.Enabled = false; comboBox1.Text = "0"; textBox1.Enabled = true; textBox1.Text = "0"; label16.Text = "0"; } //RadioButton3选中事件改变特殊票框的值 private void radioButton3_CheckedChanged(object sender, EventArgs e) { comboBox1.Enabled = true; comboBox1.Text = "7"; textBox1.Enabled = false; textBox1.Text = ""; int _1 = int.Parse(comboBox1.Text); int _2 = int.Parse(label15.Text); label16.Text = (_1 * _2 / 10).ToString(); } }}
影院售票系统
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。