博文

写一个贪食蛇的思路,可以双人玩的  转(2007-03-21 12:34:00)

摘要:暑假的时候我自己写了个贪食蛇的小程序,觉得效果还好。现在我将自己的思路简单的说一下,我知道好多人都对这个经典的游戏有兴趣的, 我刚开始学编程的时候也是立志自己写一个,这个目标也算是完成了。写我自己的思路,也练练我的表达能力,要是说的不明不白,请多多见谅。下面这个帖子有这个程序的简单介绍和下载地址,可以去看看。《暑假的时候写了个贪食蛇,可单人或者双人玩》,http://www.programfan.com/club/showbbs.asp?id=188529也是我发的,要是地址有错误可以搜索。首先要解决的一个问题是如何来描述蛇的状态。蛇总是在一些小方格上面爬行的,假如横数有cxNumberOfRect个小格, 竖数有cyNumberOfRect个,就共有cxNumberOfRect*cyNumberOfRect个小格。对于每一个小格,经过简单的影射,可以用一个POINT来表示,也可以用一个二维数组的一个元素来表示。而蛇身是由一系列的方格来组成的,自然也可以用一系列的点,或者一个二维数组来描述。先看第一个方法,就是用一系列的点来表示,其实不用组成蛇身的每个点都记录下来(点对应了方格), 只要记录下关键的点就可以的了. 什么点关键的呢, 自然是头, 尾, 和全部拐弯点. 光知道这些关键点还不够, 蛇爬行的时候还有一定的方向, 尾所在的点也有一定的方向, 在尾遇到拐弯点的时候, 方向也要改变, 所以拐弯点也要有一定的方向, 不然尾就不知道转向哪里了. 这时候, 就知道, 应该要有一个结构来记录每个点的状态, 一个元素是坐标, 可以是POINT类型, 一个用来记录方向, 可以是UINT类型, 我自己是这样定义的#define        DS_UP        0x0001#define        DS_DOWN&n......

阅读全文(3339) | 评论:0

用VC实现特定编辑框上对回车键响应(2007-03-17 14:53:00)

摘要: 文/青岛郎锐摘要:本文讲述了在指定的编辑框上能响应从键盘输入回车键的一种方法,对进程内消息的解析、动态获取指定资源ID等技术也作了简要描述。  关键字:Microsoft Visual C++ 6.0、编辑框、回车键、消息、资源   一、引言  在通常的以CEditView为基类的单文档/多文档视图程序中,可以很好的响应键盘输入的回车键,只需比较最近两次的输入的字符,看看最新输入的字符是否内码是13(0x0d,回车键的内码)即可识别出来,而要单独把一个编辑框放入对话框中却根本不响应,这个看似简单的问题在实际应用中还是解决起来比较困难的。尤其是当一个充当表单录入的对话框上有若干个编辑框,这就要求在一个编辑框添完一项表单后用习惯的回车键将该编辑框上的数据读取到内存中去,并自动将光标移动到下一个编辑框中准备填写下一栏表单。无疑这种界面是十分人机友好的,使录入人员不必去执行每填一下表单就去按一下执行读入到缓存功能的按钮的烦琐操作。但上述功能的实现却并不象其演示的功能那样简单,下面本文就对这项技术的实现及附带的其他技术作简要的介绍。  二、不能响应回车键的原因分析  之所以在以CEditView作为基类的程序中可以响应回车键,是由于该程序的视类本身就是一个Edit控件,这就是问题的关键所在。CEditView作为CView的派生类能响应从键盘输入的各种消息,其中有和键盘输入相关的WM_CHAR、WM_KEYDOWN、WM_KEYUP等消息。我们就可以在这些消息的响应函数中灵活地设计程序去捕捉到回车键的输入,并执行响应的操作。  当我们将编辑框作为一个普通的控件放到对话框上时情况就发生了变化。在此我们以CFormView为例,它也是CView的一个派生类,视是一个Form窗体(即对话框),当放有编辑框的窗体有回车键输入时,由于只有编辑框可以接受从键盘输入的字符,所以当键盘按下时统统把消息都发给了编辑框(在Windows下每个窗口、按钮、编辑框都看作一个窗口,都可以接受消息),可以通过ClassWizard在"Object IDs"选中编辑框所对应的ID号,在右边的消息框中可以看出该编辑框并不能响应WM_CHAR等消息,只能用EN_CHANGE事件来做类似的响应。可当我们加入了对该事件的处理函数时,却又将回车键当作控制字符,当输入回车键并不会激发EN_CHANGE事件,也就是说......

阅读全文(2010) | 评论:0

基于TCP/IP的局域网多用户通信 转(2007-03-13 14:58:00)

