首页 > 代码库 > 总结/PSP初体验—排球计分程序1.0

总结/PSP初体验—排球计分程序1.0

要做一个排球计分程序,墨迹了很长时间才做出个的东西,过程很不爽;

功能:这个软件有两个页面,可以实现窗体A的部分变化控制窗体B的部分变化。A是操作人员使用看到的,B是投放给观众的,完全由A操控;

学到啥:对dataGridView控件纯代码添加数据有了了解;

有啥不爽:

  1.感觉真的事倍功半,解决一个小问题花老长时间,一个if/else的流程对着电脑看半天也进入不了思考的状态,有个快速清晰的思路,感觉自己脑子太生锈了,不想运转;

  2.还是感觉时间花太多了,好不值;

运行效果截图:

这个可以实现添加队员信息;用ado.net实现.

技术分享

 

点击开始计分的开始比赛按钮弹出另一个窗体即showForm:

该窗体的队名、局比分、第一局,下面的dgv,时间都是可变的由记分员控制;

技术分享

 

点击显示tip可以控制showForm弹出计分页面输入的信息:

技术分享

 

点击查询,根据选择可以查询队伍信息和队员信息,这个只用代码往dgv上显示数据,这个让我了解了datatable的一些用法:

技术分享

 

 

技术分享

功能暂时介绍完了,这是两天前的,现在有个加强版,但出现了暂时无解的问题,.dll文件找不到了,估计救不回来了,回家准备再整理一遍,这个

系统还有一大堆bug,比如从计分到查询再回到计分,就会出问题;下面展示一下代码我想用最新的,虽然有无解的错误,但还是想展示下:

技术分享

 

加减分代码如下:

技术分享
  1         //对加减分进行处理,这个方法是不是太多牵连了,最好再分几个???
  2         private void ScoreDeal(string team, ref int score1, int score0, ref int juNum1,int a=1,int who=1)
  3         {                   //哪队分数变化       变化的分数   不变的分数     变的局分   加或减    主或客
  4 
  5             string teamA = cmbTeamA.Text;//主场
  6             string teamB = cmbTeamB.Text;
  7             if (juCount < 5)//前四局
  8             {
  9                 if (a == 1)//根据a的值来判断是加或减,1为加0为减
 10                 {
 11                     score1++;
 12                 }
 13                 else { score1--; }
 14                 
 15                 if (!(score1 > 24 && Math.Abs(score1 - score0) >= 2))
 16                 {
 17                     BothDisplay();
 18                 }
 19                 else
 20                 {
 21                     juNum1++;
 22 
 23                     //要获取添加到集合中的当局比分记录,注意why选这个时间点加入
 24                     if (who == 1)//是主场
 25                     {
 26                         string ab = score1.ToString() + ":" + score0.ToString();
 27                         juNotes.Add(ab);
 28                     }
 29                     else
 30                     {
 31                         string ab = score0.ToString() + ":" + score1.ToString();
 32                         juNotes.Add(ab);
 33                     }
 34 
 35                     BothDisplay();//接下来应该判断是否此时分出了胜负
 36 
 37                     if (juNum1 == 3 && juCount == 2)//是3:0的胜利
 38                     {
 39                         F.txtTip.Visible = true;
 40                         F.txtTip.Text = "整场比赛结束," + team + "以 3:0 获得胜利";
 41                         MessageBox.Show("整场比赛结束," + team + "以 3:0 获得胜利");
 42                         F.txtTip.Visible = false;
 43 
 44                         //网数据库WFCount/GameNotes中插入比赛数据
 45                         int f = action.UpdateGameNotes(3, teamA, teamB, juNotes);
 46                         if (f == 1)
 47                         {
 48                             MessageBox.Show("赛事记录保存成功!");
 49                         }
 50                         //往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
 51                         string sql = "select * from WFCount where TName=@name";
 52                         if (who == 1)//是主场胜利
 53                         {
 54                             WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
 55                             WFCount wfcF = action.GetWFCData(sql, teamB);
 56                             int mama = action.UpdateWFCount(3, teamA, teamB, wfcW,wfcF);
 57                             if (mama == 1)
 58                             {
 59                                 MessageBox.Show("已经对双方的积分完成了统计与更新!");
 60                             }
 61                         }
 62                         else//是客场胜利
 63                         {
 64                             WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
 65                             WFCount wfcF = action.GetWFCData(sql, teamA);
 66                             int mama = action.UpdateWFCount(3, teamB, teamA, wfcW, wfcF);
 67                             if (mama == 1)
 68                             {
 69                                 MessageBox.Show("已经对双方的积分完成了统计与更新!");
 70                             }
 71                         }
 72                         
 73 
 74 
 75                         
 76                     }
 77                     else if (juNum1 == 3 && juCount == 3)//是3:1的胜利
 78                     {
 79                         F.txtTip.Visible = true;
 80                         F.txtTip.Text = "整场比赛结束," + team + "以 3:1 获得胜利";
 81                         MessageBox.Show("整场比赛结束," + team + "以 3:1 获得胜利");
 82                         F.txtTip.Visible = false;
 83 
 84                         //调用函数进行修改
 85                         int f = action.UpdateGameNotes(4, teamA, teamB, juNotes);
 86                         if (f == 1)
 87                         {
 88                             MessageBox.Show("赛事记录保存成功!");
 89                         }
 90 
 91                         //往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
 92                         string sql = "select * from WFCount where TName=@name";
 93                         if (who == 1)//是主场胜利
 94                         {
 95                             WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
 96                             WFCount wfcF = action.GetWFCData(sql, teamB);
 97                             int mama = action.UpdateWFCount(4, teamA, teamB, wfcW, wfcF);
 98                             if (mama == 1)
 99                             {
100                                 MessageBox.Show("已经对双方的积分完成了统计与更新!");
101                             }
102                         }
103                         else//是客场胜利
104                         {
105                             WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
106                             WFCount wfcF = action.GetWFCData(sql, teamA);
107                             int mama = action.UpdateWFCount(4, teamB, teamA, wfcW, wfcF);
108                             if (mama == 1)
109                             {
110                                 MessageBox.Show("已经对双方的积分完成了统计与更新!");
111                             }
112                         }
113                     }
114                     else//还没分出胜负,进入下一局
115                     {
116                         //提示观众哪队赢得消息
117                         F.txtTip.Visible = true;
118                         F.txtTip.Text = "" + juCount + "局结束:\n " + team + "胜!";
119                         //提示记分员哪队赢得当局
120                         MessageBox.Show("" + juCount + "局结束:\n " + team + "胜!");
121                         F.txtTip.Visible = false;
122 
123 
124                         //准备下一局
125                         score1 = 0;
126                         score0 = 0;
127                         juCount++;
128                         ju = "" + juCount + "";
129                         BothDisplay();
130                         //在数据库的GameNotes中修改有关每局结果的数据……,
131                         //我想了想,还是用string数组保存每局结果好,可以用里面内容填充dtable,以便显示,还能最后一次插入DB
132                         //麻蛋,数组好像没有add方法,所以,改用list集合来存放局记录
133                         //juNotes.Add("");//这里又有问题了,要想以主场:客场来记录,但是,这个方法此时难判断,怎么破二者?
134                         //想了想,再加一个参数吧,说明是主场还是客场的分数变动;这就要回去改1+4=5处;  这是设计的失误吗??
135                         if (who == 1)//主场加分
136                         { 
137                             
138                         }
139                     }
140                     
141                 }
142             }
143             else//是第五局
144             {
145                 if (a == 1)//根据a的值来判断是加或减,1为加0为减
146                 {
147                     score1++;
148                 }
149                 else { score1--; }
150                 if (score1 >= 15 && Math.Abs(score1 - score0) == 2)
151                 {
152                     BothDisplay();
153                     F.Visible = true;
154                     F.txtTip.Text = "比赛结束:\n " + team + "胜!";
155                     MessageBox.Show("比赛结束:\n " + team + "胜!");
156                     F.txtTip.Visible = false;
157 
158                     //往数据库中插入数据,实际上是修改啊……
159                     //要获取添加到集合中的当局比分记录,注意why选这个时间点加入
160                     if (who == 1)//是主场
161                     {
162                         string ab = score1.ToString() + ":" + score0.ToString();
163                         juNotes.Add(ab);
164                     }
165                     else
166                     {
167                         string ab = score0.ToString() + ":" + score1.ToString();
168                         juNotes.Add(ab);
169                     }
170                     //调用函数进行修改,UpdateGameNotes(params list<string> vsr)
171                     int f=action.UpdateGameNotes(5,teamA,teamB,juNotes);
172                     if (f==1)
173                     {
174                         MessageBox.Show("赛事记录保存成功!");
175                     }
176 
177                     //往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
178                     string sql = "select * from WFCount where TName=@name";
179                     if (who == 1)//是主场胜利
180                     {
181                         WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
182                         WFCount wfcF = action.GetWFCData(sql, teamB);
183                         int mama = action.UpdateWFCount(3, teamA, teamB, wfcW, wfcF);
184                         if (mama == 1)
185                         {
186                             MessageBox.Show("已经对双方的积分完成了统计与更新!");
187                         }
188                     }
189                     else//是客场胜利
190                     {
191                         WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
192                         WFCount wfcF = action.GetWFCData(sql, teamA);
193                         int mama = action.UpdateWFCount(3, teamB, teamA, wfcW, wfcF);
194                         if (mama == 1)
195                         {
196                             MessageBox.Show("已经对双方的积分完成了统计与更新!");
197                         }
198                     }
199                 }
200                 else
201                 {
202                     BothDisplay();
203                 }
204 
205             }   
206         }
207         private void btnAddA_Click(object sender, EventArgs e)
208         {
209             string teamA = cmbTeamA.SelectedItem.ToString();
210             string teamB = cmbTeamB.SelectedItem.ToString();
211             ScoreDeal(teamA, ref scoreA, scoreB, ref juANum,1,1);
212         }
213         private void btnAddB_Click(object sender, EventArgs e)
214         {
215             string teamA = cmbTeamA.SelectedItem.ToString();
216             string teamB = cmbTeamB.SelectedItem.ToString();
217             ScoreDeal(teamB, ref scoreB, scoreA, ref juBNum,1,0);
218         }
219         private void btnSubA_Click(object sender, EventArgs e)
220         {
221             string teamA = cmbTeamA.SelectedItem.ToString();
222             string teamB = cmbTeamB.SelectedItem.ToString();
223 
224             ScoreDeal(teamA, ref scoreA, scoreB, ref juANum,0,1);
225         }
226         private void btnSubB_Click(object sender, EventArgs e)
227         {
228             string teamA = cmbTeamA.SelectedItem.ToString();
229             string teamB = cmbTeamB.SelectedItem.ToString();
230 
231             ScoreDeal(teamB, ref scoreB, scoreA, ref juBNum,0,0);
232         }
View Code

 一些相关的方法:

