网络对战五子棋系统设计

更新时间:2024-03-28 07:08:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

河北农业大学 本科毕业论文(设计)

题 目: 网络对战五子棋

摘要

五子棋游戏以其优秀的人工智能深受广大玩家的喜爱,而对于初步探究网络编成的编程爱好者来说,编制五子棋程序因其规则简单而大受欢迎,然而它却要求程序员对五子棋规则有相当深入的了解。程序员考虑得越周到,其五子棋程序就越智能。

五子棋游戏软件设计的主要内容是:根据五子棋的基本规则,要让对方客户端知道该在哪一点下子,就要根据盘面的形势,并把棋盘棋子的重新绘制绘制,也就是更新该点的位置,然后再通过监听网络传递的消息,直到新的位置放在棋盘的什么位置上,在进行修改,并通过计算,得出玩家是否获得胜利.,因此玩家就能反复的进行联机游戏。

本文论述了采用联机对战的方式体现出五子棋程序的分析与设计,并采用面向对象的开发工具C#来具体实现。

关键字:Socket ;C/S;五子棋;网络对弈;C#

Abstract

Gobang game with excellent artificial intelligence by the vast number

of players who, for the initial research network organization programming enthusiasts, Gobang procedures for the preparation of the rules simple and popular, but it requires programmer to Gobang game has a deep understanding of the rules. Other thoughtful consideration they treat their Gobang game procedures more wisdom.

Gobang game software design is the main content: According Gobang basic rules to know each other's customers - in violation of the West, we must under Permian situation, and the board pawn re-mapping mapping, that is updating the point position, and then through the monitoring network news until the new location on the board what position, Following changes, and through the calculation, resulting in players is victory. , the on-line game players can repeatedly.

This article discusses the use of on-line way reflect those Gobang procedures analysis and design, object-oriented development tools and the adoption of specific C# to achieve.

Key Words : Socket; C/S; Gobang; play chess on network,C#

目 录

1绪论 .................................................................. 4

1.1选题背景和意义 ................................................... 4

1.2国内外研究现状和发展趋势 ......................................... 4 1.3 研究内容与目标 .................................................. 5 2相关理论与技术 ........................................................ 6 2.1五子棋简介 ....................................................... 6 2.2相关技术简介 ..................................................... 6

2.2.1 C/S体系结构 ............................................... 6 2.2.2 SOCKET简介 ................................................ 7 2.2.3 面向对象的理论知识 ......................................... 9 2.2.4 C#.NET 相关知识介绍 ........................................ 9 3系统的分析与设计 ..................................................... 10 3.1需求分析 ........................................................ 10 3.2 功能分析 ....................................................... 10 3.3运行环境 ........................................................ 11 4系统的实现 ........................................................... 11

4.1概要设计 ........................................................ 11 4.2流程图 ......................................................... 12

4.3程序详细设计 .................................................... 13 5总结 ................................................................. 30 致谢 .................................................................... 1 参考文献 ................................................................ 1

1绪论

1.1选题背景和意义

五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。

五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。

五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜),于1688年至1704年的日本元禄时代传到日本的。到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899年规定,禁止黑白双方走“双三”;1903年规定,只禁止黑方走“双三”;1912年规定,黑方被迫走“双三”亦算输;1916年规定,黑方不许走“长连”;1918年规定,黑方不许走“四、三、三”;1931年规定,黑方不许走“双四”,并规定将19×19的围棋盘改为15×15的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。

1.2国内外研究现状和发展趋势

电脑游戏行业经过二十年的发展,已经成为与影视、音乐等并驾齐驱的全球最重要的娱乐产业之一,其年销售额超过好莱坞的全年收入。互联网的出现为电脑游戏行业发展注入了新的活力,凭借信息双向交流、速度快、不受空间限制等优势,让真人参与游戏,提高了游戏的互动性、仿真性和竞技性,使玩家在虚拟世界里可以发挥现实世界无法展现的潜能,改变了单机版游戏固定、呆板、与机器对话的状况。网络游戏的这些优势不仅使其在电脑游戏行业中异军突起并在某种程度上取代了单机版游戏,而且成为网络业三大(网上金融、网上教育和网络游戏)赢利且利润优厚的领域之一。