摘要:基于TCP/IP的局域网多用户通信作者:华东船舶工业学院机械系 袁 渊摘要:基于TCP/IP的网络通信技术实现了面向连接的用户与服务器间点对点异步通信,本文在该基础上应用了多线程以及共享数据结构技术,使网络服务器具有了多用户间数据转发的功能,进而解决了局域网多用户间的通信问题。关键词:TCP/IP;多线程;共享;通信;网络 引言 由于因特网的迅速流行,越来越多的应用程序具备了在网上与其它程序通信的能力。从WIN95开始微软把网络功能融进了它的操作系统,使得应用程序网络通信能力更为普及。因此,微软的TCP/IP协议也就成为网络应用程序基于的首选协议。 一般采用TCP/IP协议的应用程序只实现了单用户与服务器间点对点的连接,而本文在VC6.0的环境下,运用了了多线程以及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息互发问题----依靠服务器的转发功能。通过本文的阐述,希望能对那些需要编写多用户网络通信程序的读者以启发。 一、技术概述 1.1 基于TCP/IP的通信技术 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。下面简要地讲一下设计思路(VC6.0下): 第一部分 服务器端  一、创建服务器套接字(create)。  二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。  三、接受来自用户端的连接请求(accept)。  四、开始数据传输(send/receive)。  五、关闭套接字(closesocket)。第二部分 用户端  一、创建用户套接字(create)。  二、与远程服务器进行连接(connect),如被接受则创建接收进程。  三、开始数据传输(send/receive)。  四、关闭套接字(closesocket)。 通过以上设计思路,我们可以创建一个简单的面向连接的单用户程序。下面,将介绍多线程技术,以使程序支持多用户。 1.2 多线程技术 我们可以把线程看成是一个进程(执行程序)中的一个执行点,每个进程在任何给定时刻可能有若干个线程在运行。一个进程中的所有线程共享该进程中同样的地址空间,同样的数据和代码,以及同样的资源。进程中每个线程都有自己独立的栈空间,和其它线程分离,并且不可互相访问。每个线程在本进程所占的CPU时......

阅读全文(1559) | 评论:0

DirectX学习手记(-)(转)(2007-03-09 22:43:00)

