前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

作者头像
房上的猫
发布2018-03-14 12:34:26
1.4K0
发布2018-03-14 12:34:26
举报
文章被收录于专栏:个人随笔个人随笔

此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html

项目类图:

影院类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 影院类
    /// 保存放映计划和座位类
    /// </summary>
    [Serializable]
    public class Cinema
    {
        //座位集合
        private Dictionary<string, Seat> seats;

        //放映计划
        private Schedule schedule;

        //已售出电影票的集合
        private List<Ticket> soldTickets;

        public Cinema()
        {
            Schedule = new Schedule();
            Schedule.LoadItems();
            Seats = new Dictionary<string, Seat>();
            SoldTickets = new List<Ticket>();
        }

        public Cinema(Dictionary<string, Seat> seats, Schedule schedule, List<Ticket> soldTickets)
        {
            Seats = seats;
            Schedule = schedule;
            SoldTickets = soldTickets;
        }

        public Dictionary<string, Seat> Seats { get => seats; set => seats = value; }
        public Schedule Schedule { get => schedule; set => schedule = value; }
        public List<Ticket> SoldTickets { get => soldTickets; set => soldTickets = value; }


        //保存售票情况
        public void Save(Dictionary<string, Cinema> dictionary)
        {
            //创建文件流派
            Stream stream = new FileStream("save.bin", FileMode.Create);
            //二进制序列化
            BinaryFormatter bf = new BinaryFormatter();
            //将对象或具有指定顶级 (根)、 对象图序列化到给定的流
            bf.Serialize(stream, dictionary);
            //关闭流
            stream.Close();
        }

        //读取售票情况
        public Dictionary<string, Cinema> Load(Dictionary<string, Cinema> dictionary)
        {
            //创建文件流派
            Stream stream = new FileStream("save.bin", FileMode.Open);
            //二进制序列化
            BinaryFormatter bf = new BinaryFormatter();
            //指定的流反序列化对象图
            dictionary = (Dictionary<string, Cinema>)bf.Deserialize(stream);
            //关闭流
            stream.Close();
            return dictionary;
        }
    }
}

电影票类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 电影票(父类)
    /// 保存电影信息
    /// </summary>
    [Serializable]
    public class Ticket
    {
        //放映场次
        private ScheduleItem scheduleItem;

        //所属座位对象
        private Seat seat;

        //票价
        private int price;

        public Ticket()
        {
            
        }

        public Ticket(ScheduleItem scheduleItem, Seat seat, int price)
        {
            ScheduleItem = scheduleItem;
            Seat = seat;
            Price = price;
        }

        public ScheduleItem ScheduleItem { get => scheduleItem; set => scheduleItem = value; }
        public Seat Seat { get => seat; set => seat = value; }
        public int Price { get => price; set => price = value; }

        //计算票价
        public virtual double CalcPrice()
        {
            return Price;
        }

        //打印售票
        public virtual void Print()
        {

        }

        //显示当前出票信息
        public virtual string Show()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "青鸟影院(普通票)");
            sb.AppendLine("-----------------------------------------");
            sb.AppendLine("电影名:" + ScheduleItem.Movie.MovieName);
            sb.AppendLine("时间:" + ScheduleItem.Time);
            string text = Seat.SeatNum.Remove(0, Seat.SeatNum.Length - 3);
            sb.AppendLine("座位号:" + text);
            sb.AppendLine("价格:" + Price);
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "(a)普通票");
            return sb.ToString();

        }
    }
}

赠票类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 赠票(子类)
    /// 保存特殊的增票信息
    /// </summary>
    public class FreeTicket:Ticket
    {
        //赠票者名字
        private string customerName;

        public FreeTicket()
        {
        }

        public FreeTicket(ScheduleItem scheduleItem, Seat seat, int price, string customerName) : base(scheduleItem, seat, price)
        {
            this.CustomerName = customerName;
        }

        public string CustomerName { get => customerName; set => customerName = value; }


        //计算票价
        public override double CalcPrice()
        {
            return 0;
        }

        //打印售票信息
        public override void Print()
        {
            base.Print();
        }

        //显示当前出票信息
        public override string Show()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "青鸟影院(赠票)");
            sb.AppendLine("-----------------------------------------");
            sb.AppendLine("电影名:" + ScheduleItem.Movie.MovieName);
            sb.AppendLine("时间:" + ScheduleItem.Time);
            string text = Seat.SeatNum.Remove(0, Seat.SeatNum.Length - 3);
            sb.AppendLine("座位号:" + text);
            sb.AppendLine("价格:" + CalcPrice());
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "(a)赠票");
            return sb.ToString();
        }

    }
}