技术分享
 1         showForm F = null;
 2         private void ShowScoreOnF()
 3         {
 4 
 5             if (F == null || F.IsDisposed) //如果窗体从未打开或打开后又关闭;
 6             {
 7                 F = new showForm();
 8             }
 9             string[] biFen = { cmbTeamA.Text,cmbTeamB.Text,ju,
10                                  juANum.ToString(),juBNum.ToString(),
11                                  scoreA.ToString(),scoreB.ToString()};
12             //为什么上面的cmbTeamA.Text是可以用的,但在方法外就不可以用了???????
13             F.DisplayScore(biFen);
14 
15             F.Show();
16         }
17         private void BothDisplay()
18         {
19             //初始化记分员页面的控件值
20             gBoxNowResult.Text = ju;
21             juA.Text = juANum.ToString();
22             juB.Text = juBNum.ToString();
23             SA.Text = scoreA.ToString();
24             SB.Text = scoreB.ToString();
25             //调用函数打开观众的界面并改变页面相关数据
26             ShowScoreOnF();
27         }
View Code
技术分享
 1     public partial class showForm : Form
 2     {
 3         public static showForm SF = new showForm();
 4         public showForm()
 5         {
 6             InitializeComponent();
 7             SF = this;
 8         }
 9 
10         /// <summary>
11         /// 根据传送过来的数组定义各比分相关控件的显示内容
12         /// </summary>
13         /// <param name="scoreNow"></param>
14         public void DisplayScore(params string[] scoreNow)
15         {
16             this.lblTeamA.Text = scoreNow[0];
17             this.lblTeamB.Text = scoreNow[1];
18             this.gBoxNowResult.Text = scoreNow[2];
19             this.juA.Text = scoreNow[3];
20             this.juB.Text = scoreNow[4];
21             this.SA.Text = scoreNow[5];
22             this.SB.Text = scoreNow[6];
23         }
24 
25 
26         private void showForm_Load(object sender, EventArgs e)
27         {
28             //设置窗体的位置
29             this.Location = new Point(0, 0); //等价于: form1.Left=0; form1.Right=0;
30             //设置窗体的背景图像.这里放在bin目录的debug里
31             //this.BackgroundImage = Image.FromFile(@"wuli允儿.jpg");
32             ////设置窗体的大小为背景图片的大小 
33             //this.Size = new Size(600,852);
34             txtTip.Visible = false;
35         }
36 
37         //定义显示时间的函数,只是被调用
38         public void DisplayTime(string t)
39         {
40             this.lblTime.Text = t;
41         }
42 
43     }
View Code

 有关dgv的代码:

技术分享
 1         private void btnSelect_Click(object sender, EventArgs e)
 2         {
 3             int teamIndex = cmbTeam.SelectedIndex;
 4             int memberIndex = cmbMember.SelectedIndex;
 5             string team = cmbTeam.SelectedItem.ToString();
 6             string member = cmbMember.SelectedItem.ToString();
 7             DataTable dt=action.SelectInfo(teamIndex, memberIndex, team, member);
 8             //dataGridView1.DataSource = dt;
 9                 //上句可以直接将dt显示到dgv;最简单直接的,不过列名可能不理想;
10             if (F != null)
11             {
12                 F.txtTip.Visible = false;
13             }
14             dataGridView1.Columns.Clear();//清空列
15             F.dgv1.Columns.Clear();
16             string[] arr团队 = { "ID", "队名", "胜场", "负场", "积分", "胜局", "负局", "3-0", "3-1", "3-2", "2-3", "1-3", "0-3" };
17             string[] arr队员信息 = { "ID","姓名","队伍","球衣号","位置","体重","身高","年龄","外号","特长"};
18            
19             string[] arr赛事记录 = {"ID","主场","客场","比赛时间","第一局","第二局","第三局","第四局","第五局","地点" };
20             
21             int i = 0;
22                 foreach (DataColumn column in dt.Columns)
23                 {
24                     if (dt.Columns.Count == 13)//是WFCcount的表
25                     {
26                         //为datagridview添加列,第一个参数是列名,第二个参数是列标题
27                         dataGridView1.Columns.Add(column.ColumnName, arr团队[i]);
28                         F.dgv1.Columns.Add(column.ColumnName, arr团队[i]);
29                         i++;
30                     }
31 
32 
33                     else if (dt.Columns.Count == 10)//是队员信息Members的表
34                     {
35                         dataGridView1.Columns.Add(column.ColumnName, arr队员信息[i]);
36                         F.dgv1.Columns.Add(column.ColumnName, arr队员信息[i]);
37                         i++;
38                     }
39                     else//有问题,目前不影响运行
40                     {
41                         dataGridView1.Columns.Add(column.ColumnName, arr赛事记录[i]);
42                         F.dgv1.Columns.Add(column.ColumnName, arr赛事记录[i]);
43                         i++;
44                     }
45                 }
46             dataGridView1.Rows.Clear();//清空行
47             F.dgv1.Rows.Clear();
48             foreach (DataRow line in dt.Rows)
49             {
50                 //因为列已经一致了,所以直接将datatable的行转成数组就可以添加到datagridview中了
51                 dataGridView1.Rows.Add(line.ItemArray);
52                 F.dgv1.Rows.Add(line.ItemArray);
53             }
54             dataGridView1.Columns["ID"].Visible = false;
55             F.dgv1.Columns["ID"].Visible = false;
56 
57             
58         }
View Code