网络作为一种新兴的传播方式,主要包括三大内容:娱乐、资讯、通讯。提到网络娱乐,过去主要指的是单机版游戏,没有引入网络的概念[2]但随着科技的发展,游戏娱乐产业也在成长[3]目前,国内的游戏娱乐产业正处于起步阶段,特点表现为:第一,它是一种文化的传播。娱乐产业可以潜移默化地改变人的观念,当前,很多多媒体的播放已被电脑网络所取代[4]。第二,网络游戏加强了人与人的沟通。第三,网络游戏具有一定的教育意义[5]。网络游戏所具有的角色扮演的功能,使得玩家能通过互助更好地完成游戏中的各项任务。网络无国界,游戏在网络文化产业世界的发展中地位会越来越高。

目前在国外,休闲游戏如棋类等,玩家的年龄跨度非常大,这和我国目前网游市场以青少年为主要消费人群的状况截然不同[7]。其实,网络可以解决空间的问题,网络和生活越来越息息相关,因此,开辟适合各个年龄层的游戏产品迫在眉睫。同时,这也涉及到一个企业开发的能力。娱乐产业发展到一定程度,通过不断锻炼和经验的积累,完全可以通过融入娱乐的成分把教条的东西深入浅出地展现给消费者 。

就国内的发展来看,最近這两三年内国内的游戏公司如雨后春笋般的成立,所開發或代理的网络游戏更是不胜枚举。以全球游戏业界的发展来看,這几年韩国的表现最为突出,特別是在网络游戏的技术研发兴游戏制作,其所发行的网络游戏更成为全球游戏产业重要的指标之一。去年在美国洛杉矶所举行的 E3

(Electronic Entertainment Exposition)展中,已经有几家的韩国厂商挤入世界第一线的游戏开发厂商之列。

近几年来,由于 3D 硬体绘图技术的突破,使得即时描绘的书面越来越精致,而且3D遊戏性更多元化更逼近真实世界,因此在遊戏产业中,3D 游戏已经逐渐取代2D游戏为游戏市场的主流,即使是网络游戏,也慢慢趋向3D化。然而游戏3D化将会带来的游戏开发上的困难等问题,这些问题以后都需要逐步解决。 1.3 研究内容与目标

实验要求如下:

(1) 玩家能通过局域网进行局域网对战。

(2) 实现游戏员的网络对话。

(3) 游戏规则:在棋盘上的行、列、对角线上连续放五个旗子的一方获胜。 本程序旨在用C#语言实现一个基于.NET架构的C/S模式的五子棋局域网对战游戏,玩家作为客户端通过服务器端与其它玩家进行对战,聊天等功能。界面使用VS2008 WindowForm窗体实现,界面美观,操作简单,可行性强。

2.相关理论与技术

2.1五子棋简介

(1)棋盘,棋子:

1、棋盘为十五路,正中一点为“天元”,周围四点为小星。 2、棋子分黑白两色,黑子113枚,白子112枚,共225枚。 (2)比赛规则:

1、黑先白后,从棋盘任意位置开始落子。然后执白棋的一方在黑棋周围的交叉点上落子。以此类推,黑白交替落子。

2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。 本文所论述的联机五子棋系统就是依照这种方式进行的。

2.2相关技术简介

2.2.1 C/S体系结构

C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

(Client/Server或客户/服务器模式):Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。 C/S 结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。客户端完成数据处理,数据表示以及用户接口功能;服务器端完成DBMS的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。

C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。

C/S编程模式概括如下: 服务器端:

打开通信道路,告诉本地机器,愿意在该通道上接受客户请求——监听,等待客户请求——接受请求,创建专用链接进行读写——处理完毕,关闭专用链接——关闭通信通道(当然其中监听到关闭专用链接可以重复循环)。

客户端:

打开通讯道路,链接服务器——数据交互“-关闭信道。

2.2.2 SOCKET简介

Socket 代表了一种文件描述符;这个描述符则是用于网络访问的。其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接受)和写入(发送)均针对这个通道来进行。在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SendTo方法将数据发送到连接的Socket,或者使用Receive/Receive From方法接受来自连接Socket的数据。

Socket通讯方式:

同步:客户端在发送请求之后必须等到服务器回应之后才可以发送系一条请求。串行运行。

异步:客户端请求之后,不必等到服务器回应之后就可以发送下一条请求。并行运行。

用Socket访问网络的基本步骤: a.建立一个套接字 b.绑定本机的IP和端口

c.如果是TCP,因为是面向连接的,所以要利用ListenO()方法来监听网络上是否有人给自己发东西;如果是UDP,因为是无连接的,所以来这不拒。 d.TCP情况下,如果监听到一个连接,就可以使用accept来接受这个连接,然后就可以利用Send/Receive 来执行操作了。而UDP,则不需要accept,直接用SendTo/ReceiveFrom来执行操作。

e.如果你不想继续发送和接受了,就可以使用close来关闭连接

在TCP/IP 网络中,IP网络交互分类两大类:面向连接的交互和面向唔连接的交互。Socket面向两种连接的通讯图如下:

服务器方

Socket()建立流式套接字,返回套接字号s Bind(),将套接字s与本地地址相连 Socket(),建立流式套接字,返回套接字号s Listen(),通知TCP,服务器准备好接受连接 accept(),接受连接,它等待客户的连接.......... 连接建立,accept()返回,得到新的数据套接字, 如ns Connect(),将套接字s与远地主机连接 ........ 建立连接 Recv()/send(),在套接字ns上读/写数据,直到数据交换完 服务请求 /应答 Send()/recv(),在套接字s上写/读数据,直到数据交换完 Closesocket(),关闭套接字ns Closesocket(),关闭最初套接字s,服务结束 Closesocket(),关闭套接字s,结束TCP对话

面向连接的套接字系统调用时序

服务器/客户方 服务器/客户方

Socket()建立流式套接字,Socket()建立流式套接字,返回套接字s 返回套接字s Bind()将套接字s与本地地址绑定

Bind()将套接字s与本地地址绑定

ReceiveFrom/SendTo(),通过 数据报文 套接字s收发报文 ReceiveFrom/SendTo(),通过套接字s收发报文

Closesocket(),关闭最初套接字s,服务结束

Closescoket(),关闭最初套接字,服务结束 无连接的套接字系统调用时序

2.2.3 面向对象的理论知识

面向对象方法是一种运用对象,类,封装,继承,多态和消息等概念来构造,测试,重构软件的方法。

面向对象方法是一种以知识为基础,用对象来理解和分析问题空间,并设计和开发出由对象构成的软件系统(解空间)的方法。由于问题空间和解空间都是由对象组成的,这样可以消除由于问题空间和加空间结构上的不一致带来的问题。简言之,面向对象就是面向事物本身,面向对象的分析古城就是认识客观世界的过程。面向对象方法从从对象出发,发展出对象,类,消息,继承等概念。 面向对象的主要优点是:符合人们通常的思维方式;从分析到设计再到编码采用一致的模型表示具有高度连续性;软件重用性好。 2.2.4 C#.NET 相关知识介绍

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

本次设计是用C#.NET完成的,采用的是windows窗体应用程序来实现图形界面功能的,本设计主要用到的,一些控件有:

ImageList,MenuStrip,button,textbox,label,等一些简单的控件。用到的主要技术就是Socket通讯,以及多线程编程。下面简单的介绍一下这些知识。

