C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,用了大概一天半的时间做完这个练手项目《影院售票系统》,先上效果截图一张
抽出时间做些这个对目前的我来说算不小的项目。
用到的知识点有:面向对象思想、TreeView、XML读取、File文件流、泛型集合,这里面对我来说难度最大的是面向对象与泛型集合的结合,看来学习一门编程语言的难点还是在设计思想上。
再来介绍一下项目需求:在影片列表中选择某个时段的一场电影,单击座位选择一个种类的电影票,并创建电影,计算价格并打印影票信息,然后该座位被置为红色表示已经售出。
影院每天更新放映列表,系统支持实时查看,包括电影放映场次时间、电影概况。
影院提供三类影票:普通票、赠票和学生票(赠票免费;学生票有折扣)
允许用户查看某场次座位的售出情况
支持购票,并允许用户选座
用户可以选择场次、影票类型及空闲座位进行购票,并打印电影票
系统可以保存销售情况,并允许对其进行恢复
一、问题分析
1.系统开发步骤
(1)明确需求
(2)设计类
(3)创建项目
(4)确定编码顺序
1.主窗体
2.查看新放映列表
3.查看电影介绍
4.查看影票票价
5.查看放映厅座位
6.购票和打印电影票
7.继续购票
(5)测试
二、类的设计
献上这9个类的代码,根据依赖编写类的顺序,不能完全按照上面顺序
1.Seat:保存影院的座位信息,主要属性如下
座位号(SeatNum):string类型
座位卖出状态颜色(Color):System.Drawing.Color类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace 影院售票系统 { /// <summary> /// 保存影院的座位信息 /// </summary> public class Seat { public Seat() { } public Seat(string seatNum,Color color) { this.SeatNum = seatNum; this.Color = color; } private string _seatNum; /// <summary> /// 座位号 /// </summary> public string SeatNum { get { return _seatNum; } set { _seatNum = value; } } private Color _color; /// <summary> /// 座位卖出状态颜色 /// </summary> public Color Color { get { return _color; } set { _color = value; } } } }</div>
2.Movie:电影类
电影名(MovieName):string类型
海报图片路径(Poster):string类型
导演名(Director):string类型
主演(Actor):string类型
电影类型(MovieType):MovieType自定义枚举类型
定价(Price):int类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 影院售票系统 { /// <summary> /// 电影类 /// </summary> public class Movie { private string _movieName; /// <summary> /// 电影名 /// </summary> public string MovieName { get { return _movieName; } set { _movieName = value; } } private string _poster; /// <summary> /// 海报图片名 /// </summary> public string Poster { get { return _poster; } set { _poster = value; } } private string _director; /// <summary> /// 导演名 /// </summary> public string Director { get { return _director; } set { _director = value; } } private string _actor; /// <summary> /// 主演 /// </summary> public string Actor { get { return _actor; } set { _actor = value; } } private int _price; /// <summary> /// 定价 /// </summary> public int Price { get { return _price; } set { _price = value; } } /// <summary> /// 电影类型 /// </summary> public MovieType MovieType { get; set; } } /// <summary> /// 电影类型,1喜剧2战争3爱情 /// </summary> public enum MovieType { /// <summary> /// 动作片 /// </summary> Action = 0, /// <summary> /// 战争片 /// </summary> War = 1, /// <summary> /// 爱情片 /// </summary> Comedy = 2 } }</div>
3.Ticket:电影票父类,保存电影票信息
放映场次(ScheduleItem):ScheduleItem自定义类
所属座位对象(Seat):Seat自定义类型
票价(Price):int类型
计算票价的虚方法CalcPrice()
打印售票信息的虚方法Print()
显示当前售出票信息的虚方法Show()
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace 影院售票系统 { /// <summary> /// 电影票父类 /// </summary> public class Ticket { public Ticket() { } public Ticket(ScheduleItem sch,Seat seat) { this.ScheduItem = sch; this.Seat = seat; } private Seat _seat = new Seat(); /// <summary> /// 所属座位 /// </summary> public Seat Seat { get { return _seat; } set { _seat = value; } } private int _price; /// <summary> /// 票价 /// </summary> public int Price { get { return _price; } set { _price = value; } } /// <summary> /// 放映场次 /// </summary> public ScheduleItem ScheduItem { get; set; } /// <summary> /// 计算票价 /// </summary> public virtual void CalcPrice() { this.Price = ScheduItem.Movie.Price; } /// <summary> /// 打印售票信息 /// </summary> public virtual void Print() { string info = string.Format("************************************************\n\t青鸟影院\n------------------------------------------------\n电影名:\t{0}\n时间:\t{1}\n座位号:\t{2}\n价格:\t{3}\n************************************************", this.ScheduItem.Movie.MovieName, this.ScheduItem.Time, this.Seat.SeatNum, this.Price); MessageBox.Show(info); //存到文件中 string fileName = this.ScheduItem.Time.Replace(":", "-")+" "+this.Seat.SeatNum+".txt"; FileStream fs = new FileStream(fileName,FileMode.Create); StreamWriter sw = new StreamWriter(fs); sw.Write(info); sw.Close(); fs.Close(); } /// <summary> /// 显示当前售票信息 /// </summary> public virtual void Show() { string info = string.Format("已售出!\n普通票!"); MessageBox.Show(info); } } }</div>
4.StudentTicket:学生票子类,继承父类Ticket
学生票的折扣(Discount):int类型
重写父类计算票价CalcPrice
重写父类打印售票信息的Print()
重写父类显示当前出票信息的Show()方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace 影院售票系统 { /// <summary> /// 学生票 /// </summary> public class StudentTicket : Ticket { public StudentTicket() { } public StudentTicket(ScheduleItem sch, Seat seat, int discount) : base(sch, seat) { this.Discount = discount; } private int _discount; /// <summary> /// 学生票的折扣 /// </summary> public int Discount { get { return _discount; }