1.首先我们需要了解这个软件的功能:

1).影院每天更新放映列表,系统支持实时查看,包括电影放映场次的时间;

2).影院提供三类影票:普通票,学生票和赠票;

3).允许用户查看某场次座位的售出情况;

4).允许购票,并允许用户选座;

5).用户可以选择场次、影票类型及空闲座位进行购票,并打印电影票;

6).系统可以保存销售情况,并允许对其进行恢复;

 [Serializable] //可序列化
public class Seat
{
public string SeatNum { get; set; } //座位号
public System.Drawing.Color Color { get; set; } public Seat() { }
public Seat(string seatnum,System.Drawing.Color color)
{
this.SeatNum = seatnum;
this.Color = color;
}
}

影院座位信息

电影类
 [Serializable] //可序列化
public class Schedule
{
//放映场次集合
public Dictionary<string, ScheduleItem> Items = new Dictionary<string, ScheduleItem>();
//解析XML文件
public void LoadItems()
{
XmlDocument myxml = new XmlDocument();
myxml.Load("ShowList.xml");
XmlNode root = myxml.DocumentElement;
foreach (XmlNode item in root.ChildNodes)
{
Movie movie = new Movie();
foreach(XmlNode node in item.ChildNodes)
{
switch (node.Name)
{
case "Name":
movie.MovieName = node.InnerText;
break;
case "Poster":
movie.Poster = node.InnerText;
break;
case "Director":
movie.Director = node.InnerText;
break;
case "Actor":
movie.Actor = node.InnerText;
break;
case "Price":
movie.Price =Convert.ToInt32( node.InnerText);
break;
case "Type":
movie.MovieType = node.InnerText;
break;
case "Schedule":
foreach (XmlNode nodes in node.ChildNodes)
{
ScheduleItem sch = new ScheduleItem(nodes.InnerText,movie);
Items.Add(nodes.InnerText,sch);
}
break;
}
}
}
}
}

放映场次集合

//电影票父类
[Serializable] //可序列化
public class Ticket
{
public ScheduleItem ScheduleItem { get; set; } //放映场次
public Seat Seat { get; set; } //所属座位对象
public int Price { get; set; } //票价
public Ticket()
{
this.ScheduleItem = new ScheduleItem();
this.Seat = new Seat();
}
public Ticket(ScheduleItem item,Seat seat)
{
this.ScheduleItem = item;
this.Seat = seat;
this.Price = CalcPrice();
}
//计算票价
public virtual int CalcPrice()
{
this.Price = ScheduleItem.Movie.Price;
return this.Price;
}
//打印售票信息
public virtual void Print()
{
//取文件名
string fileName = ScheduleItem.Time.Replace(":", "-") + "" + Seat.SeatNum + ".txt";
//生成文件
FileStream fs = new FileStream(fileName,FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("*****************************");
sw.WriteLine("\t青鸟影院");
sw.WriteLine("-----------------------------");
sw.WriteLine("电影名:\t{0}", ScheduleItem.Movie.MovieName);
sw.WriteLine("时 间:\t{0}", ScheduleItem.Time);
sw.WriteLine("座位号:\t{0}", Seat.SeatNum);
sw.WriteLine("价 格:\t{0}", CalcPrice());
sw.WriteLine("*****************************");
sw.WriteLine("\t(a)普通票");
sw.Close();
fs.Close();
}
//显示售票信息
public virtual void Show()
{
MessageBox.Show("已售出!\n普通票");
}
}

电影票父类

//增票子类
public class FreeTicket:Ticket
{
public string CustomerName { get; set; }
public FreeTicket() { }
public FreeTicket(ScheduleItem item,Seat seat,string name):base(item,seat)
{
this.CustomerName = name;
} //打印售票信息
public override void Print()
{
//取文件名
string fileName = ScheduleItem.Time.Replace(":", "-") + "-" + Seat.SeatNum + ".txt";
//生成文件
FileStream fs = new FileStream(fileName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("*****************************");
sw.WriteLine("\t青鸟影院(增票)");
sw.WriteLine("-----------------------------");
sw.WriteLine("电影名:\t{0}", ScheduleItem.Movie.MovieName);
sw.WriteLine("时 间:\t{0}", ScheduleItem.Time);
sw.WriteLine("座位号:\t{0}", Seat.SeatNum);
sw.WriteLine("价 格:\t{0}", this.CustomerName);
sw.WriteLine("*****************************");
sw.WriteLine("\t(c)增票");
sw.Close();
fs.Close();
}
//显示售票信息
public override void Show()
{
MessageBox.Show("已售出!\n{0}增票",this.CustomerName);
}
}

增票子类

学生子类
 //影院类
[Serializable] //可序列化
class Cinema
{
public Dictionary<string, Seat> Seats { get; set; } //座位集合
public Schedule Schedule { get; set; } //放映计划
public List<Ticket> SoldTickets { get; set; } //已售出电影
public Cinema()
{
Seats = new Dictionary<string, Seat>();
Schedule = new Schedule();
SoldTickets = new List<Ticket>();
}
//保存
public void Save()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("YingPianInfo.bin",FileMode.Create);
bf.Serialize(fs,SoldTickets);
fs.Close();
MessageBox.Show("保存成功");
}
//读取
public void Load()
{
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("YingPianInfo.bin", FileMode.Open);
SoldTickets = (List<Ticket>)bf.Deserialize(fs);
fs.Close();
} }

影院类

private void FrmMian_Laod(Object senber, EventArgs e)
{
InitSeatNumber(); //初始化座位号
rdoTickets.Checked = true; //选中普通票
}

窗体LOAD事件