ImageList 控件包含ListImage对象的集合,该集合中的每个对象都可以通过其索引或关键字被引用。ImageList控件不能独立使用,只是作为一个便于向其它控件提供图象的资料中心。ImageList控件的作用象图像的储藏室,同时,它需要第二个控件显示所储存的图像。第二个控件可以是任何能显示图像 Picture 对象的控件,也可以是特别设计的、用于绑定 ImageList 控件的 Windows 通用控件之一。本程序中在Label,PictureBox中调用了ImageList中的图像。 MenuStrip 控件是 Visual Studio 和 .NET Framework 中的功能。使用该控件,可以轻松创建 Microsoft Office 中那样的菜单。MenuStrip 控件支持多文档界面 (MDI)和菜单合并、工具提示和溢出。您可以通过添加访问键、快捷键、选中标记、图像和分隔条,来增强菜单的可用性和可读性。MenuStrip 控件取代了 MainMenu 控件并向其中添加了功能;但是也可选择保留 MainMenu 控件以备向后兼容和将来使用。

3.系统的分析与设计

3.1需求分析

(1)满足游戏双方记录的游戏动作的基本要求。 (2)满足对战双方及时通讯的基本要求。 (3)满足游戏双方及时显示游戏状态的基本要求。 (4)在服务器端分析双方是否胜利。

3.2 功能分析

基于系统需求分析,该系统需要实现以下基本功能:

(1)棋盘绘制:在游戏加载时,即时显示棋盘

(2)对连接到客户端数据的基本要求:能够将要发送的聊天记录发送至对方手上,能够完成即时通讯。

(3)实时显示:当从游戏一方将数据传入另一方系统中,将五子棋的表格进行重新的刷新,和更改。

(4)通过控制鼠标点击五子棋表格:触发事件,把该动作发送到游戏另一方,并判断是否胜利。

3.3运行环境

系统运行环境:WindowsXP及以后版本 开发环境:VS2008

4.系统的实现

4.1概要设计

本次毕业设计的内容主要是利用Socket实现一个网络对战五子棋,首先先要绘制出棋盘,然后实现Socket通讯(连接,聊天等功能),然后实现下棋功能,下棋这部分功能的实现根据Socket通讯传递的信息流控制双方该谁下棋;再通过传递过来的消息触发事件从而实现对战双方的同步显示;每走一步棋子,都要利用一个算法来判断一下有没有出现五个相同棋子连到一起的情况,及是否有人赢棋,这个算法要分两种情况,一种是黑棋,另一种是白棋,如果刚落下的棋子是黑棋,那么就要在整个棋盘上通过上下,左右,以及斜上,斜下,这几个方向来寻找看看有没有五子连在一起的情况,如果有的话,那么黑棋胜,游戏结束;如果刚落下的是白棋的话,用同样的方法判断。

对战方1 对战方2

加载主界面(棋盘,对话窗口等) 输入对方IP进行连接 开始游戏 分出胜负游戏结束

4.2流程图

加载主界面(棋盘,对话窗口等) 输入对方IP进行连接 通讯对话 开始游戏 分出胜负游戏结束 下面用我们用数据流图(DFD, Data Flow Diagram),也就是从数据传递和加工的角度,以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示:

等待连接 准备(启动服务)开始监听

开始(建立连接)

连接至对方的服务端

等待对方链接自己的服务端

收到对方链接请求,建立连接

可以进行及时通讯

判断谁先下棋

等待轮到自己下棋

下棋

将信息传递到对方的棋盘上

更新,实现双方显示同步 判断胜负

更新胜负记录 重新开始

断开连接

4.3程序详细设计

4.3.1 期盼的绘制代码和图解

using System;

using System.Collections.Generic; namespace WindowsApplication1

