<?xml version="1.0" encoding="utf-8" ?>
<ShowList>
<Movie>
<Name>不二神探</Name>
<Poster>不二神探.png</Poster>
<Director>王子鸣</Director>
<Actor>李连杰、文章、陈妍希</Actor>
<Type>动作</Type>
<Price>60</Price>
<Schedule>
<Item>9:00</Item>
<Item>13:00</Item>
</Schedule>
</Movie>
<Movie>
<Name>西游降魔篇</Name>
<Poster>西游降魔篇.png</Poster>
<Director>郭子健、周星驰</Director>
<Actor>黄渤、舒淇、文章</Actor>
<Type>喜剧</Type>
<Price>60</Price>
<Schedule>
<Item>11:20</Item>
<Item>15:45</Item>
<Item>19:25</Item>
</Schedule>
</Movie>
<Movie>
<Name>中国合伙人</Name>
<Poster>中国合伙人.png</Poster>
<Director>陈可辛</Director>
<Actor>黄晓明、邓超、佟大为</Actor>
<Type>喜剧</Type>
<Price>70</Price>
<Schedule>
<Item>21:00</Item>
<Item>23:10</Item>
</Schedule>
</Movie>
<Movie>
<Name>钢铁侠</Name>
<Poster>钢铁侠.png</Poster>
<Director>沙恩布莱克</Director>
<Actor>小罗伯特唐尼</Actor>
<Type>动作</Type>
<Price>70</Price>
<Schedule>
<Item>17:30</Item>
</Schedule>
</Movie>
</ShowList>
class Cinema //影院类
{
public Cinema()
{
Seats = new Dictionary<string, Seat>();
SoldTicket = new List<Ticket>();
SeSchedule = new Schedule();
}
//座位集合
public Dictionary<string, Seat> Seats { get; set; }
//放映计划
public Schedule SeSchedule { get; set; }
//已售出电影票
public List<Ticket> SoldTicket { get; set; }
public void Save()
{
FileStream fs = new FileStream("soldTickets.txt", FileMode.OpenOrCreate);
StreamWriter writer = new StreamWriter(fs, Encoding.Default);
for (int index = 0; index < SoldTicket.Count; index++)
{
Ticket ticket = SoldTicket[index];
string info = "|" + ticket.SeScheduleItem.Movie.MovieName + "|" + ticket.SeScheduleItem.Movie.Poster + "|" +
ticket.SeScheduleItem.Movie.Director + "|" + ticket.SeScheduleItem.Movie.Actor + "|" + ticket.SeScheduleItem.Movie.MoveType.ToString()
+ "|" + ticket.SeScheduleItem.Movie.Price + "|" + ticket.SeScheduleItem.Time + "|" + ticket.Seat.SeatName + "|" +
ticket.Seat.Color + "|" + ticket.Price + "|";
if (ticket is FreeTicket)
{
string customerName = ((FreeTicket)ticket).CustomerName;
writer.WriteLine("free" + info + customerName);
}
else if (ticket is StudentTicket)
{
writer.WriteLine("student" + info + "");
}
else
{
writer.WriteLine("" + info + "");
}
}
writer.WriteLine("the end");
writer.Close();
fs.Close();
}
public void Load()
{
try
{
StreamReader reader = new StreamReader("soldTickets.txt", Encoding.GetEncoding("GB2312"));
string line = reader.ReadLine();
string[] propertyValues;
Ticket ticket = null;
while (line.Trim() != "the end")
{
propertyValues = line.Split('|');
string type = propertyValues[0];
Movie movie = new Movie(propertyValues[1], propertyValues[2], propertyValues[3], propertyValues[4], (MovieType)Enum.Parse(typeof(MovieType), propertyValues[5]), int.Parse(propertyValues[6]));
ScheduleItem scheduleItem = new ScheduleItem();
scheduleItem.Time = propertyValues[7];
scheduleItem.Movie = movie;
string color = propertyValues[9];
string endcolor = color.Substring(color.IndexOf("[") + 1, color.Length - 1 - color.IndexOf("[") - 1);
Seat seat = new Seat(propertyValues[8], Color.FromName(endcolor));
int discount = 10;
switch (type)
{
case "student":
discount = 7;
ticket = TicketUtil.CreateTicket(scheduleItem, seat, discount, "", type);
break;
case "free":
discount = 0;
ticket = TicketUtil.CreateTicket(scheduleItem, seat, discount, propertyValues[11], type);
break;
default:
discount = 10;
ticket = TicketUtil.CreateTicket(scheduleItem, seat, discount, "", "");
break;
}
this.SoldTicket.Add(ticket);
line = reader.ReadLine();
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine("出错了:" + ex.Message);
SoldTicket = new List<Ticket>();
throw;
}
}
}
public class Movie//电影类
{
public Movie() { }
public Movie(string movieName, string poster, string director, string actor, MovieType movieType, int price)
{
this.MovieName = movieName;
this.Poster = poster;
this.Director = director;
this.Actor = actor;
this.MoveType = movieType;
this.Price = price;
}
public string MovieName { get; set; }//电影名字
public string Poster { get; set; }//图片名
public string Director { get; set; }//导演
public string Actor { get; set; }//主演
public MovieType MoveType { get; set;} //电影类型
public int Price { get; set; }//定价价格
}
public enum MovieType//电影类型类
{
Comedy,
War,
Romance,//爱情
Action,
Katong,
Kongbu,
Maoxian
}
public class Schedule//放映计划类
{
public Schedule()
{
Item = new Dictionary<string, ScheduleItem>();
}
//放映场次
public Dictionary<string, ScheduleItem> Item { get; set; }
//从Xml中读取文件
public void LoadItems()
{
if (Item == null)
{
Item = new Dictionary<string, ScheduleItem>();
}
Item.Clear();
XmlDocument doc = new XmlDocument();
doc.Load("ShowList.xml");
XmlNode feednode = doc.DocumentElement;
//中间变量
string movieName = null;
string playBill = null;
string director = null;
string actor = null;
string movieType = null;
string price = null;
foreach (XmlNode node in feednode.ChildNodes)
{
if (node.Name == "Movie")
{
foreach (XmlNode subNode in node.ChildNodes)
{
switch (subNode.Name)
{
case "Name":
movieName = subNode.InnerText;
break;
case "Poster":
playBill = subNode.InnerText;
break;
case "Director":
director = subNode.InnerText;
break;
case "Actor":
actor = subNode.InnerText;
break;
case "Type":
movieType = subNode.InnerText;
break;
case "Price":
price = subNode.InnerText;
break;
case "Schedule":
foreach (XmlNode scheduleNode in subNode.ChildNodes)
{
ScheduleItem item = new ScheduleItem();
item.Time = scheduleNode.InnerText;
item.Movie.MovieName = movieName;
item.Movie.Poster = playBill;
item.Movie.Director = director;
item.Movie.Actor = actor;
// item.Movie.MoveType = (MovieType)Enum.Parse(typeof(MovieType), movieType);
item.Movie.Price = int.Parse(price);
Item.Add(item.Time, item);
}
break;
default:
break;
}
}
}
}
}
}
public class ScheduleItem //放映场次
{
public ScheduleItem()
{
Movie=new Movie();
}
public string Time{get; set; }//放映时间
public Movie Movie { get; set; } //本场放映的电影
public class Seat//座位类
{
public string SeatName { get; set; }//座位号
public Color Color { get; set; }//卖出座位号颜色
public Seat(string seatName,Color color)
{
this.SeatName = seatName;
this.Color = color;
}
}
internal class StudentTicket : Ticket
{
//学生票子类
public int Discount { get; set; } //折扣
public StudentTicket(ScheduleItem scheduleItem, Seat seat, int discount) :
base(scheduleItem, seat)
{
this.Discount = discount;
}
public override void CalcPrice()
{
this.Price = this.SeScheduleItem.Movie.Price * Discount / 10;
}
public override void Print()
{
string fileName = this.SeScheduleItem.Time.Replace(":", "-") + " " + this.Seat.SeatName + ".txt";
FileStream fs = new FileStream(fileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("***************************");
sw.WriteLine(" 青鸟影院 (学生)");
sw.WriteLine("---------------------------");
sw.WriteLine(" 电影名:\t{0}", this.SeScheduleItem.Movie.MovieName);
sw.WriteLine(" 时间: \t{0}", this.SeScheduleItem.Time);
sw.WriteLine(" 座位号:\t{0}", this.Seat.SeatName);
sw.WriteLine(" 价格: \t{0}", this.Price.ToString());
sw.WriteLine("***************************");
sw.Close();
fs.Close();
}
public override void Show()
{
MessageBox.Show("已售出!\n\n " + this.Discount + "折学生票!");
}
}
public class Ticket//票类
{
//无参构造
public Ticket() { }
public Ticket(ScheduleItem scheduleItem, Seat seat)
{
this.SeScheduleItem = scheduleItem;
this.Seat = seat;
}
public ScheduleItem SeScheduleItem { get; set; } //放映场次
public Seat Seat { get; set; }//所属座位
public int price { get; set; } //票价
//计算票价
public int Price { get; set; } //票价
public virtual void CalcPrice()
{
this.Price = this.SeScheduleItem.Movie.Price;
}
public virtual void Print()
{
string fileName = this.SeScheduleItem.Time.Replace(":", "-") + " " + this.Seat.SeatName + ".txt";
FileStream fs = new FileStream(fileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("***************************");
sw.WriteLine(" 青鸟影院");
sw.WriteLine("---------------------------");
sw.WriteLine(" 时间: \t{0}", this.SeScheduleItem.Time);
sw.WriteLine(" 座位号:\t{0}", this.Seat.SeatName);
sw.WriteLine(" 价格: \t{0}", this.Price.ToString());
sw.WriteLine("***************************");
sw.Close();
fs.Close();
}
//显示当前售票出售信息
public virtual void Show()
{
MessageBox.Show("已售出");
}
}
class TicketUtil
{
//工具类
public static Ticket CreateTicket(ScheduleItem scheduleItem, Seat seat, int discount, string customerName, string type)
{
Ticket newTicket = null;
switch (type)
{
case "student":
newTicket = new StudentTicket(scheduleItem, seat, discount);
break;
case "free":
newTicket = new FreeTicket(scheduleItem, seat, customerName);
break;
case "":
newTicket = new Ticket(scheduleItem, seat);
break;
default:
break;
}
return newTicket;
}
}
class FreeTicket:Ticket //免费票类
{
public string CustomerName { get; set; }
public FreeTicket() { }
public FreeTicket(ScheduleItem scheduleItem, Seat seat, string customerName)
: base(scheduleItem, seat)
{
this.CustomerName = customerName;
}
public override void CalcPrice()
{
this.Price = 0;
}
public override void Print()
{
string fileName = this.SeScheduleItem.Time.Replace(":", "-") + " " + this.Seat.SeatName + ".txt";
FileStream fs = new FileStream(fileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("***************************");
sw.WriteLine(" 青鸟影院 (赠票)");
sw.WriteLine("---------------------------");
sw.WriteLine(" 电影名:\t{0}", this.SeScheduleItem.Movie.MovieName);
sw.WriteLine(" 时间: \t{0}", this.SeScheduleItem.Time);
sw.WriteLine(" 座位号:\t{0}", this.Seat.SeatName);
sw.WriteLine(" 姓名: \t{0}", this.CustomerName);
sw.WriteLine("***************************");
sw.Close();
fs.Close();
}
public override void Show()
{
base.Show();
}
}
namespace Day_11
{
public partial class
FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
string key = null;
Cinema cinema ;
int tic = 0;
//影院类
private Dictionary<string, Label> labels = new Dictionary<string, Label>();
private Seat seat; //座位类
Label lable1;
private void FrmMain_Load(object sender, EventArgs e)
{
this.label2.Text = "";
this.label13.Text = "";
this.label6.Text = "";
this.label8.Text = "";
this.label12.Text = "";
this.label4.Text = "";
this.comboBox1.Enabled = false;
this.radioButton1.Checked = true;
this.textBox3.Enabled = false;
cinema = new Cinema();
zuowei();
cinema.Load();
}
//动态加载座位
public void zuowei()
{
for (int i = 0; i <= 6; i++)
{
for (int j = 0; j <= 6; j++)
{
lable1 = new Label();
lable1.Text = (i + 1).ToString() + "-" + (j + 1).ToString(); //设置座位号
lable1.BackColor = Color.Yellow; //设置背景颜色
lable1.Size = new System.Drawing.Size(50, 25); //设置尺寸
lable1.Location = new Point(((j + 1) * 100), ((i + 1) * 40)); //设置坐标
lable1.TextAlign = ContentAlignment.MiddleCenter; //对齐
tabPage2.Controls.Add(lable1);
lable1.Click+=lable1_Click;
labels.Add(lable1.Text, lable1);
seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Yellow);
cinema.Seats.Add(seat.SeatName, seat);
}
}
}
private void InitTreeView()
{
//首先将TreeView的所有节点清空
treeView1.BeginUpdate();
treeView1.Nodes.Clear();
string movieName = null;
TreeNode movieNode = null;
foreach (ScheduleItem item in cinema.SeSchedule.Item.Values)
{
//判断树形结构中是否已经有了电影名称
if (movieName != item.Movie.MovieName)
{
movieNode = new TreeNode(item.Movie.MovieName);
treeView1.Nodes.Add(movieNode);
}
TreeNode timeNode = new TreeNode(item.Time);
movieNode.Nodes.Add(timeNode);
//遍历一项,改变movieName的值作为下一次遍历名称是否重复的依据
movieName = item.Movie.MovieName;
}
treeView1.EndUpdate();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode node = treeView1.SelectedNode;
if (node == null) return;
if (node.Level != 1) return;
key = node.Text;
//将详细信息显示
this.label2.Text = cinema.SeSchedule.Item[key].Movie.MovieName;
this.label4.Text = cinema.SeSchedule.Item[key].Movie.Director;
this.label6.Text = cinema.SeSchedule.Item[key].Movie.Actor;
this.label8.Text = cinema.SeSchedule.Item[key].Movie.MoveType.ToString();
this.label10.Text = cinema.SeSchedule.Item[key].Time;
this.label12.Text = cinema.SeSchedule.Item[key].Movie.Price.ToString();
this.pictureBox1.Image = Image.FromFile(cinema.SeSchedule.Item[key].Movie.Poster);
this.label14.Text = "";
//清空座位
ClearZuo();
//遍历该场电影的座位销售情况
foreach (Ticket ticket in cinema.SoldTicket)
{
foreach (Seat seat in cinema.Seats.Values)
{
if ((ticket.SeScheduleItem.Time == key) && (ticket.Seat.SeatName == seat.SeatName))
{
seat.Color = Color.Red;
}
}
xiugaizuowei();
}
}
//清空座位
public void ClearZuo()
{
foreach (Seat seat in cinema.Seats.Values)
{
seat.Color = Color.Yellow;
}
}
//学生折扣控件
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//根据当前选中的电影,设置优惠价
if (this.label12.Text != "")
{
int price = int.Parse(this.label12.Text);
int discount = int.Parse(this.comboBox1.Text);
this.label4.Text = (price*discount/10).ToString();
}
}
//修改座位
public void xiugaizuowei()
{
foreach (string key in cinema.Seats.Keys)
{
labels[key].BackColor = cinema.Seats[key].Color;
}
}
//保存按钮
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
cinema.Save();
}
//继续销售按钮
private void 继续销售ToolStripMenuItem_Click(object sender, EventArgs e)
{
//判断放映列表是否为null
if (cinema.SeSchedule.Item.Count == 0)
{
cinema.SeSchedule.LoadItems();
}
InitTreeView();
}
//退出事件
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult close;
close = MessageBox.Show("是否保存当前销售状态?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (close == DialogResult.Yes)
{
//退出时保存Cinema对象
cinema.Save();
}
cinema.Save();
this.Dispose();
}
//获取最新播放列表事件
private void 获取最新播放列表ToolStripMenuItem_Click(object sender, EventArgs e)
{
cinema.SeSchedule.LoadItems();
cinema.SoldTicket.Clear();
InitTreeView();
}
//点击座位
private void lable1_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(this.label2.Text))
{
MessageBox.Show("您还没有选择电影!");
return;
}
tic++;
//try
//{
string seatNum= ((Label) sender).Text.ToString();
// MessageBox.Show(seatNum.ToString());
string customerName = this.textBox3.Text.ToString();
int discount = 0;
string type = "";
if (this.radioButton3.Checked)
{
type = "student";
if (this.comboBox1.Text == null)
{
MessageBox.Show("请输入折扣数");
}
else
{
discount = int.Parse(this.comboBox1.Text);
}
}
else if (this.radioButton2.Checked)
{
if (String.IsNullOrEmpty(this.textBox3.Text))
{
MessageBox.Show("请输入赠票者姓名!");
}
else
{
type = "free";
}
}
//调用工具类创建票
Ticket newTicket = TicketUtil.CreateTicket(cinema.SeSchedule.Item[key],
cinema.Seats[seatNum], discount, customerName, type);
if (cinema.Seats[seatNum].Color == Color.Yellow)
{
//打印
DialogResult result;
result = MessageBox.Show("是否购买?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (result == DialogResult.Yes)
{
cinema.Seats[seatNum].Color = Color.Red;
newTicket.CalcPrice();
cinema.SoldTicket.Add(newTicket);
xiugaizuowei();
label14.Text = newTicket.Price.ToString();
newTicket.Print();
}
else if (result == DialogResult.No)
{
return;
}
}
else
{
//显示当前售出票的信息
foreach (Ticket tickets in cinema.SoldTicket)
{
//判断是否为同场次,同电影,同座位号
if (tickets.Seat.SeatName == seatNum &&
tickets.SeScheduleItem.Time == treeView1.SelectedNode.Text &&
tickets.SeScheduleItem.Movie.MovieName == treeView1.SelectedNode.Parent.Text)
{
tickets.Show();
}
}
}
//}
//catch (Exception ex)
//{
// MessageBox.Show(ex.Message);
//}
}
//普通票
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
this.comboBox1.Enabled = false;
this.textBox3.Text = "";
this.textBox3.Enabled = false;
this.comboBox1.Text = "";
this.label14.Text = "";
}
//赠票
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
this.textBox3.Enabled = true;
this.comboBox1.Enabled = false;
this.comboBox1.Text = "";
//设置优惠票
this.label14.Text = "0";
}
//学生票
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
this.textBox3.Enabled = false;
this.textBox3.Text = "";
this.comboBox1.Enabled = true;
this.comboBox1.Text = "7";
//根据当前选中的电影,设置优惠价
if (this.label12.Text != "")
{
int price = int.Parse(this.label12.Text);
int discount = int.Parse(this.comboBox1.Text);
this.label14.Text = (price * discount / 10).ToString();
}
}