总结/PSP初体验—排球计分程序1.0
要做一个排球计分程序,墨迹了很长时间才做出个的东西,过程很不爽;
功能:这个软件有两个页面,可以实现窗体A的部分变化控制窗体B的部分变化。A是操作人员使用看到的,B是投放给观众的,完全由A操控;
学到啥:对dataGridView控件纯代码添加数据有了了解;
有啥不爽:
1.感觉真的事倍功半,解决一个小问题花老长时间,一个if/else的流程对着电脑看半天也进入不了思考的状态,有个快速清晰的思路,感觉自己脑子太生锈了,不想运转;
2.还是感觉时间花太多了,好不值;
运行效果截图:
这个可以实现添加队员信息;用ado.net实现.

点击开始计分的开始比赛按钮弹出另一个窗体即showForm:
该窗体的队名、局比分、第一局,下面的dgv,时间都是可变的由记分员控制;

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

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


功能暂时介绍完了,这是两天前的,现在有个加强版,但出现了暂时无解的问题,.dll文件找不到了,估计救不回来了,回家准备再整理一遍,这个
系统还有一大堆bug,比如从计分到查询再回到计分,就会出问题;下面展示一下代码我想用最新的,虽然有无解的错误,但还是想展示下:

加减分代码如下:
//对加减分进行处理,这个方法是不是太多牵连了,最好再分几个???
,)
{ //哪队分数变化 变化的分数 不变的分数 变的局分 加或减 主或客
string teamA = cmbTeamA.Text;//主场
string teamB = cmbTeamB.Text;
)//前四局
{
)//根据a的值来判断是加或减,1为加0为减
{
score1++;
}
else { score1--; }
&& Math.Abs(score1 - score0) >= ))
{
BothDisplay();
}
else
{
juNum1++;
//要获取添加到集合中的当局比分记录,注意why选这个时间点加入
)//是主场
{
string ab = score1.ToString() + ":" + score0.ToString();
juNotes.Add(ab);
}
else
{
string ab = score0.ToString() + ":" + score1.ToString();
juNotes.Add(ab);
}
BothDisplay();//接下来应该判断是否此时分出了胜负
&& juCount == )//是3:0的胜利
{
F.txtTip.Visible = true;
F.txtTip.Text = "整场比赛结束," + team + "以 3:0 获得胜利";
MessageBox.Show("整场比赛结束," + team + "以 3:0 获得胜利");
F.txtTip.Visible = false;
//网数据库WFCount/GameNotes中插入比赛数据
, teamA, teamB, juNotes);
)
{
MessageBox.Show("赛事记录保存成功!");
}
//往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
string sql = "select * from WFCount where TName=@name";
)//是主场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamB);
, teamA, teamB, wfcW,wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
else//是客场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamA);
, teamB, teamA, wfcW, wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
}
&& juCount == )//是3:1的胜利
{
F.txtTip.Visible = true;
F.txtTip.Text = "整场比赛结束," + team + "以 3:1 获得胜利";
MessageBox.Show("整场比赛结束," + team + "以 3:1 获得胜利");
F.txtTip.Visible = false;
//调用函数进行修改
, teamA, teamB, juNotes);
)
{
MessageBox.Show("赛事记录保存成功!");
}
//往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
string sql = "select * from WFCount where TName=@name";
)//是主场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamB);
, teamA, teamB, wfcW, wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
else//是客场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamA);
, teamB, teamA, wfcW, wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
}
else//还没分出胜负,进入下一局
{
//提示观众哪队赢得消息
F.txtTip.Visible = true;
F.txtTip.Text = "第" + juCount + "局结束:\n " + team + "胜!";
//提示记分员哪队赢得当局
MessageBox.Show("第" + juCount + "局结束:\n " + team + "胜!");
F.txtTip.Visible = false;
//准备下一局
score1 = ;
score0 = ;
juCount++;
ju = "第" + juCount + "局";
BothDisplay();
//在数据库的GameNotes中修改有关每局结果的数据……,
//我想了想,还是用string数组保存每局结果好,可以用里面内容填充dtable,以便显示,还能最后一次插入DB
//麻蛋,数组好像没有add方法,所以,改用list集合来存放局记录
//juNotes.Add("");//这里又有问题了,要想以主场:客场来记录,但是,这个方法此时难判断,怎么破二者?
//想了想,再加一个参数吧,说明是主场还是客场的分数变动;这就要回去改1+4=5处; 这是设计的失误吗??
)//主场加分
{
}
}
}
}
else//是第五局
{
)//根据a的值来判断是加或减,1为加0为减
{
score1++;
}
else { score1--; }
&& Math.Abs(score1 - score0) == )
{
BothDisplay();
F.Visible = true;
F.txtTip.Text = "比赛结束:\n " + team + "胜!";
MessageBox.Show("比赛结束:\n " + team + "胜!");
F.txtTip.Visible = false;
//往数据库中插入数据,实际上是修改啊……
//要获取添加到集合中的当局比分记录,注意why选这个时间点加入
)//是主场
{
string ab = score1.ToString() + ":" + score0.ToString();
juNotes.Add(ab);
}
else
{
string ab = score0.ToString() + ":" + score1.ToString();
juNotes.Add(ab);
}
//调用函数进行修改,UpdateGameNotes(params list<string> vsr)
,teamA,teamB,juNotes);
)
{
MessageBox.Show("赛事记录保存成功!");
}
//往WFCount表中修改数据前的准备工作,先查,方便+1或-1后修改;
string sql = "select * from WFCount where TName=@name";
)//是主场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamA);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamB);
, teamA, teamB, wfcW, wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
else//是客场胜利
{
WFCount wfcW = action.GetWFCData(sql, teamB);//获取胜队的记录
WFCount wfcF = action.GetWFCData(sql, teamA);
, teamB, teamA, wfcW, wfcF);
)
{
MessageBox.Show("已经对双方的积分完成了统计与更新!");
}
}
}
else
{
BothDisplay();
}
}
}
private void btnAddA_Click(object sender, EventArgs e)
{
string teamA = cmbTeamA.SelectedItem.ToString();
string teamB = cmbTeamB.SelectedItem.ToString();
ScoreDeal(teamA, ,);
}
private void btnAddB_Click(object sender, EventArgs e)
{
string teamA = cmbTeamA.SelectedItem.ToString();
string teamB = cmbTeamB.SelectedItem.ToString();
ScoreDeal(teamB, ,);
}
private void btnSubA_Click(object sender, EventArgs e)
{
string teamA = cmbTeamA.SelectedItem.ToString();
string teamB = cmbTeamB.SelectedItem.ToString();
ScoreDeal(teamA, ,);
}
private void btnSubB_Click(object sender, EventArgs e)
{
string teamA = cmbTeamA.SelectedItem.ToString();
string teamB = cmbTeamB.SelectedItem.ToString();
ScoreDeal(teamB, ,);
}
一些相关的方法:
showForm F = null;
private void ShowScoreOnF()
{
if (F == null || F.IsDisposed) //如果窗体从未打开或打开后又关闭;
{
F = new showForm();
}
string[] biFen = { cmbTeamA.Text,cmbTeamB.Text,ju,
juANum.ToString(),juBNum.ToString(),
scoreA.ToString(),scoreB.ToString()};
//为什么上面的cmbTeamA.Text是可以用的,但在方法外就不可以用了???????
F.DisplayScore(biFen);
F.Show();
}
private void BothDisplay()
{
//初始化记分员页面的控件值
gBoxNowResult.Text = ju;
juA.Text = juANum.ToString();
juB.Text = juBNum.ToString();
SA.Text = scoreA.ToString();
SB.Text = scoreB.ToString();
//调用函数打开观众的界面并改变页面相关数据
ShowScoreOnF();
}
public partial class showForm : Form
{
public static showForm SF = new showForm();
public showForm()
{
InitializeComponent();
SF = this;
}
/// <summary>
/// 根据传送过来的数组定义各比分相关控件的显示内容
/// </summary>
/// <param name="scoreNow"></param>
public void DisplayScore(params string[] scoreNow)
{
];
];
];
];
];
];
];
}
private void showForm_Load(object sender, EventArgs e)
{
//设置窗体的位置
, ); //等价于: form1.Left=0; form1.Right=0;
//设置窗体的背景图像.这里放在bin目录的debug里
//this.BackgroundImage = Image.FromFile(@"wuli允儿.jpg");
////设置窗体的大小为背景图片的大小
//this.Size = new Size(600,852);
txtTip.Visible = false;
}
//定义显示时间的函数,只是被调用
public void DisplayTime(string t)
{
this.lblTime.Text = t;
}
}
有关dgv的代码:
private void btnSelect_Click(object sender, EventArgs e)
{
int teamIndex = cmbTeam.SelectedIndex;
int memberIndex = cmbMember.SelectedIndex;
string team = cmbTeam.SelectedItem.ToString();
string member = cmbMember.SelectedItem.ToString();
DataTable dt=action.SelectInfo(teamIndex, memberIndex, team, member);
//dataGridView1.DataSource = dt;
//上句可以直接将dt显示到dgv;最简单直接的,不过列名可能不理想;
if (F != null)
{
F.txtTip.Visible = false;
}
dataGridView1.Columns.Clear();//清空列
F.dgv1.Columns.Clear();
string[] arr团队 = { "ID", "队名", "胜场", "负场", "积分", "胜局", "负局", "3-0", "3-1", "3-2", "2-3", "1-3", "0-3" };
string[] arr队员信息 = { "ID","姓名","队伍","球衣号","位置","体重","身高","年龄","外号","特长"};
string[] arr赛事记录 = {"ID","主场","客场","比赛时间","第一局","第二局","第三局","第四局","第五局","地点" };
;
foreach (DataColumn column in dt.Columns)
{
)//是WFCcount的表
{
//为datagridview添加列,第一个参数是列名,第二个参数是列标题
dataGridView1.Columns.Add(column.ColumnName, arr团队[i]);
F.dgv1.Columns.Add(column.ColumnName, arr团队[i]);
i++;
}
)//是队员信息Members的表
{
dataGridView1.Columns.Add(column.ColumnName, arr队员信息[i]);
F.dgv1.Columns.Add(column.ColumnName, arr队员信息[i]);
i++;
}
else//有问题,目前不影响运行
{
dataGridView1.Columns.Add(column.ColumnName, arr赛事记录[i]);
F.dgv1.Columns.Add(column.ColumnName, arr赛事记录[i]);
i++;
}
}
dataGridView1.Rows.Clear();//清空行
F.dgv1.Rows.Clear();
foreach (DataRow line in dt.Rows)
{
//因为列已经一致了,所以直接将datatable的行转成数组就可以添加到datagridview中了
dataGridView1.Rows.Add(line.ItemArray);
F.dgv1.Rows.Add(line.ItemArray);
}
dataGridView1.Columns["ID"].Visible = false;
F.dgv1.Columns["ID"].Visible = false;
}
还有太多代码,这里就不贴贴多了,希望考试能及格。
这是我遇到的暂时无解的问题:文件夹为空啊,不值按住了啥,.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的更多相关文章
- PSP初体验:求交点
项目 内容 课程:北航2020春软件工程 博客园班级博客 作业:完成一个平面图形求交点的程序,体验PSP的过程 个人项目作业 我在这个课程的目标是 体验软件开发的全流程 这个作业在哪个具体方面帮助我实 ...
- websocket初体验(小程序)
之前上个公司做过一个二维码付款功能,涉及到websocket功能,直接上代码 小程序onShow方法下加载: /** 页面的初始数据 **/ data: { code: "", o ...
- MVC实战之排球计分(八)——软件制作总结
此系列博客目的是制作一款排球计分程序.这系列博客将讲述此软件的 各个功能的设计与实现.到这篇博客,此系列博客就算是结束了. 在最后的这篇博客里 我们来做一些总结. 一,制作此程序,我们使用的是MVC框 ...
- MVC实战之排球计分(七)——软件的具体实现与测试
在前面的几篇博客中咱们已经写过了软件的大概实现,在这篇博客中将讲述此软件的具体实现与测试. 1,新建一个项目,命名为:Volleyball,选择基本模板.如图: 点击确定.创建项目. 2,右键单击mo ...
- MVC实战之排球计分(一)—— 需求分析与数据库设计
此系列博客目的是制作一款排球计分程序.这系列博客讲讲述此软件的 各个功能的设计与实现. 一.需求分析: 这个程序是排球计分程序,其业务非常简单,具体如下: 1.本程序可以选择用户身份,通过不同角度记录 ...
- 【尝新】微信小程序初体验
文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小d ...
- iOS7初体验(1)——第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File ...
- wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- 微信小程序初体验,入门练手项目--通讯录,部署上线(二)
接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...
随机推荐
- 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket
这是一个精练的客户端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxClientSocket的使用如下(以某个叫做CSo ...
- JQuery实现方法,简单示例
function $() { var elements = new Array(); for (var i = 0; i < arguments.length; i++) { var eleme ...
- 键盘事件触发的兼容tips
在firefox中 退格键 enter del tab 这些非字符触发编码为0 然而在Safari3以下 是8
- JS笔记一
最近有时间,觉得应该整理一下,额,就从很久之前的基础开始吧,正好也巩固下,菜鸟需要扎实基础. 下面是一个简单的调查表,因为没有写任何样式,所以就是简单的表单输入框之类的.选择“男”或者“女”时,会出现 ...
- 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)
虽然网上类似甚至相同的案例有很多,但是我还是写下,以记下笔记,也可供大家参考 希望大家可以指导批评~~ 首先我们以列表ul li 来开始我们菜单也可以说导航条的制作: 在页面中我们首先构建以下XHTM ...
- New library for Matlab - test
Thanks http://www.matlabsky.com/thread-120-1-1.html Install directory $MatlabRoot\toolbox or >&g ...
- 现在web前端这么火,钱景怎么样啊?
web前端开发工程师可以说是一个全新的职业,在IT整个行业中真正受到重视的时间没有超过5年,也正因为这样,大家越来越想了解web前端工程师的前景究竟怎么样? web前端培训就业前景如何?web前端工程 ...
- SpringMVC操作指南-整合Spring、SpringMVC、MyBatis、Log4j/Log4j2及JUnit4搭建项目框架
- Android studio 出现 Unsupported major.minor version 52.0
参考资料:http://blog.csdn.net/fakine/article/details/51241202 最近更新了Android studio 之后,出现了Error:java.lang. ...
- (转载)solr时区问题解决方案
solr默认的使用的是utc格林尼治时间,与我们的GMT+8相差8个小时,网上好多解决办法是在自己应用中的时间上加8个小时和减8个小时做变换:或者不用date类型,改为long. 个人感觉这两个办法都 ...