{

public partial class Form1 : Form {

public Form1() {

InitializeComponent(); }

public int BBow=0; int[] a=new int[225]; int BCount = 0; int BwinCount = 0; int WwinCount = 0; int k,g,x = 15; bool Out=false;

public bool CanAgin,CanAgins,CanDown,WhoFisrtDown; private Socket listener; private Thread mainThread;

public void Form1_Load(object sender, EventArgs e) {

for (int i = 0; i <15; i++)//棋盘 {

for (int j = 0; j <15; j++) {

PictureBox pictureBox1 = new PictureBox();

pictureBox1.Location = new System.Drawing.Point(i * 29+30, j*29+30); pictureBox1.Name = \+(i+j*15).ToString(); pictureBox1.Size = new System.Drawing.Size(30,30); pictureBox1.TabIndex = 0;

pictureBox1.Image = imageList1.Images[2]; pictureBox1.TabStop = false; a[i + j * 15] = 3;

pictureBox1.Click+=new EventHandler(asd); this.Controls.Add(pictureBox1); } }

button3.Enabled = false; button6.Visible = false; button1.Enabled = false; label7.Visible = true; label8.Visible = false; CanDown = false; }

4.3.2 连接服务器模块

namespace WindowsApplication1 {

public class Client {

//1、连接服务器 //2、发送消息 //3、接收数据包

private Socket _client; //跟服务器连接的socket

private bool _connected; //socket连接状态,表示断开或已经连接两种情况

//连接服务器

public void ConnectServer(string ip, int port) //指定地址和端口 {

_client = new Socket( //Socket类构造函数

AddressFamily.InterNetwork, //Socket使用的寻址方案 IP版本为 SocketType.Stream, //连接是基于流套接字的 ProtocolType.Tcp); //连接协议是使用TCP协议

IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ip),port); //初始化制定的地址和端口

_client.Connect(ep);

_connected = true; //返回值true }

//返回连接状态 public bool Connected {

get { return _connected; } }

//关闭连接

public void CloseConnection()

{

if (_connected) {

_client.Close(); _connected = false; } }

//发送消息

public void SendMessage(string message) {

byte[] buffer = Encoding.Default.GetBytes(message + \); _client.Send(buffer); }

}

4.3.3判断先行,先行者添加棋子(程序代码和图)

public void First() {

if (WhoFisrtDown == true) {

MessageBox.Show(\先行\); } else {

MessageBox.Show(\后行\); } }

public void FiDnMessage(object sender, FiDnMessageEventArgs e)//谁先下棋的判断 {

if (this.InvokeRequired) {

this.Invoke(

new EventHandler(this.FiDnMessage), new object[] { sender, e }); } else {

WhoFisrtDown = true; } First(); }

4.3.4 添加后行者下棋模块(程序代码和图)

public void AddChess(object sender, AddChessEventArgs e) {

if (this.InvokeRequired) {

this.Invoke(

new EventHandler(this.AddChess), new object[] { sender, e }); } else {

string name = \ + e.Number; int num = Int32.Parse(e.Im); BBow = Int32.Parse(e.Bow);

PictureBox bb = (PictureBox)this.Controls[name]; bb.Image = imageList1.Images[num]; if (num == 0) {

label7.Visible = false; label8.Visible = true; }

else if(num==1) {

label7.Visible = true; label8.Visible = false; }

bb.Enabled = false;

int s = Int32.Parse(e.Number); a[s] = Int32.Parse(e.Im); ChessJudge(); }

WhoFisrtDown = true; }

4.3.5 判断黑白棋输赢的模块(程序代码和图)

//判断黑棋是否赢 public void Bwin() {

for (g = 0; g < 225; g++) {

string name = \ + g.ToString();

PictureBox aa = (PictureBox)this.Controls.Find(name, false)[0]; aa.Enabled = false; }

MessageBox.Show(\黑子赢了!!请按重新开始!\); BwinCount++;

label1.Text = \黑胜:\ + BwinCount; button3.Visible = false; button6.Visible = true;

本文来源:https://www.bwwdw.com/article/rssr.html

Top