摘要:            HappyFire 2002/8/2 题记:玩了很多的游戏,不禁萌发了自己做游戏的念头,于是7月份从网上收集了N多资料。7月20几号在家开始了闭关式的学习,一直到昨天,我的第一个地图类封装完毕,并乘胜追击到凌晨3点,做好了地图编辑器的0.9版。早上起来觉得有点累(才睡了几个小时,呵呵),于是把这些天的学习经历回忆一下,权当是休息。这个过程是一个从对游戏编程一无所知到略识其理得过程,我想对于像我这样的初学者应该有所帮助吧,至少可以少走些弯路。一. 初识DirectX 在放假之前,我拜读了金点时空softboy的《圣剑英雄传--英雄救美制作手札》一文。此文简述了RPG游戏的基本原理,通俗易懂,看完此文使人觉得游戏制作并非遥不可及,强烈推荐!但此文并没有提到有关DirectX编程的方法。所以做游戏,还要先过DirectX关。于是我花了一天的时间,通读了老王翻译的《DirectX中文手册》,并分析了几个例程,在加上一个多星期的编程经历,总算有了一点感觉。1.基础中的基础 既然我们讨论的是Windows平台下的游戏编程,当然要对Windows编程有所了解。我们使用的是Win32 SDK(API)编程。至于为什么不用MFC? MFC是微软对API的封装(其实何止是封装),它适用于开发有统一程序架构和界面的大型商业软件,但其复杂的机制影响了速度,这对于游戏编程是难以忍受的,因此基于C/C++的Win32API是我们必然的选择。(也听说有用VB开发的游戏,但那毕竟不是主流)。那么对于Win32 API要掌握到什么程度呢?我想只要知道WinMain、窗口类、消息循环、窗口回调函数,能编个简单的HelloWorld就行了,至于GDI只要稍作了解,而Windows的控件基本上用不到。这方面的文章很多,找几篇看看就行了。当然游戏编程不同于一般的编程,所以这其中也有些变化,在下面我会提到的。2.第一个DirectDraw例程 学DirectX当然要先学习它最基本也是最重要的部分DirectDraw。DirectDraw是微软提供的Windows平台下高效的与硬件无关的图形引擎,它提供对显存的直接访问...好了,闲话少说,来看看我的第一个例程(这是在手册上的第一......

阅读全文(1487) | 评论:0

Windows编程的剪贴板机制  (2007-03-08 21:33:00)

摘要:Windows剪贴板  Windows剪贴板是一种比较简单同时也是开销比较小的IPC(InterProcess Communication,进程间通讯)机制。Windows系统支持剪贴板IPC的基本机制是由系统预留的一块全局共享内存,用来暂存在各进程间进行交换的数据:提供数据的进程创建一个全局内存块,并将要传送的数据移到或复制到该内存块;接受数据的进程(也可以是提供数据的进程本身)获取此内存块的句柄,并完成对该内存块数据的读取。  为使剪贴板的这种IPC机制更加完善和便于使用,需要解决好如下三个问题:提供数据的进程在结束时Windows系统将删除其创建的全局内存块,而接受数据的进程则希望在其退出后剪贴板中的数据仍然存在,可以继续为其他进程所获取;能方便地管理和传送剪贴板数据句柄;能方便设置和确定剪贴板数据格式。为完善上述功能,Windows提供了存在于USER32.dll中的一组API函数、消息和预定义数据格式等,并通过对这些函数、消息的使用来管理在进程间进行的剪贴板数据交换。  Windows系统为剪贴板提供了一组API函数和多种消息,基本可以满足编程的需要。而且Windows还为剪贴板预定义了多种数据格式。通过这些预定义的格式,可以使接收方正确再现数据提供方放置于剪贴板中的数据内容。  文本剪贴板和位图剪贴板的使用  这两种剪贴板是比较常用的。其中,文本剪贴板是包含具有格式CF_TEXT的字符串的剪贴板,是最经常使用的剪贴板之一。在文本剪贴板中传递的数据是不带任何格式信息的ASCII字符。若要将文本传送到剪贴板,可以先分配一个可移动全局内存块,然后将要复制的文本内容写入到此内存区域。最后调用剪贴板函数将数据放置到剪贴板:   DWORD dwLength = 100; // 要复制的字串长度HANDLE hGlobalMemory = GlobalAlloc(GHND, dwLength + 1); // 分配内存LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory); // 锁定内存for (int i = 0; i 〈 dwLength; i++) // 将"*"复制到全局内存块 *lpGlobalMemory++ = '*'; GlobalUnlock(hGlobalMemory......

阅读全文(2749) | 评论:0

实现多线程同步的三种方法及示例(2007-03-08 12:37:00)

摘要:1、利用事件对象实现多线程的同步: #include<windows.h>#include<iostream.h> DWORD WINAPI FunProc1(  LPVOID lpParameter   // thread data); DWORD WINAPI FunProc2(  LPVOID lpParameter   // thread data); int ticket=100;HANDLE hEvent;void main(){ HANDLE hThread1,hThread2; hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL); hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hEvent=CreateEvent(NULL,false,false,"ticket"); /*该函数为创建事件对象  *第一个参数为NULL,表示使用缺省的安全性  *第二个参数当为true,必须用ResetEvent人工地将事件对象设置为无信号状态   当为false,在一个等待线程被释放后系统将事件对象自动设置为无信号状态     *第三个参数指定事件对象的初始状态,当为true为有信号状态,否则为无信号状态  *第四个参数为事件对象的命名,当为NULL该对象为匿名对象  */ if(hEvent) {  if(GetLastError()==ERROR_ALREADY_EXISTS)  {   cout<<"the Event is exists!"<<endl;         return;  }&n......

阅读全文(3466) | 评论:0

指针数组(2007-03-08 12:23:00)

摘要: 指针数组 作者:未知    文章来源:未知    点击数: 1456    更新时间:2005-11-3 前面介绍了指向不同类型变量的指针的定义和使用,我们可以让指针指向某类变量,并替代该变量在程序中使用;我们也可以让指针指向一维、二维数组或字符数组,来替代这些数组在程序中使用,给我们在编程时带来许多方便。下面我们定义一种特殊的数组,这类数组存放的全部是指针,分别用于指向某类的变量,以替代这些变量在程序中的使用,增加灵活性。指针数组定义形式:类型标识*数组名[数组长度]例如: char *str[4];由于[ ] 比*优先权高,所以首先是数组形式str[4 ],然后才是与“*”的结合。这样一来指针数组包含4个指针s t r [ 0 ]、s t r [ 1 ]、s t r [ 2 ]、s t r [ 3 ],各自指向字符类型的变量。例如: int *p t r [ 5 ] ;该指针数组包含5个指针p t r [ 0 ]、p t r [ 1 ]、p t r [ 2 ]、p t r [ 3 ]、p t r [ 4 ],各自指向整型类型的变量。[例6-22] 针对指针数组的应用,我们分别用指针数组的各指针指向字符串数组、指向一维整型数组、指向二维整型数组。#include <stdlib.h>#include <stdio.h>m a i n ( ){char *ptr1[4]={"china","chengdu","sichuang","chongqin"};/* 指针数组p t r 1 的4个指针分别依此指向4个字符串* /int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6};for(i=0;i<4;i++)printf("\n%s",ptr1[i]);/依*此输出ptr1数组4个指针指向的4个字符串*/printf("\n");for(i=0;i<3;i++)ptr2[i]=&a[i];/*将整型一维数组a的3个元素的地址传递给指针数组ptr2*/for(i=0;i<3;i++)/*依此输出ptr2所指向的3个整......

阅读全文(1584) | 评论:0

P2P之UDP穿透NAT地机制与完成(2007-03-06 23:15:00)

摘要:论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。 首先先介绍一些基本概念:    NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。    最开始NAT是运行在路由器上的一个功能模块。        最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该是可以重用的。    因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。(基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口)    关于基本的NAT可以参看RFC 1631        另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正讨论的主角。看下图:                            &nb......

阅读全文(1482) | 评论:0

C++网络编程学习笔记(2007-03-05 18:42:00)

摘要:1、IP网络中的每台主机都有一个IP地址;   它是逻辑地址;   因特网上的IP地址具有全球唯一性;   4个字节,192.168.0.162、OSI将网络分为     TCP/IP模型   应用层            应用层   表示层   会话层   传输层            传输层   网络层            网络层   数据链路层        网络接口   物理层    相同层次之间不可以直接通信,是虚拟通信。下层向上层提供服务,实际通信在最底层完成。各层之 间单向依赖。3、DNS是将DNS解析为IP地址。   应用层:Telnet、FTP、HTTP、DNS、SMTP、POP3。   传输层:TCP实现数据的完整性,例如下载安装包;UDP实现数据的及时性,例如网络视频电话。4、数据封装:在数据前面加上特定的协议头部。5、TCP和UDP可以使用同样的端口,1024以下的端口保留给预定义的服务。windows socket只支持 AF_INET网际域.6、在网络协议中需要指定网络字节顺序,TCP/IP使用16位整数和32位整数的高位先存格式,PC机采用的 是低位先存格式。套接字:流式套接字(基于TCP)、数据报套接字(基于UDP),原始套接字。7、基于TCP的socket编程    服务器端程序:   创建套接字;   将套接字绑定到一个本地地址和端口上bind   将套......

阅读全文(4595) | 评论:0

传奇人生:马化腾在深圳奋斗的日子(转)(2007-03-03 21:59:00)

摘要:传奇人生:马化腾在深圳奋斗的日子(转) 点击数:617    发布日期:2006-7-1 18:14:00  【收藏】 【评论】 【打印】 【编程爱好者论坛】 【关闭】     马化腾,这个年仅34岁的年轻人缔造了一个风靡中国的“网络神话”    他,创业7年身家9亿;让2亿中国人改变了沟通习惯,打造了最具知名度的“深圳制造”;与软件巨擘微软争锋中国网络通信市场,被美国《时代周刊》和有线新闻网评为2004年全球最具影响力商界人士之一,他就是年仅34岁的深圳市腾讯计算机系统有限公司CEO马化腾。    潮州小子闯深圳        尽管创造了中国网络领域其中一个最经典的神话,被视为中国IT界的“风云人物”,但当记者见到这位低调的神话创造者的时候,马化腾则更象是一位儒雅而内敛的斯文学者。即使谈到1月份为了赈济南亚海啸灾区,马化腾捐出了自己的“88888”QQ号,并被意外地拍卖出26万元“天价”的时候,他也只是一笑置之。 只有谈到计算机和网络,马化腾才会不时露出开心的笑容和得意。看得出,他是一个完全沉浸在IT感觉的人。1984年,13岁的马化腾跟随父母从海南来到深圳,一个百业待举却充满希望的年轻城市。进入大学后,曾经酷爱天文的马化腾在深圳大学却选择了计算机专业,“毕竟天文太遥远了”他说。在深大的岁月,马的计算机天赋已经让老师同学刮目相看,他既可以成为各种病毒的克星,又可以为学校的PC维护提供解决方案,有时还干些将硬盘锁死的恶作剧,让机房管理员哭笑不得。 谈起大学的趣事,马化腾回味无穷。1993年从深圳大学毕业后,马化腾进入润迅公司,开始做软件工程师,专注于寻呼软件的开发,并一直做到开发部主管的位置上,这段经历使马化腾明确了开发软件的意义就在于实用,而不是写作者的自娱自乐。而也正在这一年,他的大学师兄史玉柱开发的“汉卡”软件已经红遍中国,巨人集团名噪一时。从师兄的身上,马化腾得到了某种启示。马化腾是潮州人,潮州人那种深入到骨髓里的商业细胞开始在马的身上“激活”。当时正是股市最红火的年代,聪明的马化腾于是与朋友一起开发了针对股民的“股霸卡”,结果这个软件一炮而红,在赛格电子市场甚至卖到断市。同一时间,马化腾亦弄潮股海,并在1994年完成了一次飞跃,为......

阅读全文(2757) | 评论:0