网络编程基础实训报告

合集下载

网络编程实验报告

网络编程实验报告

网络编程实验报告实验一TCP Socket API程序设计一、预备知识1.网络编程基本概念网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。

在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。

套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。

图1-1 TCP通信流程2.TCP通信流程TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。

二、实验目的1.了解Winsock API编程原理;2.掌握TCP Socket程序的编写;3.了解C/S模式的特点;4.学会解决实验中遇到的问题。

三、实验任务使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。

四、实验环境及工具1. Windows2000/XP/72. Visual C++开发平台3. Visual Studio2010五、实验内容和步骤参照《Visual C++网络编程教程》书中81页,TCP Socket API 程序设计。

连接:void CChatClientDlg::OnConnect(){WSADATA wsd; //WSADATA结构WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版m_client = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字//服务器地址sockaddr_in serveraddr;UpdateData();if(ServerIP.IsBlank()){AfxMessageBox("请指定服务器IP!");return;}if(sPort.IsEmpty()){AfxMessageBox("请指定端口!");return;}//获取服务器进程的IP和端口BYTE nFild[4];CString sIP;ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);sIP.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);//设置服务器地址结构的内容serveraddr.sin_family = AF_INET;serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);serveraddr.sin_port = htons(atoi(sPort));//发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr)) ! = 0){MessageBox("连接失败");return;}else{m_ListWords.AddString("连接服务器成功!");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLO SE); //①//界面完善ServerIP.EnableWindow(false);ServerPort.EnableWindow(false);m_ButtonConnect.EnableWindow(false);m_ButtonDisconnect.EnableWindow();m_EditWords.EnableWindow();m_ButtonSend.EnableWindow();m_ButtonExit.EnableWindow(false);m_ButtonClear.EnableWindow();}“断开”按钮的事件过程代码如下:void CChatClientDlg::OnDisconnect(){//断开与服务器的连接closesocket(m_client);m_ListWords.AddString("从服务器断开");m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);ServerIP.EnableWindow();ServerPort.EnableWindow();m_ButtonConnect.EnableWindow();m_ButtonDisconnect.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);m_ButtonExit.EnableWindow();}“发送”按钮事件过程代码如下:void CChatClientDlg::OnSend(){//向服务器发送信息UpdateData();if(m_sWords.IsEmpty()){AfxMessageBox("发送的消息不能为空!");return;}//开始发送数据int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);m_ListWords.AddString("发送:" + m_sWords);m_ListWords.SetT opIndex(m_ListWords.GetCount() - 1);}BOOL CChatClientDlg::PreTranslateMessage(MSG* pMsg){if(pMsg->message == 10000) //识别应用程序中定义的消息号{switch(pMsg->lParam) //判断网络事件类型{case FD_READ:this->ReceiveData(); //若为FD_READ则接收数据break;case FD_CLOSE:this->CloseSock(); //如果服务端断开,客户端也断开break;}}elsereturn CDialog::PreTranslateMessage(pMsg);}下面来实现ReceiveData()和CloseSock()方法。

网页编程技术的实训报告

网页编程技术的实训报告

一、实习目的本次实训旨在通过实际操作,让学生掌握网页编程的基本技能,熟悉网页制作流程,提高网页设计和制作能力。

通过实训,使学生能够熟练运用HTML、CSS、JavaScript等前端技术,实现网页的基本布局、样式和交互功能。

二、实习内容1. HTML学习(1)HTML基本标签及属性通过学习HTML基本标签,如《!DOCTYPE html》、《html》、《head》、《body》等,以及常用标签如《a》、《img》、《p》、《div》等,了解网页的基本结构。

(2)表格、列表、表单学习如何使用表格、列表、表单等标签,实现网页中的数据展示和用户交互。

2. CSS学习(1)CSS基本语法学习CSS的基本语法,包括选择器、属性、值等,了解如何设置网页样式。

(2)盒子模型、布局、颜色、字体等学习盒子模型、布局、颜色、字体等样式属性,掌握网页的样式设计。

3. JavaScript学习(1)JavaScript基本语法学习JavaScript的基本语法,包括变量、数据类型、运算符、函数等。

(2)事件处理、DOM操作学习如何使用JavaScript处理事件,以及如何操作DOM,实现网页的交互功能。

4. 响应式网页设计学习响应式网页设计的基本原理,使用媒体查询等技术,使网页在不同设备上具有良好的展示效果。

5. 网页制作实践(1)设计并实现一个简单的网页根据所学知识,设计并实现一个具有基本布局、样式和交互功能的网页。

(2)优化网页性能学习如何优化网页性能,包括压缩代码、优化图片等。

三、实习过程1. 理论学习通过查阅资料、课堂讲解等方式,学习HTML、CSS、JavaScript等前端技术的基本知识。

2. 实践操作(1)编写HTML代码,实现网页的基本结构。

(2)编写CSS代码,设置网页样式。

(3)编写JavaScript代码,实现网页的交互功能。

(4)使用响应式设计技术,优化网页在不同设备上的展示效果。

3. 作品展示与评价将制作的网页上传至个人博客或GitHub等平台,邀请同学、老师进行评价与反馈。

网络编程实验报告

网络编程实验报告

网络编程实验报告网络编程实验报告引言网络编程是计算机科学领域中的一个重要分支,它涉及到计算机网络的通信原理、网络协议以及数据传输等方面的知识。

本次实验旨在通过实际操作,加深对网络编程的理解,并掌握基本的网络编程技巧。

一、实验目的本次实验的主要目的是通过使用Python语言进行网络编程,实现一个简单的客户端和服务器端的通信。

通过这个实验,我们可以了解到网络编程的基本原理和技术,以及如何利用网络编程实现不同计算机之间的数据传输。

二、实验环境本次实验使用的是Python 3.9版本,并且需要安装socket模块。

在实验开始之前,我们需要确保计算机上已经正确安装了Python环境,并且能够正常运行Python程序。

三、实验过程1. 创建服务器端首先,我们需要创建一个服务器端的程序,用于接收来自客户端的请求并进行处理。

在Python中,可以使用socket模块来实现服务器端的功能。

具体的代码如下:```pythonimport socket# 创建一个socket对象s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号s.bind(('127.0.0.1', 8888))# 监听端口s.listen(5)# 等待客户端连接while True:# 接受一个新连接client_socket, addr = s.accept()# 接收客户端发送的数据data = client_socket.recv(1024)# 处理数据response = "Hello, " + data.decode()# 发送响应数据给客户端client_socket.send(response.encode())# 关闭连接client_socket.close()```2. 创建客户端接下来,我们需要创建一个客户端的程序,用于向服务器端发送请求并接收响应。

最新计算机网络基础实训报告

最新计算机网络基础实训报告

计算机网络基础实训报告(通用6篇)一、实习目的我在xx的一家网络公司实习,总的来说,此次实习是一次成功的顺利的实习。

通过我们的努力,我们已可能的完成了实习大纲的要求,既充分巩固了大学前期一年的专业知识,又对今后两年的专业科目学习有了新的理解,这次专业认识实习增强了我们的职业意识,并激发我们在今后的工作中根据实习的经验识时务的调整自己的知识结构和经验技能,以更好的适应社会在新闻传播领域,尤其是网络传播发展方向的人才需求。

二、实习内容我承担了ftp服务器的管理工作和公司内信息服务的日常检测工作,这同专业的发展方向是极其吻合的。

ftp服务带有自身的特殊性,用户可以在其中发布各种文档包括文本、声音、视频、多媒体等,对ftp的管理就要有极好的电脑知识尤其要对文件路径十分了解,还要有信息归纳的能力,将公司内用户上传的文档分门别类的放在不同的文件夹中,这也是作为我门专业学生应当具有的基本能力之一,在ftp管理的过程中,我深刻的感受到了作为信息管理者和发布者是非辨别和政治敏感的重要,用户上传的文档是未经许可和身份认证的,所以在ftp 服务权限中对上传文件夹(up)做了只能上传而不能随意下载的处理,而管理员的职责是将up文件夹中的文档作初步审查,审查包括文档中是否包含xx的信息、是否包含x等不健康信息、是否倡导了不健康不科学的生活方式和态度等各个方面。

所以说要做好这些事情,不细心负责,没有基本的专业素养,是很容易出现漏洞的。

刚到网络公司,领导并不了解你的工作学习能力,不清楚你会做那些工作,不清楚你想了解的知识,所以跟领导很好的沟通是很必要的。

同时我觉得这也是我们将来走上社会的一把不可缺少的钥匙。

通过沟通了解,领导对我有了大体了解,边有针对性的教我一些知识,我对网络部线,电脑硬件安装,网络故障排除,工作原理应用比叫感兴趣,所以领导就让我协同他们或独立的完成大小单位的网络安装与检修工作。

如网络故障检修、办公室的网络故障检修等,直接或间接保证了公司网络的正常运行和使用,在这方面的工作中,真正学到了计算机教科书上所没有或者真正用到了课本上的知识,巩固了旧知识,掌握了新知识,甚至在实践中x了书本上旧有的不合实际的知识,这才真正体现了知识的真正价值,学以致用。

网络编程_实验报告

网络编程_实验报告

一、实验目的1. 理解网络编程的基本原理和概念。

2. 掌握TCP/IP协议的基本工作原理。

3. 学会使用Socket编程实现网络通信。

4. 增强实际操作能力,提高网络编程水平。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm4. 网络环境:校园局域网三、实验内容本次实验主要实现一个基于TCP协议的简单网络通信程序,包括客户端和服务器端。

1. 服务器端服务器端负责监听客户端的连接请求,接收客户端发送的数据,并回显给客户端。

```pythonimport socket# 创建socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 12345# 绑定端口server_socket.bind((host, port))# 设置最大连接数,超过后排队server_socket.listen(5)print("等待客户端连接...")while True:# 建立客户端连接client_socket, addr = server_socket.accept()print("连接地址:", addr)while True:# 接收客户端数据data = client_socket.recv(1024)if not data:break# 发送数据回客户端client_socket.send(data)# 关闭连接client_socket.close()```2. 客户端客户端负责向服务器端发送数据,并接收服务器端回显的数据。

```pythonimport socket# 创建socket对象client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名host = socket.gethostname()port = 12345# 连接服务器client_socket.connect((host, port))# 发送数据client_socket.send("Hello, Server!")# 接收数据data = client_socket.recv(1024)print("从服务器接收到的数据:", data)# 关闭连接client_socket.close()```四、实验步骤1. 编写服务器端代码,并运行程序。

计算机科学与技术专业网络编程实习报告

计算机科学与技术专业网络编程实习报告

计算机科学与技术专业网络编程实习报告一、引言网络编程作为计算机科学与技术专业中的重要内容之一,不仅是理论知识的学习与掌握,更需要通过实践来提升技能与应用能力。

本报告旨在总结并回顾我在网络编程实习中所学到的知识和经验,分享实习过程中的收获与所遇到的问题,进一步提升我的技术水平和实际应用能力。

二、实习项目概述在网络编程实习中,我选择了一个基于TCP协议的聊天室项目。

该项目要求实现多个客户端之间的即时通信,包括用户注册登录、消息发送接收、用户列表管理等功能。

通过实践该项目,我能够更深入地了解网络编程的基本原理和实际应用。

三、实习过程及经验总结1. 熟悉并掌握TCP/IP协议在开始实习之前,我对TCP/IP协议进行了系统学习,并深入了解了TCP协议的特点和应用场景。

这为我后续的实习提供了坚实的理论基础。

2. 学习Socket编程Socket编程是网络编程的核心,通过学习Socket的相关知识,我了解了Socket的工作原理和基本用法,包括服务器端的监听和接收连接、客户端的连接和发送消息等操作。

3. 实现聊天室服务器端通过学习Socket编程,我成功实现了聊天室的服务器端程序。

包括用户注册、登录验证、消息广播等功能。

在实现过程中,我遇到了一些问题,如如何处理多个客户端的连接、如何管理用户列表等。

通过查阅资料和与同学的交流,我解决了这些问题,并将其应用到了实际项目中。

4. 开发聊天室客户端基于服务器端的实现,我进一步开发了聊天室的客户端程序。

通过与服务器的连接,客户端可以发送和接收消息,并能够实时显示其他在线用户的状态。

在开发过程中,我注重界面的设计与交互的友好性,提高了用户体验。

5. 调试与测试在实习过程中,我积极进行调试与测试工作,不断优化代码和修复Bug。

通过测试,我发现了一些潜在的问题和性能瓶颈,并进行了相应的优化和改进,提高了程序的稳定性和效率。

四、实习心得与收获通过参与网络编程实习,我收获了很多宝贵的经验和技能。

编程基础实训报告

编程基础实训报告

一、实训背景随着计算机技术的飞速发展,编程已经成为现代社会不可或缺的技能。

为了提高自身的编程能力,我参加了编程基础实训课程。

通过本次实训,我对编程有了更深入的了解,以下是我对本次实训的总结报告。

二、实训目标1. 掌握编程的基本概念和原理;2. 熟悉一种编程语言(如Python);3. 学会编写简单的程序,解决实际问题;4. 提高逻辑思维和问题解决能力。

三、实训内容1. 编程基本概念在实训过程中,我学习了编程的基本概念,如变量、数据类型、运算符、控制结构等。

这些概念是编写程序的基础,对于理解程序执行过程具有重要意义。

2. 编程语言学习本次实训选择了Python语言作为学习对象。

我学习了Python的基本语法、数据结构、函数、模块等知识。

通过实际编写程序,我逐渐掌握了Python的编程技巧。

3. 算法设计与实现在实训过程中,我学习了算法的基本概念和设计方法。

通过实际案例分析,我了解了常用的算法,如排序、查找、递归等。

我将所学算法应用于实际编程中,提高了程序的性能。

4. 编程实践在实训过程中,我完成了多个编程实践项目,如计算器、学生管理系统、简易博客等。

通过这些项目,我锻炼了自己的编程能力,提高了问题解决能力。

四、实训过程1. 理论学习在实训初期,我认真学习了编程基础理论知识,为后续实践打下坚实基础。

2. 编程实践在理论学习的指导下,我开始进行编程实践。

在实践过程中,我遇到了许多困难,但在老师和同学的帮助下,我逐渐克服了这些问题。

3. 项目实践在实训后期,我参与了一个团队项目,负责编写部分功能模块。

通过团队合作,我们成功完成了项目,提高了自己的团队协作能力。

五、实训收获1. 编程能力得到提升:通过本次实训,我掌握了Python编程语言,能够独立编写简单的程序。

2. 问题解决能力提高:在实训过程中,我学会了如何分析问题、设计算法、编写代码,提高了自己的问题解决能力。

3. 团队协作能力增强:在项目实践中,我与团队成员密切配合,共同完成项目,增强了团队协作能力。

编程知识实践报告范文(2篇)

编程知识实践报告范文(2篇)

第1篇一、引言随着信息技术的飞速发展,编程已成为当今社会不可或缺的一项基本技能。

为了更好地掌握编程知识,提高自身综合素质,我于近期参加了一次编程知识实践课程。

以下是我对本次实践课程的总结与反思。

二、实践课程概述本次实践课程为期两周,主要内容包括Python基础语法、数据结构、算法、面向对象编程等。

课程采用线上教学与线下实践相结合的方式进行,使我能够在理论知识的基础上,通过实际操作提高编程能力。

三、实践过程及收获1. 理论知识学习在课程开始阶段,我们学习了Python的基础语法,包括变量、数据类型、运算符、控制结构等。

通过学习,我对Python编程语言有了初步的认识,为后续深入学习打下了基础。

2. 数据结构与算法数据结构与算法是编程的核心内容,本次课程重点讲解了常见的数据结构(如数组、链表、栈、队列、树、图)以及相关算法(如排序、查找)。

通过学习,我掌握了数据结构与算法的基本原理,能够根据实际需求选择合适的数据结构与算法。

3. 面向对象编程面向对象编程是现代编程的主流范式,课程中我们学习了类的定义、继承、多态等基本概念。

通过实际操作,我学会了如何运用面向对象编程思想设计程序,提高了代码的可读性和可维护性。

4. 项目实践为了巩固所学知识,课程安排了多个项目实践环节。

以下是我参与的两个项目:(1)项目一:计算器该项目要求我们编写一个简单的计算器程序,实现加减乘除等基本运算。

通过该项目,我熟悉了Python中的输入输出操作,以及字符串处理方法。

(2)项目二:图书管理系统该项目要求我们设计一个图书管理系统,包括图书的增删改查功能。

在项目实施过程中,我运用了面向对象编程思想,设计了图书类、用户类和管理类,实现了图书管理系统的基本功能。

四、实践反思1. 理论与实践相结合的重要性通过本次实践课程,我深刻体会到理论与实践相结合的重要性。

在学习过程中,不仅要掌握理论知识,还要通过实际操作提高编程能力。

2. 不断总结与反思在实践过程中,我遇到了许多问题,如代码编写错误、算法设计不合理等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网络编程基础实训报告题目:五子棋人机博弈游戏院(系):计算机与通信工程学院专业:信息安全姓名:班级:信息安全学号:指导教师:2012 年10 月12 日目录一.系统需求分析与总体设计1.需求分析①问题描述②数据流程图2.总体设计①开发背景②开发语言③总体功能设计二.详细设计与系统实现1.类和类的方法设计①类的设计②类的方法设计三.系统测试1.功能测试四.总结1.系统仍存在的不足2.结论和体会一.系统需求分析与总体设计1.需求分析①问题描述题目:五子棋人机博弈游戏题目要求:实现五子棋游戏的人机博弈。

要求:友好的人机图形化界面、方便的操作方式;自动判断输、赢或平;可选择黑白;可悔棋;可以基于人工智能方面的知识进行设计,如:启发式搜索、搜索函数的设置、α_β算法、知识的表示及知识库,推理机等。

五子棋简介:五子棋是起源于中国古代的传统黑白棋种之一。

顾名思义,只要连成五子即可获得胜利。

听上去好像很简单,但是不用技巧好似很难获胜的,这其中就有“活三”,“冲三”等等专业名词,这些我会在后续的程序中进行介绍。

五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见。

通过问题的描述,初步分析可得出此软件应具有以下的功能:1. 友好的界面,方面的操作方式——》可以快速开始游戏,功能明确而且界面明朗2. 自动判断输赢——》计算机可以根据棋子的状态判断胜负情况3. 可选择黑白——》可以先手下棋和后手下棋4. 可悔棋——》具有悔棋功能5. 计算机AI ——》计算机需要具有一定的AI ,需要AI 攻守兼备 ② 数据流程图数据流动很少,主要是在算法内部进行计算,实际进行交互的数据是没有的。

要求开始游戏 落子,33禁手棋子坐标玩家落子 取最佳位置并落子(若不分胜负)再来一盘 胜负已分2. 总体设计① 开发背景C#网络编程基础实训通过这个程序学习基本的c#网络编程。

玩家 计算机AI :即算法判断谁是先手输赢判断是否再来一盘②语言选择使用C#平台在设计人机界面时更人性化,画图工具也更为简洁易用。

③具体功能设计主要函数:1.画棋子2.画棋盘3.先手判断4.胜负判断5.计算机AI算法(权值赋值,权值计算,找最大权值)界面设计:1.快速开始游戏2.先手选择3.悔棋,认输,电脑提示4.棋子的坐标显示(计算电脑提示的附加功能)5.帮助这几个模块的重点是计算机AI算法的设计。

在参阅了很多资料以后,我发现解决五子棋问题的算法非常之多,遗传算法,α—β剪枝算法等等,这些算法的特点是对后续步骤进行无数次的推演并一一评分,最后去评分最高的一种方案的第一步,在下完一子之后再进行算法计算,虽然AI非常聪明但是计算繁琐且计算时间其长无比。

在网上发现的算法有更多的程序员是采用了权值计算的方法,具体来说就是根据每种情况每种可能对每个点都赋不同的权值,AI在判断应该进攻还是应该防守就是依靠权值的大小,权值最大的位置放棋子,采用这种方法虽然笨是笨了些,但是计算速度快,尤其是在棋盘比较小的时候(15*15棋盘),而且在对比中发现这种AI也很聪明。

在速度和计算精度之间权衡之后,我准备选择计算权值的方法来做,如果时间仍有富裕的话再使用别的算法来计算并进行对比。

二.详细设计与系统实现1.类和类的方法设计①类的设计(后面的方法设计也遵从这个顺序逐个进行详细注释)棋盘类Chessboard棋盘类主要实现对棋盘棋子,以及电脑和人下棋的显示,对虚拟棋盘的定义,对下棋路径的堆栈的初始化,对棋局的初始化。

棋子类Stone棋子类主要实现对棋子的画图操作。

计算机类Computer计算机类是本程序的核心模块,主要实现计算机对每个棋子每个位置的权值赋值,对每个棋盘位置的权值计算,求最大权值。

规则类Rule规则类主要实现对胜负平局的判断,对黑棋禁手的判断,对每个方向上的连子数的计算,对棋局判断是依据连子数计算的。

主函数类frmMain主函数主要是对界面上每个按键的功能进行实现,另实现对鼠标的move和click事件的定义,获取鼠标的坐标。

②类的方法的具体实现1.Chessboard类中方法的实现一.Chessboard中的变量定义所谓的在棋盘上下棋,其实就是在相应坐标进行绘图,实际是不存在棋盘的,这里我定义一个15,15的二维数组来表示虚拟的棋盘进行下棋,其他见程序注释。

public int[,] arrchessboard = new int [15,15];/ /arrchessboard为棋盘情况数组,虚拟棋盘的定义,arrchessboard[i,j]=2表示此处无子arrchessboard[i,j]=0表示此处为黑子,arrchessboard[i,j]=1表示此处为白子private Graphics mg; //绘制的对象public Stone stone; //棋子对象public Computer computer; //电脑对象private bool stoneflag = true; //判断当前棋子是黑(true)是白(false)private bool mplayfirstflag = false; //判断先手玩家(是电脑(true)还人(false),先手下黑棋)private Stack mStarckHistory = new Stack();//历史记录堆栈二.Chessboard中对棋盘和棋子的绘制对棋子和棋盘的绘图要用到system.draw这个系统自带的画图类,我使用的方式是先读取文件流中的文件,然后在每次画图的时候就不用再次读取了,直接可以进行绘图,这样处理速度比较快。

详细见注释。

public void Draw(){//从资源中获取,读取棋盘图像,就是在当前项目中读取文件System.Reflection.Assembly thisExe;thisExe = System.Reflection.Assembly.GetExecutingAssembly();System.IO.Stream file =thisExe.GetManifestResourceStream("FiveStones.chessboard.gif");//棋盘文件Image imgChessboard = System.Drawing.Image.FromStream(file); //棋盘图片大小*600像素,每个棋子的点的坐标,个棋子,个空,两边线留空file.Close();mg.DrawImage(imgChessboard,0,0,imgChessboard.Width,imgChessboard.Height);//绘制棋子for (int i=0;i<15;i++){for(int j=0;j<15;j++){if (arrchessboard[i,j] == 0)//对棋盘上的点进行判断后,根据虚拟数组的值来判断绘制哪一种棋子{stone.DrawStone(i,j,true);//Stone里面具体的绘制方法}if (arrchessboard[i,j] == 1){stone.DrawStone(i,j,false);}}}}三.Chessboard中人下棋和电脑下棋就是获取下棋的坐标,然后在该坐标进行相应的绘图,然后把该点的虚拟棋盘置成2,表示已经下过棋了。

public void PersonDownStone(int x,int y){if (x < 600 && y < 600) //取下棋点{int m = (int)Math.Floor((double)x/40);//求浮点数的“地板数”,就是求小于等于该点浮点数的整数int n = (int)Math.Floor((double)y/40);if (!Rule.IsExist(m,n,arrchessboard))//如果这个位置没有子,则下子{DownStone(m,n);//人下子ComputerDownStone();//电脑下子}}}private void ComputerDownStone(){int m,n,count=0;//count是计数器,每下一子就加1do{computer.Down(arrchessboard);m = computer.X;n = computer.Y;count++;if (count > 100)//如果下一百个子还不分胜负,就直接异常退出{MessageBox.Show("异常!");Start();return;}}while(Rule.IsExist(m,n,arrchessboard));//当判断该点没有子的时候下子DownStone(m,n);}四.Chessboard对棋局的初始化把初始化贴上来的目的是为了让每次下棋的流程更明显,构造对象啊,还有清空堆栈呀,这些看似很简单,但是其中的顺序是不可颠倒的,详细见注释。

private void Initialization()//棋盘初始化{stoneflag = true; //置当前要走的棋为黑棋(黑棋先走)for(int i=0;i<15;i++){for(int j=0;j<15;j++){arrchessboard[i,j] = 2; //把棋盘所有位置置为空(未下子)}}mStarckHistory.Clear();//清空历史记录堆栈stone = new Stone(mg); //构造棋子对象}private void Start()//这个才是初始化函数{Initialization();computer = new Computer(mplayfirstflag); //构造电脑对象Draw();//画棋盘if (mplayfirstflag)//如果是电脑先手的话就电脑下棋,否则等待{ComputerDownStone();}}五.Chessboard中每下一子都要进行的处理做法,更改虚拟棋盘的数值,对禁手进行判断,将棋子坐标压入堆栈,下棋完成后交换下棋。

这个过程显示了下棋的步骤,在下棋之后,对虚拟棋盘也就是二维数组进行赋值,然后把该点压入堆栈,然后对黑棋是否禁手进行判断,这里用到了Rule传过来的值,详细见注释。

private void DownStone(int m,int n){stone.DrawStone(m,n,stoneflag);//下棋if (stoneflag) //记录情况{arrchessboard[m,n] = 0;//根据黑白标记对虚拟棋盘数组进行赋值}else{arrchessboard[m,n] = 1;}i f (stoneflag) //记录历史记录压入堆栈{//压入堆栈的是棋子颜色和坐标mStarckHistory.Push("黑:"+m.ToString()+","+n.ToString());}else{mStarckHistory.Push("白:"+m.ToString()+","+n.ToString());}if (Rule.Result(m,n,arrchessboard) < 6) //判断结果,这个要调用Rule中的方法{switch(Rule.Result(m,n,arrchessboard)) //禁手失败直接判黑棋负,重新开始{case 1:MessageBox.Show("黑棋双三禁手失败!");break;case 2:MessageBox.Show("黑棋双四禁手失败!");break;case 3:MessageBox.Show("黑棋长连禁手失败!");break;case 4:if (stoneflag){MessageBox.Show("黑棋胜利!");}else{MessageBox.Show("白棋胜利!");}break;case 5:MessageBox.Show("平局!");break;}Start();//重新开始!return;}else{stoneflag = !stoneflag; //交换当前棋子颜色}} 由Rule.Rusult 的返回值进行判断,这几种情况都要重新开始!每下一子就压入堆栈2.Stone 类中方法的实现Stone 类主要实现的就是对棋子的绘图,没什么好说的。

相关文档
最新文档