博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
影院售票系统
阅读量:4552 次
发布时间:2019-06-08

本文共 16624 字,大约阅读时间需要 55 分钟。

大致思路

本项目共有十个类:

---------------
看电影类(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
(); list = new List
(); Schedule = new Schedule(); } #endregion #region 保存信息 //放映计划(释放以保存的放映计划) public Schedule Schedule { get; set; } //座位 座位集合属性(把20个座位的颜色和文本那拿到放到到集合中将来要做对比) public Dictionary
Seats { get; set; } //以出售电影飘得集合(把用户每点一次的购买结果保存到票的集合中将来要反序列化出来) public List
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
Item { get; set; } #endregion #region 初始化放映计划 public Schedule() { // 放映计划中的放映列表 Item = new Dictionary
(); } #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
labs = new Dictionary
(); 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
();) 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(); } }}

 

转载于:https://www.cnblogs.com/lcycn/p/7113630.html

你可能感兴趣的文章
Solr4.7从文件创建索引
查看>>
6.9-LV/XML机器人数据存储
查看>>
Django ajax 发送post请求 前端报错解决
查看>>
About Me
查看>>
Android视频处理 --处理视频第一帧缩略图
查看>>
IOS中如何判断APP是否安装后首次运行或升级后首次运行
查看>>
关于反射
查看>>
全面解析构建私有云的两大核心架构组件
查看>>
在phpWeChat中如何定义一个授权登录(获取昵称)的链接
查看>>
python 符合条件跳过下一次循环
查看>>
mysql提示Column count doesn't match value count at row 1错误
查看>>
笑话,难道懂礼貌就必须说谎吗
查看>>
MySQL(二)
查看>>
第四章 –– 多态的概念
查看>>
C#中this的 四种 用法
查看>>
探究Windows RT的系统内存占用
查看>>
查域名对应的ip的命令:Nslookup
查看>>
JS offsetparent 问题
查看>>
ccpc 2016 省赛
查看>>
『Python基础-8』列表
查看>>