计算机网络编程24分游戏课程设计.docx
《计算机网络编程24分游戏课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络编程24分游戏课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
计算机网络编程24分游戏课程设计
软件学院
课程设计报告书
课程名称计算机网络编程
设计题目24分游戏
专业班级软件09-2班
学号0920010214
姓名王翀
指导教师
2011年12月
1设计时间1
2设计目的1
3设计任务1
4设计内容1
4.1设计内容和基本要求1
4.2实验内容2
4.3设计过程2
4.3.1总体设计2
4.3.1详细设计3
4.4程序代码及测试3
4.4.1程序清单3
4.4.2测试结果18
5总结与展望20
参考文献21
成绩评定21
1设计时间
2011年12月13日-2011年12月15日
2设计目的
(1)加深对计算机网络的基本概念和原理,以及网络编程接口Socket概念及编程原理的理解;
(2)提高学生网络应用与编程的能力。
学生在七个设计题目中选择一个,提高其分析与解决问题的能力,为大型网络编程打下坚实基础;
(3)通过撰写课程设计报告,锻炼学生的逻辑组织和语言表达能力;
(4)培养学生理论运用于实践的综合应用和设计创新能力。
3设计任务
(1)设计完成与网络应用相关题目的网络应用软件;
(2)调试运行之后,要求边演示边解释设计的思想、过程及采用的方法;
(3)完成课程设计报告。
4设计内容
4.1设计内容和基本要求
设计任务书提供设计题目供学生选择。
在指导教师同意的情况下,学生也可以自己选择感兴趣的设计题目,以调动学生参加创新设计的积极性和创造性,给学生充分的自主空间。
基本要求:
1.熟练掌握网络的基本概念和原理;
2.熟练掌握网络编程接口Socket概念及编程原理;
3.掌握基于TCP、UDP协议的编程技术;
4.掌握基于FTP协议的编程技术;
5.掌握基于SMTP、POP协议的编程技术;
6.掌握软件开发工具的使用过程及方法;
•设计工作量为完成一个中小型规模的软件和1份软件设计报告书。
•设计必须根据进度计划按期完成。
4.2实验内容
题目:
24分游戏
软件名:
24分游戏(分服务器端和客户端两部分)
功能:
游戏后台运行一个服务器软件,游戏者通过客户端程序登陆后,服务器随机产生四个1-9之间的随机数供游戏者使用,游戏者根据计算得出结果。
若计算出结果,且在规定的时间内,则从客户端输入表达式,服务器端根据客户端的表达式计算,若正确,软件提示:
“对了”,如果错了,软件提示“错了”,若超时。
软件提示“超时”。
服务器同时记录并维护一个游戏玩家的TOP10排行榜,供玩家查询。
描述:
服务器端:
接收客户端的命令请求并提供相应的服务。
客户端:
完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示,主要的命令有:
1.CONNECTIP地址端口号
指定游戏服务器的IP地址和端口号,连接到服务器。
响应:
连接成功/失败。
2.LOGIN用户名
用户登录,报告服务器玩家的名字。
响应:
成功/失败。
3.COUNT表达式
计算。
响应:
对了/错了/超时。
4.LISTTOP10
请求显示TOP10排行榜。
响应:
显示TOP10排行榜。
5.EXIT
退出游戏。
4.3设计过程
4.3.1总体设计
本实验通过客户端与服务器端两部分完成,总体需要通过TCP、UDP协议FTP协议SMTP、POP协议等完成客户端与服务器端的连接,并且能够正常登陆运行游戏。
4.3.1详细设计
客户端:
客户端需要通过上述协议完成客户端的构建,能够正确连接服务器,并且具有游戏程序,在正常登陆后能正常激活游戏程序,并且在游戏出错时报错,完成游戏人机界界面的设计,以命令的方式向服务器请求服务,并显示相应的提示,并且显示出前十的玩家的记录。
服务器端:
建立完整的服务器,能够使客户端正常登陆,显示玩家姓名及登录信息。
4.4程序代码及测试
4.4.1程序清单
客户端程序:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.IO;
usingSystem.Threading;
usingSystem.Collections;
namespaceThe24Client
{
publicpartialclassMainForm:
Form
{
privateSystem.DateTimeStartTime;
privateTcpClientclient;
privateBinaryReaderbr;
privateBinaryWriterbw;
privateboolisExit=false;
IPAddresslocalAddress;
publicMainForm()
{
InitializeComponent();
buttonExit.Enabled=false;
buttonGetNum.Enabled=false;
buttonAnswer.Enabled=false;
buttonEnter.Enabled=false;
buttonLogin.Enabled=false;
buttonGetTop10.Enabled=false;
IPAddress[]addrIP=Dns.GetHostAddresses(Dns.GetHostName());
localAddress=addrIP[0];
textBoxIP.Text=localAddress.ToString();
textBoxDuank.Text="51000";}
privatevoidbuttonConnect_Click(objectsender,EventArgse)
{
buttonLogin.Enabled=true;
buttonConnect.Enabled=false;
buttonExit.Enabled=true;
try{
client=newTcpClient(Dns.GetHostName(),51000);
listBoxInfo.Items.Add("连接成功");
}
catch
{
listBoxInfo.Items.Add("连接失败");
buttonConnect.Enabled=true;
return;
}
NetworkStreamnetworkStream=client.GetStream();
br=newBinaryReader(networkStream);
bw=newBinaryWriter(networkStream);
SendMessage("CONNECT"+textBoxIP.Text);
ThreadthreadReceive=newThread(newThreadStart(ReceiveData));
threadReceive.IsBackground=true;
threadReceive.Start();
}
privatevoidReceiveData()
{
stringreceiveString=null;
while(isExit==false)
{try
{
receiveString=br.ReadString();
}
catch
{
if(isExit==false)
{
MessageBox.Show("与服务器失去联系。
");
}
break;
}
string[]splitString=receiveString.Split(',');
stringcommand=splitString[0].ToLower();
switch(command)
{
case"CONNECT":
break;
case"LOGIN":
listBoxInfo.Items.Add("用户名上传成功");
break;
case"EXIT":
listBoxInfo.Items.Add("连接失败或与服务器断开连接");
break;
case"COUNT":
listBoxInfo.Items.Add(string.Format("[用户{0}]检查结果并上传耗时",splitString[1]));
break;
default:
listBoxInfo.Items.Add(receiveString);
break;
}
}
Application.Exit();
}
privatevoidSendMessage(stringmessage)
{
try
{
bw.Write(message);
bw.Flush();
}
catch
{
listBoxInfo.Items.Add("发送失败!
");
}
}
privatevoidbuttonLogin_Click(objectsender,EventArgse)
{
buttonGetTop10.Enabled=true;
buttonGetNum.Enabled=true;
buttonLogin.Enabled=false;
NetworkStreamnetworkStream=client.GetStream();
br=newBinaryReader(networkStream);
bw=newBinaryWriter(networkStream);
SendMessage("LOGIN,"+textBoxUserName.Text);
ThreadthreadReceive=newThread(newThreadStart(ReceiveData));
threadReceive.IsBackground=true;
threadReceive.Start();
}
privatevoidbuttonGetNum_Click(objectsender,EventArgse)
{
buttonEnter.Enabled=true;
buttonAnswer.Enabled=true;
Randomrandom=newRandom(DateTime.Now.Millisecond);
intnumb1=random.Next(1,9);
intnumb2=random.Next(1,9);
intnumb3=random.Next(1,9);
intnumb4=random.Next(1,9);
label5.Text=numb1.ToString();
label6.Text=numb2.ToString();
label7.Text=numb3.ToString();
label8.Text=numb4.ToString();
StartTime=DateTime.Now;
timer1.Enabled=true;
}
privatevoidbuttonAnswer_Click(objectsender,EventArgse)
{
this.listBox1.Items.Clear();
runter();
timer1.Enabled=false;
}
privateboolisSame(inta,intb,intc,intd)
{
if(a==b||a==c||a==d||b==c||b==d||c==d)
{
returnfalse;
}
returntrue;
}
publicintcounter(inti,intsum,intnum)
{
if(i==0)
{
returnsum+num;
}
elseif(i==1)
{
returnsum-num;
}
elseif(i==2)
{
returnsum*num;
}
else
{
floattemp=(float)sum/num;
if(num!
=0)
{
if(temp>(sum/num))
{
return-1000;
}
else
{
returnsum/num;
}
}
else
{
return-1000;
}
}
}
privatestringoperators(inti)
{
if(i==0)
{
return"+";
}
elseif(i==1)
{
return"-";
}
elseif(i==2)
{
return"×";
}
else
{
return"÷";
}
}
privatevoidrunter()
{
boolisResult=false;
int[]numb={0,0,0,0};
numb[0]=Int16.Parse(label5.Text);
numb[1]=Int16.Parse(label6.Text);
numb[2]=Int16.Parse(label7.Text);
numb[3]=Int16.Parse(label8.Text);
intcount=0;
for(inta=0;a<4;a++)
{
for(intb=0;b<4;b++)
{
for(intc=0;c<4;c++)
{
for(intd=0;d<4;d++)
{
if(this.isSame(a,b,c,d))
{//+,-,*,/,循环********
for(inta1=0;a1<4;a1++)
{
for(intb1=0;b1<4;b1++)
{
for(intc1=0;c1<4;c1++)
{
count=this.counter(c1,this.counter(b1,this.counter(a1,numb[a],numb[b]),numb[c]),numb[d]);
if(count==24)
{
listBox1.Items.Add("结果:
(("+numb[a]+operators(a1)+numb[b]+")"+operators(b1)+numb[c]+")"+operators(c1)+numb[d]+"="+count);
isResult=true;
}
count=this.counter(c1,this.counter(a1,numb[a],this.counter(b1,numb[b],numb[c])),numb[d]);
if(count==24)
{
listBox1.Items.Add("结果:
("+numb[a]+operators(a1)+"("+numb[b]+operators(b1)+numb[c]+"))"+operators(c1)+numb[d]+"="+count);
isResult=true;
}
count=this.counter(b1,this.counter(a1,numb[a],numb[b]),this.counter(c1,numb[c],numb[d]));
if(count==24)
{
listBox1.Items.Add("结果:
("+numb[a]+operators(a1)+numb[b]+")"+operators(b1)+"("+numb[c]+operators(c1)+numb[d]+")"+"="+count);
isResult=true;
}
count=this.counter(a1,numb[a],this.counter(b1,numb[b],this.counter(c1,numb[c],numb[d])));
if(count==24)
{
listBox1.Items.Add("结果:
"+numb[a]+operators(a1)+"("+numb[b]+operators(b1)+"("+numb[c]+operators(c1)+numb[d]+"))"+"="+count);
isResult=true;
}
count=this.counter(a1,numb[a],this.counter(c1,this.counter(b1,numb[b],numb[c]),numb[d]));
if(count==24)
{
listBox1.Items.Add("结果:
"+numb[a]+operators(a1)+"(("+numb[b]+operators(b1)+numb[c]+")"+operators(c1)+numb[d]+")"+"="+count);
isResult=true;
}}}}
if(!
isResult)
{
MessageBox.Show("此副牌无解");
}
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
TimeSpants=DateTime.Now-StartTime;
label12.Text=ts.Seconds.ToString();
}
}
服务器端程序:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
namespaceThe24Server
{
publicpartialclassMainForm:
Form
{
privateListuserList=newList();
IPAddresslocalAddress;
privateconstintport=51000;
privateTcpListenermyListener;
boolisNormalExit=false;
publicMainForm()
{
InitializeComponent();
listBoxStatus.HorizontalScrollbar=true;
IPAddress[]addrIP=Dns.GetHostAddresses(Dns.GetHostName());
localAddress=addrIP[0];
buttonStop.Enabled=false;
}
privatevoidbuttonStart_Click(objectsender,EventArgse)
{
myListener=newTcpListener(localAddress,port);
myListener.Start();
listBoxStatus.Items.Add(string.Format("开始在{0}:
{1}监听客户连接",localAddress,port));
ThreadmyThread=newThread(ListenClientConnect);
myThread.Start();
buttonStart.Enabled=false;
buttonStop.Enabled=true;
}
privatevoidListenClientConnect()
{
TcpClientnewClient=null;
while(true)
{
try
{
newClient=myListener.AcceptTcpClient();
}
catch
{
break;
}
Useruser=newUser(newClient);
ThreadthreadReceive=newThread(ReceiveData);
threadReceive.Start(user);
userList.Add(user);
listBoxStatus.Items.Add(string.Format("[{0}]进入",newClient.Client.RemoteEndPoint));
listBoxStatus.Items.Add(string.Format("当前连接用户数:
{0}",userList.Count));
}
}
privatevoidReceiveData(objectuserState)
{
Useruser=(User)userState;
TcpClientclient=user.client;
while(isNormalExit==false)
{
stringreceiveStr