 private void InitSeatNumber()
{
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
lbl = new Label();
lbl.BackColor = Color.Yellow;
lbl.Location = new Point( + j * , + i * );
lbl.Font = new Font("宋体",);
lbl.Name = (i + ) + "-" + (j + );
lbl.Size = new Size(,);
lbl.TabIndex = ;
lbl.TextAlign = ContentAlignment.MiddleCenter;
lbl.Text = (i + ) + "-" + (j + );
//创建一个Label事件
lbl.Click += new System.EventHandler(lblSeat_Click);
tbRoom.Controls.Add(lbl);
Seat seat = new Seat(lbl.Text,Color.Yellow);
//保存在座位集合里
cinema.Seats.Add(seat.SeatNum,seat);
}
}
}

创建座位号方法

 private void lblSeat_Click(object sender, EventArgs e)
{
if (tvMovies.Nodes.Count == )
{
MessageBox.Show("请选择电影");
return;
}
if (rdoStudent.Checked==true && txtName.Text == "")
{
MessageBox.Show("请输入增票人姓名!");
return;
}
lbl= sender as Label;
if (lbl.BackColor == Color.Red)
{
MessageBox.Show("已售出");
}
else
{
if (DialogResult.OK == MessageBox.Show("确定要购买吗?", "提示",
MessageBoxButtons.OKCancel, MessageBoxIcon.Information))
{ string time = tvMovies.SelectedNode.Text;
ScheduleItem item = cinema.Schedule.Items[time];
string type = rdoTickets.Checked ? "Ticket" : rdoFree.Checked ? "Free" : "Student";
Ticket tic = null;
switch (type)
{
case "Ticket":
tic = new Ticket(item,cinema.Seats[lbl.Text]);
break;
case "Free":
tic = new FreeTicket(item,cinema.Seats[lbl.Text],txtName.Text);
break;
case "Student":
tic = new StudentTicket(item,cinema.Seats[lbl.Text],Convert.ToInt32(cmbDisCount.Text));
break;
}
cinema.SoldTickets.Add(tic);
tic.Print();
lbl.BackColor = Color.Red;
cinema.Seats[lbl.Text].Color = Color.Red;
}
}
}

座位号单击事件

 private void 获取新放映列表ToolStripMenuItem_Click(object sender, EventArgs e)
{
BingTreeView();
}
private void BingTreeView()
{
cinema.Schedule.LoadItems(); //调用解析
TreeNode root = null;
foreach (ScheduleItem item in cinema.Schedule.Items.Values)
{
//
if (root == null || root.Text != item.Movie.MovieName)
{
//根节点
root = new TreeNode(item.Movie.MovieName);
tvMovies.Nodes.Add(root);
}
//子节点
root.Nodes.Add(item.Time);
}
}

获取新列表

 private void tvMovies_AfterSelect(object sender, TreeViewEventArgs e)
{
if (tvMovies.SelectedNode.Level == )
{
string time = tvMovies.SelectedNode.Text;
ScheduleItem item = cinema.Schedule.Items[time];
lblMovieName.Text = item.Movie.MovieName;
picMovie.Image = Image.FromFile(item.Movie.Poster);
lblDirector.Text = item.Movie.Director;
lblActor.Text = item.Movie.Actor;
lblType.Text = item.Movie.MovieType;
lblTime.Text = item.Time;
lblPrice.Text = item.Movie.Price.ToString();
lblCalcPrice.Text = "";
//将所有座位设置为黄色
foreach (Seat var in cinema.Seats.Values)
{
var.Color = Color.Yellow;
}
//用已售出票集合循环
foreach (Ticket ticlet in cinema.SoldTickets)
{
//座位集合的Value值
foreach (Seat seat in cinema.Seats.Values)
{
if (ticlet.ScheduleItem.Time == time && ticlet.Seat.SeatNum == seat.SeatNum)
{
seat.Color = Color.Red;
}
}
}
//遍历到Label上
foreach (Seat seat in cinema.Seats.Values)
{
foreach (Label label in tbRoom.Controls)
{
if (label.Text == seat.SeatNum)
{
label.BackColor = seat.Color;
}
}
} }
}

