五子棋网络应用程序开发 课程设计_五子棋的课程设计
五子棋网络应用程序开发 课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“五子棋的课程设计”。
网络应用程序开发报告概述
游戏说明
五子棋在我国的历史可谓是源远流长,喜爱它的玩家也是大有人在,是很多人的娱乐首选,也是一种竞技项目。但很多的五子棋软件一般都是单机版的,游戏无法在两个玩家之间进行。基于上述原因,五子棋作为一个古老而又有广泛群众基础的游戏,他的完善性无疑是家玩家有很大的影响在互联网迅速发展的今天,五子棋的流行已经不仅仅只是在现实生活中的面对面的娱乐竞技,在网上也已经是广大玩家的首选娱乐游戏。为适应当今社会五子棋软件化的需求,通过对一般的五子棋软件进行设计,通过本设计希望能在五子棋的软件发展上起点微不足道的推动作用。实现当今社会五子棋软件化的需求。软件设计采用visual studio2008版作为开发平台,运用软件工程的分析和编写方法,收集主要相关文献资料,对系统作详细的分析和设计,实现五子棋的基本功能需求,达到一般五子棋的游戏功能和规则设置。在设计上,主要解决的问题有五子棋的各个方向判断胜负算法的分析,以及五子棋中“聊天,重新开始”等基本功能的实现。
需求分析
一款游戏项目的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求或者是出于公司自身发展和实力的情况,其中玩家的实际需求也就是说市场需求最为重要.面对游戏拥有不同知识和理解层面的玩家,项目的负责人(或者游戏制作人)对玩家需求的理解程度,在很大程度上决定了此类游戏开发项目的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够准确,清晰以文档的形式表达给参与项目开发的每个成员,保证开发过程按照满足玩家需求为目的正确项目开发方向进行,是每游戏开发项目管理者需要面对的问题...而作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战与人人对战功能的实现,当然还有下棋过程中的下棋悔棋功能以及判断游戏的胜负等方面的要求。当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考
虑到玩家在游戏时的舒适实现
2.1 设计思路
2.2 具体实现 2.2.1 界面设计
界面主要分四大部分:棋盘、ip地址、棋子选择和聊天窗口,程序运行开始,先要输入要连接的主机ip地址,然后选定棋子颜色,就可以下棋了。输入文本的控件我选择了comboBox空间,在其下拉表中预先输入一些常用的语句,如:你好,嗨等,这样方便聊天。聊天记录窗口我用了listBox,当聊天内容比较多时,会自动添加滚动条,便于用户阅读聊天信息
2.2.2按钮功能实现
(1)重新开始按钮 public void Restart()
{
radBlack.Enabled = true;
radWhite.Enabled = true;
for(int i=0;i
for(int j = 0;j
{ pic[i, j].Image = Image.FromFile(“Board.jpg”);
flag[i, j] = false;
doubleFlag[i, j] = false;
}
this.AllowClick = true;
} private void button2_Click(object sender, EventArgs e)
{this.Restart();}(2)发送按钮
private void btnSend_Click(object sender, EventArgs e)
{ String ForeStr = “rn” + txtSelfIP + “【” + DateTime.Now.ToShortDateString()+ “ ” + DateTime.Now.ToShortTimeString()+ “】:rn”;
this.Sender.send(txtIP.Text.Trim(),txtSend.Text.Trim(), 12001);
txtShow.Text += ForeStr;
int BeforeIndex = txtShow.Text.Length;
txtShow.Text += txtSend.Text;
txtShow.Select(BeforeIndex, txtShow.Text.Length);
txtShow.SelectionBackColor = Color.White;
txtShow.SelectionColor = SelfFontColor;
//滚动
txtShow.Select(txtShow.Text.Length, 0);
txtShow.ScrollToCaret();
txtSend.Text = “”;
} 2.2.3棋子位置判断
获得所下的棋子位置的下标:
RowIndex =(p.Location.Y30)/(p.Width);判断是否有棋子添加到棋盘上,是通过Button1是否产生单击事件来判定的,在Button按钮单击事件中,编入了输赢的判断代码,结果用meagebox的形式显示出来,还有一些对不合规则下棋方法的判断及给出相应的提示
private void button1_Click(object sender, EventArgs e)
{
if(this.AllowClick)
{
this.radBlack.Enabled = false;
this.radWhite.Enabled = false;
PictureBox p =(PictureBox)sender;
p.Image = Image.FromFile(PictureFileName);
//获得所下的棋子位置的下标
RowIndex =(p.Location.Y30)/(p.Width);
String Meage;Meage = “Pos” + Splitor + RowIndex.ToString()+ Splitor + ColIndex.ToString();//发送的信息字符串
Flag[RowIndex, ColIndex] = true;
//记录
if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4())Meage += Splitor + this.WinStr;
try {
int Port = Convert.ToInt32(txtPort.Text.Trim());
if(doubleFlag[RowIndex, ColIndex])
{ pic[RowIndex, ColIndex].Image = Image.FromFile(OtherPictureFileName);MeageBox.Show(“不能在有棋子的地方下棋”, “消息”);AllowClick = true;}
else {
Sender.send(txtIP.Text.Trim(), Meage, Port);
Sender.send(txtIP.Text.Trim(), Meage, Port);
Sender.send(txtIP.Text.Trim(), Meage, Port);
Sender.send(txtIP.Text.Trim(), Meage, Port);
Sender.send(txtIP.Text.Trim(), Meage, Port);
AllowClick =false;
}
}
catch(Exception ex)
{ MeageBox.Show(ex.Meage, “错误!”);this.Restart();}
doubleFlag[RowIndex, ColIndex] = true;//双方记录
if(this.Judge1()|| this.Judge2()|| this.Judge3()|| this.Judge4())
{ this.WinCount += 1;MeageBox.Show(“胜利!胜负情况: 胜”+ WinCount.ToString()+“负”+ LoseCount.ToString(), “对战结束”);this.Restart();
} }
else
MeageBox.Show(“不能抢下棋子”); }
public Form1()
{ InitializeComponent();
for(int i = 0;i
{
for(int j = 0;j
{ pic[i, j] = new PictureBox();
pic[i, j].Click += new EventHandler(this.button1_Click);
} }
} public void StartListen()
{
while(true)
{ int Port = Convert.ToInt32(txtPort.Text.Trim());
udpclient = new UdpClient(Port);
IPEndPoint ipendpoint = new IPEndPoint(IPAddre.Any, Port);
try
{
byte[] bytes = udpclient.Receive(ref ipendpoint);
String StrReceive = “”;StrReceive = Encoding.GetEncoding(“gb2312”).GetString(bytes, 0, bytes.Length);
String[] parts = StrReceive.Split(Splitor);
if(parts[0].Equals(“Pos”))
{ ReceivedRow = Convert.ToInt32(parts[1]);
ReceivedCol = Convert.ToInt32(parts[2]);
pic[ReceivedRow,ReceivedCol].Invoke(new MyDelegate(this.InvokeFun));
doubleFlag[ReceivedRow, ReceivedCol] = true;try {if(parts[parts.Length3;h++)
{ j=h;
for(int i=0;i
{ if(flag[i,j])
{ count++;
if(count >= 5)
return true;
}
else count = 0;
}
count = 0;
}
//下三角
for(int row = 1;row
{
j = row;
for(int col = 0;col
{ if(flag[j, col])
{ count++;
if(count >= 5)return true;
}
else
count = 0;
}
count = 0;
}
return false;
}
public bool Judge4()
//左下——右上
{
int count = 0;
int h;
//上下三角
for(int c=0;c
for(int j = Level-1;j >=0;j--)
{ h = j;
for(int i = c;i =0;i++)
{ if(flag[i,h])
{
count++;
if(count >= 5)return true;
}
else
count = 0;h--;
}
count = 0;
}
return false;
}
2.27、聊天监听
public void ListenChat()
{
while(true)
{ try
{ int Port = 12001;
udpclient2 = new UdpClient(Port);
IPEndPoint ipendpoint2 = new IPEndPoint(IPAddre.Any, Port);
byte[] bytes = udpclient2.Receive(ref ipendpoint2);this.ChatMeage = Encoding.GetEncoding(“gb2312”).GetString(bytes, 0, bytes.Length);
udpclient2.Close();
txtShow.Invoke(new ChatDelegate(this.ChatInvoke));
}
catch(Exception){ udpclient2.Close();break;}
this.ChatMeage = “”;
}
} public void ChatInvoke(){ String ForeStr = “rn” + this.txtIP + “【” + DateTime.Now.ToShortDateString()+ “ ” + DateTime.Now.ToShortTimeString()+ “】:rn”;
txtShow.Text += ForeStr;//添加到聊天窗口
int Start = this.txtShow.Text.Length;
txtShow.Text += this.ChatMeage;
} 3 总结 //字体变色
txtShow.Select(Start, this.ChatMeage.Length);txtShow.SelectionColor = OtherFontColor;txtShow.SelectionBackColor = Color.White;//滚动
txtShow.Select(txtShow.Text.Length, 0);txtShow.ScrollToCaret();