C#學(xué)習(xí)經(jīng)歷從基本語法結(jié)構(gòu)到窗體再到面向?qū)ο蠼K于走完了.NET初級程序員的道路,做為品德優(yōu)良好學(xué)生更不能落下課程的總結(jié)項(xiàng)目-某某鳥《影院售票系統(tǒng)》。用了大概一天半的時間做完這個練手項(xiàng)目,先上效果截圖一張
抽出時間做些這個對目前的我來說算不小的項(xiàng)目。
用到的知識點(diǎn)有:面向?qū)ο笏枷搿reeView、xml讀取、File文件流、泛型集合,這里面對我來說難度最大的是面向?qū)ο笈c泛型集合的結(jié)合,看來學(xué)習(xí)一門編程語言的難點(diǎn)還是在設(shè)計(jì)思想上。
再來介紹一下項(xiàng)目需求:在影片列表中選擇某個時段的一場電影,單擊座位選擇一個種類的電影票,并創(chuàng)建電影,計(jì)算價格并打印影票信息,然后該座位被置為紅色表示已經(jīng)售出。
影院每天更新放映列表,系統(tǒng)支持實(shí)時查看,包括電影放映場次時間、電影概況。
影院提供三類影票:普通票、贈票和學(xué)生票(贈票免費(fèi);學(xué)生票有折扣)
允許用戶查看某場次座位的售出情況
支持購票,并允許用戶選座
用戶可以選擇場次、影票類型及空閑座位進(jìn)行購票,并打印電影票
系統(tǒng)可以保存銷售情況,并允許對其進(jìn)行恢復(fù)
二.問題分析
1.系統(tǒng)開發(fā)步驟
(1)明確需求
(2)設(shè)計(jì)類
(3)創(chuàng)建項(xiàng)目
(4)確定編碼順序
1.主窗體
2.查看新放映列表
3.查看電影介紹
4.查看影票票價
5.查看放映廳座位
6.購票和打印電影票
7.繼續(xù)購票
(5)測試
三、類的設(shè)計(jì)
1.Seat:保存影院的座位信息,主要屬性如下
座位號(SeatNum):string類型
座位賣出狀態(tài)顏色(Color):System.Drawing.Color類型
2.Movie:電影類
電影名(MovieName):string類型
海報圖片路徑(Poster):string類型
導(dǎo)演名(Director):string類型
主演(Actor):string類型
電影類型(MovieType):MovieType自定義枚舉類型
定價(PRice):int類型
3.Ticket:電影票父類,保存電影票信息
放映場次(ScheduleItem):ScheduleItem自定義類
所屬座位對象(Seat):Seat自定義類型
票價(Price):int類型
計(jì)算票價的虛方法CalcPrice()
打印售票信息的虛方法Print()
顯示當(dāng)前售出票信息的虛方法Show()
4.StudentTicket:學(xué)生票子類,繼承父類Ticket
學(xué)生票的折扣(Discount):int類型
重寫父類計(jì)算票價CalcPrice
重寫父類打印售票信息的Print()
重寫父類顯示當(dāng)前出票信息的Show()方法
5.FreeTicket:贈票子類,繼承父類Ticket
獲得贈票者的名字屬性(CustomerName):string類型
重寫父類計(jì)算票價CalcPrice()
重寫父類打印售票信息Print()
重寫父類顯示當(dāng)前出票信息Show()
6.ScheduleItem:影院每天計(jì)劃放映計(jì)劃的場次,保存每場電影的信息
放映時間屬性(Time):string類型
本場所放映電影屬性(Movie):Movie自定義類型
7.Schedule:放映計(jì)劃類
放映場次屬性(Items):自定義泛型集合Dictionary<string,ScheduleItem>
讀取XML文件獲取放映計(jì)劃集合的LoadItems()方法
8.Cinema:影院類,保存放映計(jì)劃和座位類
座位集合屬性(Seat):自定義泛型集合Dictionary<string,Seat>
放映計(jì)劃Schedule:Schedule自定義類型
已售出電影票的集合(SoldTicket):自定義泛型集合List<Ticket>
保存和讀取售票情況的Save()和Load()方法
獻(xiàn)上這9個類的代碼,根據(jù)依賴編寫類的順序,不能完全按照上面順序
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Drawing; 7 8 namespace 影院售票系統(tǒng) 9 {10 /// <summary>11 /// 保存影院的座位信息12 /// </summary>13 public class Seat14 {15 public Seat() { }16 public Seat(string seatNum,Color color) 17 {18 this.SeatNum = seatNum;19 this.Color = color;20 }21 private string _seatNum;22 /// <summary>23 /// 座位號24 /// </summary>25 public string SeatNum26 {27 get { return _seatNum; }28 set { _seatNum = value; }29 }30 private Color _color;31 /// <summary>32 /// 座位賣出狀態(tài)顏色33 /// </summary>34 public Color Color35 {36 get { return _color; }37 set { _color = value; }38 }39 }40 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 影院售票系統(tǒng) 8 { 9 /// <summary>10 /// 電影類11 /// </summary>12 public class Movie13 {14 private string _movieName;15 /// <summary>16 /// 電影名17 /// </summary>18 public string MovieName19 {20 get { return _movieName; }21 set { _movieName = value; }22 }23 private string _poster;24 /// <summary>25 /// 海報圖片名26 /// </summary>27 public string Poster28 {29 get { return _poster; }30 set { _poster = value; }31 }32 private string _director;33 /// <summary>34 /// 導(dǎo)演名35 /// </summary>36 public string Director37 {38 get { return _director; }39 set { _director = value; }40 }41 private string _actor;42 /// <summary>43 /// 主演44 /// </summary>45 public string Actor46 {47 get { return _actor; }48 set { _actor = value; }49 }50 51 private int _price;52 /// <summary>53 /// 定價54 /// </summary>55 public int Price56 {57 get { return _price; }58 set { _price = value; }59 }60 /// <summary>61 /// 電影類型62 /// </summary>63 public MovieType MovieType { get; set; }64 }65 /// <summary>66 /// 電影類型,1喜劇2戰(zhàn)爭3愛情67 /// </summary>68 public enum MovieType69 {70 /// <summary>71 /// 動作片72 /// </summary>73 Action = 0,74 /// <summary>75 /// 戰(zhàn)爭片76 /// </summary>77 War = 1,78 /// <summary>79 /// 愛情片80 /// </summary>81 Comedy = 282 }83 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Forms; 7 using System.IO; 8 9 namespace 影院售票系統(tǒng)10 {11 /// <summary>12 /// 電影票父類13 /// </summary>14 public class Ticket15 {16 public Ticket() { }17 public Ticket(ScheduleItem sch,Seat seat) 18 {19 this.ScheduItem = sch;20 this.Seat = seat;21 }22 private Seat _seat = new Seat();23 /// <summary>24 /// 所屬座位25 /// </summary>26 public Seat Seat27 {28 get { return _seat; }29 set { _seat = value; }30 }31 32 private int _price;33 /// <summary>34 /// 票價35 /// </summary>36 public int Price37 {38 get { return _price; }39 set { _price = value; }40 }41 /// <summary>42 /// 放映場次43 /// </summary>44 public ScheduleItem ScheduItem { get; set; }45 /// <summary>46 /// 計(jì)算票價47 /// </summary>48 public virtual void CalcPrice()49 {50 this.Price = ScheduItem.Movie.Price;51 }52 /// <summary>53 /// 打印售票信息54 /// </summary>55 public virtual void Print()56 {57 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);58 MessageBox.Show(info);59 //存到文件中60 string fileName = this.ScheduItem.Time.Replace(":", "-")+" "+this.Seat.SeatNum+".txt";61 FileStream fs = new FileStream(fileName,FileMode.Create);62 StreamWriter sw = new StreamWriter(fs);63 sw.Write(info);64 sw.Close();65 fs.Close();66 }67 /// <summary>68 /// 顯示當(dāng)前售票信息69 /// </summary>70 public virtual void Show()71 {72 string info = string.Format("已售出!/n普通票!");73 MessageBox.Show(info);74 }75 }76 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Forms; 7 using System.IO; 8 namespace 影院售票系統(tǒng) 9 {10 /// <summary>11 /// 學(xué)生票12 /// </summary>13 public class StudentTicket : Ticket14 {15 public StudentTicket() { }16 public StudentTicket(ScheduleItem sch, Seat seat, int discount)17 : base(sch, seat)18 {19 this.Discount = discount;20 }21 private int _discount;22 /// <summary>23 /// 學(xué)生票的折扣24 /// </summary>25 public int Discount26 {27 get { return _discount; }28 set { _discount = value; }29 }30 /// <summary>31 /// 計(jì)算學(xué)生票價32 /// </summary>33 public override void CalcPrice()34 {35 this.Price =this.ScheduItem.Movie.Price* Discount / 10;36 }37 /// <summary>38 /// 打印學(xué)生票的售票信息39 /// </summary>40 public override void Print()41 {42 string info = string.Format("************************************************/n/t青鳥影院(學(xué)生)/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);43 MessageBox.Show(info);44 //存到文件中45 string fileName = this.ScheduItem.Time.Replace(":", "-") + " " + this.Seat.SeatNum + ".txt";46 FileStream fs = new FileStream(fileName, FileMode.Create);47 StreamWriter sw = new StreamWriter(fs);48 sw.Write(info);49 sw.Close();50 fs.Close();51 }52 /// <summary>53 /// 顯示當(dāng)前售出票信息54 /// </summary>55 public override void Show()56 {57 string info = string.Format("已售出!/n{0}折學(xué)生票!",this.Discount);58 MessageBox.Show(info);59 }60 }61 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Forms; 7 using System.IO; 8 9 namespace 影院售票系統(tǒng)10 {11 /// <summary>12 /// 贈票13 /// </summary>14 public class FreeTicket:Ticket15 {16 public FreeTicket() { }17 public FreeTicket(ScheduleItem sch,Seat seat,string name) 18 {19 this.Seat = seat;20 this.CustomerName = name;21 this.ScheduItem = sch;22 }23 private string _customerName;24 /// <summary>25 /// 獲得贈票者的名字26 /// </summary>27 public string CustomerName28 {29 get { return _customerName; }30 set { _customerName = value; }31 }32 /// <summary>33 /// 計(jì)算票價34 /// </summary>35 public override void CalcPrice()36 {37 this.Price = 0;38 }39 /// <summary>40 /// 打印售票信息41 /// </summary>42 public override void Print()43 {44 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.CustomerName);45 MessageBox.Show(info);46 //存到文件中47 string fileName = this.ScheduItem.Time.Replace(":", "-") + " " + this.Seat.SeatNum + ".txt";48 FileStream fs = new FileStream(fileName, FileMode.Create);49 StreamWriter sw = new StreamWriter(fs);50 sw.Write(info);51 sw.Close();52 fs.Close();53 }54 /// <summary>55 /// 顯示當(dāng)前售出票信息56 /// </summary>57 public override void Show()58 {59 MessageBox.Show("已售出!/n贈票!");60 }61 }62 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 影院售票系統(tǒng) 8 { 9 /// <summary>10 /// 影院每天計(jì)劃放映的場次,保存每場電影的信息11 /// </summary>12 public class ScheduleItem13 {14 private string _time;15 /// <summary>16 /// 放映時間17 /// </summary>18 public string Time19 {20 get { return _time; }21 set { _time = value; }22 }23 private Movie _movie = new Movie();24 25 /// <summary>26 /// 本場放映的電影27 /// </summary>28 public Movie Movie29 {30 get { return _movie; }31 set { _movie = value; }32 }33 private List<Ticket> _soldTickets=new List<Ticket>();34 35 private Dictionary<string, Seat> _seats=new Dictionary<string,Seat>();36 /// <summary>37 /// 本場次的座位狀態(tài)38 /// </summary>39 public Dictionary<string, Seat> Seats40 {41 get { return _seats; }42 set { _seats = value; }43 }44 }45 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Xml; 7 8 namespace 影院售票系統(tǒng) 9 {10 /// <summary>11 /// 放映計(jì)劃類,保存影院當(dāng)天的放映計(jì)劃集合12 /// </summary>13 public class Schedule14 {15 /// <summary>16 /// 放映場次17 /// </summary>18 public Dictionary<string, ScheduleItem> Items = new Dictionary<string, ScheduleItem>();19 /// <summary>20 /// 讀取XML文件獲取放映計(jì)劃集合21 /// </summary>22 public void LoadItems()23 {24 Items.Clear();25 XmlDocument xml = new XmlDocument();26 xml.Load("ShowList.xml");27 XmlElement root = xml.DocumentElement;28 foreach (XmlNode item in root.ChildNodes)29 {30 Movie movie = new Movie();31 movie.MovieName = item["Name"].InnerText;32 movie.Poster = item["Poster"].InnerText;33 movie.Director = item["Director"].InnerText;34 movie.Actor = item["Actor"].InnerText;35 switch (item["Type"].InnerText)36 {37 case "Action":38 movie.MovieType = MovieType.Action;39 break;40 case "War":41 movie.MovieType = MovieType.War;42 break;43 case "Comedy":44 movie.MovieType = MovieType.Comedy;45 break;46 }47 movie.Price = Convert.ToInt32(item["Price"].InnerText);48 if (item["Schedule"].HasChildNodes)49 {50 foreach (XmlNode item2 in item["Schedule"].ChildNodes)51 {52 ScheduleItem schItem = new ScheduleItem();53 schItem.Time = item2.InnerText;54 schItem.Movie = movie;55 Items.Add(schItem.Time, schItem);56 }57 }58 59 }60 61 62 }63 }64 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 影院售票系統(tǒng) 8 { 9 /// <summary>10 /// 影院類11 /// </summary>12 public class Cinema13 {14 private Dictionary<string, Seat> _seats = new Dictionary<string, Seat>();15 /// <summary>16 /// 座位集合17 /// </summary>18 public Dictionary<string, Seat> Seats19 {20 get { return _seats; }21 set { _seats = value; }22 }23 private Schedule _schedule = new Schedule();24 /// <summary>25 /// 放映計(jì)劃26 /// </summary>27 public Schedule Schedule28 {29 get { return _schedule; }30 set { _schedule = value; }31 }32 private List<Ticket> _soldTickets=new List<Ticket>();33 /// <summary>34 /// 已經(jīng)售出的票35 /// </summary>36 public List<Ticket> SoldTickets37 {38 get { return _soldTickets; }39 set { _soldTickets = value; }40 }41 /// <summary>42 /// 保存售票信息到文件中43 /// </summary>44 public void Save() 45 {46 //Save和Load的代碼在窗體的代碼實(shí)現(xiàn)了47 }48 /// <summary>49 /// 從文件中讀取售票信息50 /// </summary>51 public void Load() { }52 }53 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 影院售票系統(tǒng) 8 { 9 /// <summary>10 /// 工具類11 /// </summary>12 public class TicketUtil13 {14 /// <summary>15 /// 創(chuàng)建電影票16 /// </summary>17 /// <returns></returns>18 public static Ticket CreateTicket(ScheduleItem sch,Seat seat,int discount,string customerName,string type)19 {20 Ticket ticket=null;21 switch (type)22 {23 case "StudentTicket":24 ticket = new StudentTicket(sch,seat,discount);25 break;26 case "FreeTicket":27 ticket = new FreeTicket(sch,seat,customerName);28 break;29 default:30 ticket = new Ticket(sch,seat);31 break;32 }33 return ticket;34 }35 }36 }
明天將繼續(xù)更新-電影院座位的動態(tài)繪制、電影信息綁定到窗體中展現(xiàn)出來,也望各路大神出手斧正不合理的代碼(不要涉及分層開發(fā),我們在學(xué),以后會用分層開發(fā)實(shí)現(xiàn)其他的項(xiàng)目)
新聞熱點(diǎn)
疑難解答
圖片精選