学生票类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 学生票(子类)
    /// 保存特殊的学生票信息
    /// </summary>
    public class StudentTicket : Ticket
    {
        //学生折扣
        private int discount;

        public StudentTicket()
        {
        }

        public StudentTicket(ScheduleItem scheduleItem, Seat seat, int price, int discount) : base(scheduleItem, seat, price)
        {
            this.Discount = discount;
        }

        public int Discount { get => discount; set => discount = value; }

        //计算票价
        public override double CalcPrice()
        {
            return Price * Discount/10;
        }

        //打印售票信息
        public override void Print()
        {
            base.Print();
        }

        //显示当前出票信息
        public override string Show()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "青鸟影院(学生票)");
            sb.AppendLine("-----------------------------------------");
            sb.AppendLine("电影名:" + ScheduleItem.Movie.MovieName);
            sb.AppendLine("时间:" + ScheduleItem.Time);
            string text = Seat.SeatNum.Remove(0, Seat.SeatNum.Length - 3);
            sb.AppendLine("座位号:" + text);
            sb.AppendLine("价格:" + CalcPrice());
            sb.AppendLine("*****************************************");
            sb.AppendLine("\t  " + "(a)学生票");
            return sb.ToString();
        }
    }
}

电影类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 电影类
    /// </summary>
    [Serializable]
    public class Movie
    {
        //电影名
        private string movieName;

        //海报图片名
        private string poster;

        //导演名
        private string director;

        //主演
        private string actor;

        //电影类型
        private MovieType movieType;

        //定价
        private int price;

        public Movie()
        {
        }

        public Movie(string movieName, string poster, string director, string actor, MovieType movieType, int price)
        {
            MovieName = movieName;
            Poster = poster;
            Director = director;
            Actor = actor;
            MovieType = movieType;
            Price = price;
        }

        public string MovieName { get => movieName; set => movieName = value; }
        public string Poster { get => poster; set => poster = value; }
        public string Director { get => director; set => director = value; }
        public string Actor { get => actor; set => actor = value; }
        public MovieType MovieType { get => movieType; set => movieType = value; }
        public int Price { get => price; set => price = value; }
    }
}

电影类型类(枚举):

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 电影类型
    /// </summary>
    public enum MovieType
    {
        //喜剧片
        Comedy,
        //战争片
        War,
        //浪漫片
        Romance,
        //动作片
        Action,
        //卡通片
        Cartoon,
        //惊悚片
        Thriller,
        //冒险
        Adventure
    }
}

放映计划类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 放映计划
    /// 保存影院当天的放映计划集合
    /// </summary>
    [Serializable]

    public class Schedule
    {
        //放映场次
        private Dictionary<string, ScheduleItem> item;

        public Dictionary<string, ScheduleItem> Item { get => item; set => item = value; }

        public Schedule()
        {
            Item = new Dictionary<string, ScheduleItem>();
        }

        public Schedule(Dictionary<string, ScheduleItem> item)
        {
            Item = item;
        }

        //读取XML文件
        public void LoadItems()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("ShowList.xml");
            XmlNode xml = doc.DocumentElement;
            ScheduleItem scheduleItem = null;
            foreach (XmlNode item in xml.ChildNodes)
            {
                Movie movie = new Movie();
                movie.MovieName = item["Name"].InnerText;
                movie.Poster = 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);
                foreach (XmlNode items in item["Schedule"].ChildNodes)
                {
                    scheduleItem = new ScheduleItem();
                    scheduleItem.Movie = movie;
                    scheduleItem.Time = items.InnerText;
                    Item.Add(scheduleItem.Time, scheduleItem);
                }
            }
        }
    }
}

