首页 > 代码库 > 总结/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 }
一些相关的方法:
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 }
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 }
有关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 }
还有太多代码,这里就不贴贴多了,希望考试能及格。
这是我遇到的暂时无解的问题:文件夹为空啊,不值按住了啥,.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