TreeView

 private void rdoTickets_CheckedChanged(object sender, EventArgs e)
{
cmbDisCount.Enabled = false;
txtName.Enabled = false;
cmbDisCount.Text = "";
txtName.Text = "";
lblCalcPrice.Text = "";
}

普通票

private void rdoFree_CheckedChanged(object sender, EventArgs e)
{
txtName.Enabled = true;
cmbDisCount.Enabled = false;
cmbDisCount.Text = "";
lblCalcPrice.Text = "";
}

增票

private void rdoStudent_checkedChanged(object sender, EventArgs e)
{
cmbDisCount.Enabled = true;
if (cmbDisCount.Text == "")
{
cmbDisCount.Text = "";
}
txtName.Enabled = false;
txtName.Text = "";
}
private void cmbDisCount_SelectedIndexChanged(object sender, EventArgs e)
{
lblCalcPrice.Text = (Convert.ToInt32(lblPrice.Text) * Convert.ToInt32(cmbDisCount.Text) / ).ToString();
}

学生票

放映计划场次

拒绝LOW ---青鸟影院购票系统的更多相关文章

  1. C#总结项目《影院售票系统》编写总结一

    C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先 ...

  2. OC-《购票系统》

    来个命令行的购票系统 --1-- 需求分析 1.1 分析 1.2 功能分析 1.3 流程分析 --2-- 原型展示 2.1 界面原型 --3-- 系统设计 3.1 类设计 3.2 框架模块设计 --4 ...

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

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

  4. java开发JSP+Servlet+bootstrap开发电影院购票系统 源码

    基于JSP+Servlet+bootstrap开发电影院购票系统:开发环境: Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+Mysql数据库 程序要求:电影院订票系统 用 ...

  5. C#编写影院售票系统(A project with a higher amount of gold )

    项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...

  6. java.io.FileNotFoundException异常,一是“拒绝访问”,二是“系统找不到指定路径”

    关于java.io.FileNotFoundException异常 因为这个异常抛出俩种情况:一是“拒绝访问”,二是“系统找不到指定路径” 这里只讲明什么时候抛拒绝访问,什么时候抛找不到指定路径. 原 ...

  7. 努力做一个优秀的programmer [ C# 影院售票系统]

    Cinema.cs类 [Serializable] // 电影院类 public class Cinema { public Cinema() { //二进制 SoldTickets = new Li ...

  8. 「影院售票系统」 · Java Swing + MySQL JDBC开发

    目录 文档说明: 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 实现代码: 一.数据库: 二.Java Swing: com.ynavc.Bea ...

  9. Objective-C 【完整OC项目-购票系统-系统分析-代码实现】

    电影院买票系统/演唱会买票系统 需求分析: 首先我们进入系统,然后会选择买电影票还是买演唱会票,所以这牵扯两个系统的合成.但是我们知道都是买票系统,所以我们可以先创建一个类,属于购买电影票和演唱会的票 ...

随机推荐

  1. ansible模块-user

    一.概述user 模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作.二.心得password参数:此参数用于指定用户的密码.但是这个密码不能是明文的密码, ...

  2. 04 JQuery的使用

    01 对网站首页优化--定时弹出广告 <!-- 作者:offline 时间:2018-09-09 描述:在使用JQ前要导入jquery-1.11.0.min.js包 注意区分js和jq的对象 - ...

  3. python利用pybind11调用PCL点云库

    2019年7月9日14:31:13 完成了一个简单的小例子,python生成点云数据,利用pybind11传给PCL显示. ubuntu 16.04 + Anaconda3  python3.6 + ...

  4. Financial Management(SDUT 1007)

    Problem Description Larry graduated this year and finally has a job. He's making a lot of money, but ...

  5. 7.19T2

    小 B 的树 题目背景及题意 小 B 有一颗树,它的形态与 OI 中的树相同,有 n 个节点,n-1 条边,每条边长度为 1 随着时间的流逝这棵树长大了,每条边有 50%的概率长度变为 2  小 B ...

  6. JVM GC之垃圾收集器

    简述 如果说收集算法时内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里我们讨论的垃圾收集器是基于JKD1.7之后的Hotspot虚拟机,这个虚拟机包含的所有收集器如图: Serial 收集 ...

  7. Spring+shiro session与线程池的坑

    在java web编程中,经常使用shiro来管理session,也确实好用 shiro来获取session的方式 SecurityUtils.getSubject().getSession() 其中 ...

  8. python中的break continue之用法

    Break break跳出循环,并且终止最小封闭循环. Continue continue跳过本次循环,继续执行下一次的循环. 二者区别就是break会终止循环,continue不终止循环.

  9. javascript实现集合Set、字典Dictionary、HashTable

    集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. function Set() { this.items = {}; } S ...

  10. R语言:实现SQL的join功能的函数

    library(dplyr) ribao <- full_join(ribao,result,by = '渠道',copy = T) ribao <- full_join(ribao,se ...