座位类:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 保存影院座位信息
    /// </summary>
    [Serializable]
    public class Seat
    {
        //座位号
        private string seatNum;

        //座位卖出状态颜色
        private Color color;

        public Seat()
        {
        }

        public Seat(string seatNum, Color color)
        {
            SeatNum = seatNum;
            Color = color;
        }

        public string SeatNum { get => seatNum; set => seatNum = value; }
        public Color Color { get => color; set => color = value; }
    }
}

工具类(设计模式:简单工厂):

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 工具类
    /// 根据输入的值,判断创建不同的电影票对象
    /// </summary>
    public class TicketTtil
    {
        public static Ticket CreateTicket(string type)
        {
            Ticket ticket = null;
            switch (type)
            {
                case "赠票":
                    ticket = new FreeTicket();
                    break;
                case "学生票":
                    ticket = new StudentTicket();
                    break;
                default:
                    ticket = new Ticket();
                    break;
            }
            return ticket;
        }
    }
}

主窗体类:

代码语言:javascript
复制
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;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Theater_Ticket_Selling_System
{
    /// <summary>
    /// 影院售票系统
    /// </summary>
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }
        //实例化影院类(所有存储都是以影院类为基础)
        Cinema cinema = new Cinema();
        //保存已售座位
        Dictionary<string, Cinema> dictionary = new Dictionary<string, Cinema>();
        //存储所有lable控件信息(方便改变控件状态)
        Dictionary<string, Label> labels = new Dictionary<string, Label>();


        //清空所有控件
        public void Information_Emptying()
        {
            lblName.Text = null;
            lblDirector.Text = null;
            lblActor.Text = null;
            lblType.Text = null;
            lblTime.Text = null;
            lblPrice.Text = null;
            lblCalcPrice.Text = null;
            picMovie.Image = null;
        }

        //选中影片场次时,对所有控件赋相应的值,显示影片信息
        public void Information_Filling()
        {
            ScheduleItem schedule = (ScheduleItem)tvMovies.SelectedNode.Tag;
            lblName.Text = schedule.Movie.MovieName;
            lblDirector.Text = schedule.Movie.Director;
            lblActor.Text = schedule.Movie.Actor;
            lblType.Text = schedule.Movie.MovieType.ToString();
            lblTime.Text = tvMovies.SelectedNode.Text;
            lblPrice.Text = schedule.Movie.Price.ToString();
            lblCalcPrice.Text = schedule.Movie.Price.ToString();
            picMovie.Image = Image.FromFile(schedule.Movie.Poster);
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            Information_Emptying();
            Butten();
        }
        
        //为TreeView控件动态赋值
        public void AddTree()
        {
            tvMovies.BeginUpdate();
            tvMovies.Nodes.Clear();
            TreeNode treeNode = null;
            string movieName = null;
            foreach (KeyValuePair<string, ScheduleItem> item in cinema.Schedule.Item)
            {
                if (movieName != item.Value.Movie.MovieName)
                {
                    treeNode = new TreeNode();
                    treeNode.Text = item.Value.Movie.MovieName;
                    treeNode.Tag = null;
                    tvMovies.Nodes.Add(treeNode);
                }
                TreeNode tree = new TreeNode();
                tree.Text = item.Key;
                tree.Tag = item.Value;
                treeNode.Nodes.Add(tree);
                movieName = item.Value.Movie.MovieName;
            }
            tvMovies.EndUpdate();
        }

        //动态绑定所有lable控件
        public void Butten()
        {
            cinema.Seats.Clear();
            labels.Clear();
            tpCinema.Controls.Clear();
            Seat seat = null;
            Label label = null;
            int seatRow = 7;
            int seatLine = 5;
            for (int i = 0; i < seatRow; i++)
            {
                for (int j = 0; j < seatLine; j++)
                {
                    label = new Label();
                    label.BackColor = Color.Yellow;
                    label.Font = new Font("宋体", 14.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)134));
                    label.AutoSize = false;
                    label.Size = new Size(50, 25);
                    label.Text = (j + 1).ToString() + "-" + (i + 1).ToString();
                    label.TextAlign = ContentAlignment.MiddleCenter;
                    label.Location = new Point(60 + (i * 90), 60 + (j * 60));
                    label.Click += new EventHandler(lblSeat_Click);
                    labels.Add(label.Text, label);
                    tpCinema.Controls.Add(labels[label.Text]);
                    seat = new Seat(label.Text, Color.Yellow);
                    cinema.Seats.Add(seat.SeatNum, seat);
                }
            }

        }

        //当确认买票时为已售票集合添加相应场次,座位的信息
        public void AddSold(object sender)
        {
            Label label = (Label)sender;
            Ticket ticket = TicketTtil.CreateTicket(tvMovies.SelectedNode.Parent.Text);
            ticket.ScheduleItem = (ScheduleItem)tvMovies.SelectedNode.Tag;
            ticket.Seat = cinema.Seats[label.Text];
            ticket.Seat.Color = Color.Red;
            ticket.Price = Convert.ToInt32(this.lblCalcPrice.Text);
            dictionary[tvMovies.SelectedNode.Text].SoldTickets.Add(ticket);
        }


        private void lblSeat_Click(object sender, EventArgs e)
        {
            if (!Not_Null())
            {
                return;
            }
            string print = Print(sender);
            if (string.IsNullOrEmpty(print))
            {
                return;
            }
            MessageBox.Show(print);
        }
        public string Print(object sender)
        {
            /*
             * 买票
             * */
            Label label = (Label)sender;
            if (label.BackColor == Color.Red)
            {
                MessageBox.Show("已售!");
                return null;
            }

            DialogResult result = MessageBox.Show("是否购买?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            if (result == DialogResult.No)
            {
                return null;
            }
            AddSold(sender);
            Change_Color();
            UpdateSeat();
            MessageBox.Show("购买成功!");
            Ticket ticket = Chose_Rdo();

            ticket.ScheduleItem = cinema.Schedule.Item[tvMovies.SelectedNode.Text];
            ticket.Seat = cinema.Seats[label.Text];
            ticket.Price = cinema.Schedule.Item[tvMovies.SelectedNode.Text].Movie.Price;

            /*
             * 在电脑硬盘内存储已买座位的小票(方便打印)
             * */
            string time = (ticket.ScheduleItem.Time).Replace(':', '-');
            string num = ticket.Seat.SeatNum;
            string PrintStr = ticket.Show();
            string nowTime = (DateTime.Now.ToShortDateString().ToString()).Replace(':', '-').Replace('/', '-');
            string path = "Ticket\\" + nowTime + " ^ " + time + " " + num + ".txt";
            FileStream fs = new FileStream(path, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            sw.Write(PrintStr);
            sw.Close();
            fs.Close();
            return PrintStr;
        }
        
        /*
         * 遍历已售票集合与座位集合,,将已售出的相应座位标记到座位集合中
         * */
        public void Change_Color()
        {
            string key = this.tvMovies.SelectedNode.Text;
            foreach (Ticket item in dictionary[tvMovies.SelectedNode.Text].SoldTickets)
            {
                foreach (Seat items in cinema.Seats.Values)
                {
                    if (item.ScheduleItem.Time == key && item.Seat.SeatNum == items.SeatNum)
                    {
                        /*
                         * 这里将Color属性赋值为Red作为已售出的座位
                         * */
                        //MessageBox.Show("Test");
                        items.Color = Color.Red;
                    }
                }
            }
        }

        //遍历座位集合。。为控件改变状态,表示此座位已售出,(方便用户)
        public void UpdateSeat()
        {
            foreach (string key in cinema.Seats.Keys)
            {
                labels[key].BackColor = cinema.Seats[key].Color;
            }
        }

        /*
         * 买票时要作出的相应的非空判断
         * */
        public bool Not_Null()
        {
            if (tvMovies.SelectedNode == null)
            {
                MessageBox.Show("请选择影片");
                return false;
            }

            if (tvMovies.SelectedNode.Tag == null)
            {
                MessageBox.Show("请选择影片放映时间");
                return false;
            }
            if (rdoFree.Checked && string.IsNullOrEmpty(txtCustomer.Text))
            {
                MessageBox.Show("请输入赠片人姓名");
                txtCustomer.Focus();
                return false;
            }
            else
            {
                return true;
            }
        }

        //普通票
        private void rdoNormal_Click(object sender, EventArgs e)
        {
            try
            {
                Price();
                txtCustomer.Text = null;
                cmbDisCount.Text = null;
                cmbDisCount.Enabled = false;
                txtCustomer.Enabled = false;
            }
            catch (Exception)
            {
                //MessageBox.Show("请先选择场次再选择票类型");
            }

        }

        //赠票(免费)
        private void rdoFree_Click(object sender, EventArgs e)
        {
            try
            {
                Price();
                cmbDisCount.Text = null;
                cmbDisCount.Enabled = false;
                txtCustomer.Enabled = true;
            }
            catch (Exception)
            {
                //MessageBox.Show("请先选择场次再选择票类型");
            }
        }

        //学生票(折扣)
        private void rdoStudent_Click(object sender, EventArgs e)
        {
            try
            {
                Price();
                txtCustomer.Text = null;
                cmbDisCount.SelectedIndex = 0;
                cmbDisCount.Enabled = true;
                txtCustomer.Enabled = false;
            }
            catch (Exception)
            {
               // MessageBox.Show("请先选择场次再选择票类型");
            }
        }

        //获取新放映列表
        private void tsmiNew_Click(object sender, EventArgs e)
        {
            cinema = new Cinema();
            Information_Emptying();
            AddTree();
            Butten();

            dictionary.Clear();
            foreach (TreeNode item in tvMovies.Nodes)
            {
                foreach (TreeNode items in item.Nodes)
                {
                    Cinema c = new Cinema();
                    dictionary.Add(items.Text, c);
                }
            }
        }

        //树形菜单,,点击节点作出的动作
        private void tvMovies_AfterSelect(object sender, TreeViewEventArgs e)
        {
            rdoNormal.Checked = true;
            if (tvMovies.SelectedNode.Tag == null)
            {
                return;
            }
            Information_Filling();
            Butten();
            Change_Color();
            UpdateSeat();
        }

        //接收计算的最终票价
        public void Price()
        {
            Ticket ticket = Chose_Rdo();

            ticket.Price = Convert.ToInt32(lblPrice.Text);
            this.lblCalcPrice.Text = ticket.CalcPrice().ToString();
        }

        //判断选择的票类型,,实例化相应 的类并做出返回值
        public Ticket Chose_Rdo()
        {
            Ticket ticket = null;
            if (rdoStudent.Checked)
            {
                ticket = TicketTtil.CreateTicket(rdoStudent.Text);
                (ticket as StudentTicket).Discount = Convert.ToInt32(this.cmbDisCount.Text);
            }
            else if (rdoFree.Checked)
            {
                ticket = TicketTtil.CreateTicket(rdoFree.Text);
            }
            else
            {
                ticket = TicketTtil.CreateTicket(rdoNormal.Text);
            }
            return ticket;
        }

        //下拉框选择相应折扣计算票价
        private void cmbDisCount_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbDisCount.Enabled == true)
            {
                return;
            }
            Price();
        }

        //保存(持久化)(关闭窗体后下次打开,点击继续销售可继续上次销售的票)
        private void tsmiSave_Click(object sender, EventArgs e)
        {
            cinema.Save(dictionary);
        }


        //窗体关闭时的事件(持久化)(关闭窗体后下次打开,点击继续销售可继续上次销售的票)
        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult result = MessageBox.Show("是否保存当前销售状态!", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            if (result == DialogResult.OK)
            {
                cinema.Save(dictionary);
            }
        }

        //继续销售   可继续上次销售的票
        private void tsmiMovies_Click(object sender, EventArgs e)
        {
            cinema = new Cinema();
            Information_Emptying();
            AddTree();
            Butten();

            dictionary.Clear();
            foreach (TreeNode item in tvMovies.Nodes)
            {
                foreach (TreeNode items in item.Nodes)
                {
                    Cinema c = new Cinema();
                    dictionary.Add(items.Text, c);
                }
            }
           dictionary = cinema.Load(dictionary);
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档