还有太多代码,这里就不贴贴多了,希望考试能及格。

这是我遇到的暂时无解的问题:文件夹为空啊,不值按住了啥,.dll文件找不到了啊啊啊~~~~

技术分享

 

 这个程序基本回报完毕。希往不要挂啊。

 

回顾一下流程:

 1.估计时间:全部没用一点用处,都远远超出了自己的设定;

2.需求分析:这个做的不好,不够细;其中一个是这样写的:  

观众:我希望软件可以显示两队的队名,分数,以及分数变化时,可以明显显示是哪队得分了,以便我了解比赛的基本状况;我也希望能够知道自己喜爱的队伍信息以及队员的表现,了解对方的队员的集体信息以及个人的特长,以便更好的充当一名爱好排球的忠实粉丝.

3.设计文档:

  我先把各个用户故事的需求简单罗列出来,再把重复的和自己实现不了的划掉,得到用户期望的,并且我应该可以实现的要求;

  然后我用图纸和笔,画了大概的窗体界面,并标注了控件名;此期间我又设计了数据表的结构;现在想想数据表才是灵魂一样的存在,

  然后我想,该编码了吧;然后去巧代码,我先以注释的方式编写了实现某一功能的思路、期间设计好了方法签名,就是除去花括号的部分;

  接下来,不爽的就是解决可能遇到的技术问题;我没先填充那些未完的方法思路,先去查了并打开另一个平台拖控件写代码验证。这是最花时间的。真感觉不值。

  技术难题解决后,我就开始充实代码,其中最耗时间的麻烦就是脑子卡壳,运转不灵,也许是对着电脑时间太长了;像现在回想起来挺简单的if/else部分,当时耗在这上面的时间真不少,我感觉是的。

4.设计复审:没心情,几乎跳过了;

5:代码规范:
a.  类型名称,类中的方法、属性、公共字段全部首字母大写;
b.  局部变量和形参用Camel大小写法,第一个单词除外的每个单词首字母大写;
c.  private和protected字段用以下划线开头的Camel大小写;
d.  单词不会写用拼音时,全部用平舌音;

  这是以前看教程时记录的,正好粘贴过来;我在编码时有想到这些,但肯定有没注意的;

5.具体设计:也许这一步就是要精确自己的思路,即真正的做到胸有成竹。甚至预想到用到的一个字段;

  也许:这一步要求设计出用到的类,方法的签名;而设计文档即第三步只是要求设计出效果图,搞清楚事件的响应。也许用到PS,数据表的设计,我感觉应该在效果图的设计中弄出来; 也许 3.设计文档这个步骤就是制定出效果的demo,理清流程。而 4.具体设计,则是类和方法的设计包括调用关系;

6.具体编码:这个的时间是跟需求分析和设计文档所花的时间成反比的;

7.代码复审:这一步应该是优化代码,我是边写代码边复审的,我现在体会的这步作用是增加复用。我反正没有写完后再看一遍,还有其他未完成的事,,短时间内自己真没心情再看了。

8.测试:测试好啊,F9/F5/F11再百度再F5……,爽的不要不要的;

9.测试报告:据说要记录测试用例和结果,还有修改记录;我没做这个,没体会到用处。也许可以记录自己解决不了的问题吧,或有待解决优化的问题吧;

10.计算工作量:几十个小时。好不值啊。

11.总结:白管来,买书看,系统的学花费时间少些,我试试;不然不懂去一个一个查,太不爽。因为查到满意答案多不顺利,即使有用也得花费时间实验。不爽,太耗时间,我以为买些书可能好一点,也靠谱一点。

 

技术分享

总之还是没严格按流程走,倒是巩固了学过的知识;还应该多做些程序项目多想想先后顺序,还得复习sql知识,嗯,加油!

  

总结/PSP初体验—排球计分程序1.0