第3章 “游戏任我选”
——请求和响应的处理
“游戏任我选”是一个网上游戏选择的模拟平台。本章通过“游戏任我选”的具体实现,来阐述Request、Response对象的使用方法。本章的重点是如何使用ASP内置对象,以及这两个对象的方法、属性和集合的方法。
3.1 系统功能演示
“游戏任我选”可给商家提供游戏展示的平台,管理员把游戏选择列表提供给用户,用户选择喜欢的游戏角色和游戏,提交后服务器端根据用户的选择,进行信息处理并返回给用户所选游戏的各种信息,如图3.1所示。
图3.1 “游戏任我选”主页面效果图
用户进入页面,系统默认用户选择比较热门的游戏——“英雄无敌”和“反恐精英”。当然管理员可以修改代码实现不同的默认方式。图3.2是用户选择扮演“骑士”的角色,并选择所有游戏的情况。
图3.2 “游戏选择反馈”页面效果图
整个ASP页面源程序文件包括gameForm.html和gameOrder_process.asp。下面将循序渐进地讲解如何创建该子系统。
3.2 对 象 概 述
3.2.1 概述
1. HTTP协议的背景知识
为了更好地掌握Request和Response对象,先介绍一些有关HTTP协议的背景知识。
首先介绍的是World Wide Web的工作原理,图3.3给出的是用户使用浏览器请求一个Web页面时的过程。
从图中我们可以清楚地看到有关消息交换的全部内容——请求消息和响应消息,我们在下面将进一步解释。
· 当浏览器从一个网站接收到HTML文件,就会使用超文本传输协议(HTTP,Hypertext Transfer Protocol),协议限定了哪些信息可以在网络之间传送。通常,这种协议限定了浏览器和网站之间交互的方式。
· 从一个网站上接收到主页后,浏览器就建立了一个到网站的连接并发出一个请求,网站接收请求后发出一个响应。因此,HTTP协议也叫做请求响应协议。
· 所有的从浏览器到网站间的通信都是分开的请求和响应对,浏览器总是通过发送请求初始化这种通信过程,因此网站十分被动地由这些请求触发来作出响应。
服务器 |
客户端 |
(4)服务器执行所有必需执行的处理,以生成被发送回客户端的页面。 |
(5)将所生成的页面返回到客户端。 |
(6)浏览器执行所有客户端脚本,并在屏幕上显示HTML输出。 |
(3)服务器接收并读取请求。 |
(2)请求消息通过本地网络服务器、ISP、主要路由器到达驻留Web应用程序的服务器。 |
(1)用户请求页面,浏览 器提交请求信息。 |
图3.3 浏览器请求一个Web页面的过程
一个请求信息包括请求行、头域以及需要的信息体。一个简单的主页请求信息如下所示:
GET /index.htm HTTP/1.1
Host: www.xxx.com
这个请求信息是从www.xxx.com站点上请求index.htm文件。
第一行中,限定了请求的方式、资源名称以及所使用的HTTP协议版本。这里采用的请求方式是GET方式。GET方式是接收一个特定的资源。这里,GET用来接收index.htm文件。其他的请求方式包括POST、HEADER、OPTIONS、DELETE、TRACE以及PUT方式。通常只使用GET和POST方式,其中POST方式主要用来接收HTML的Form中的内容。
第二行是Header,主要是限定资源的网络地址,在这里是:www.xxx.com。特别地,一个请求也会包含多个Header。Header提供了一些针对于请求的附加信息或者请求的起源,有些Header是标准的,但是也有浏览器限定的。
最后,信息体就是响应的主页内容。例如,请求index.htm,那么index.htm的内容就在信息体内。当然有时候信息体的内容也可能是文本文件、Word文件等。
2. Request和Response对象
Request和Response对象是ASP中最为常用的内置对象,Request对象对应于HTTP请求,Response对象对应于HTTP响应。下面将分别针对这两种对象进行必要的介绍。
• Request对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时客户端提供的全部信息。这包括指明浏览器和用户的HTTP变量、在当前域名下存放在浏览器中的Cookie、任何作为查询字符串而附于URL后面的字符串或页面的<Form>段中的HTML控件的值。它也包括使用安全套接协议层(SSL,Secure Socket Layer)或其他加密通信协议的授权访问,及有助于对连接进行管理的属性。
• Response对象:用于访问服务器端所创建的,并发回到客户端的响应信息。为脚本提供HTTP变量,指明服务器及服务器的功能、关于发回浏览器的内容的信息以及任何将为这个域存放在浏览器里新的Cookie。它也提供了一系列的方法用来创建输出,如普遍使用的Response.Write方法等。
3.2.2 Request对象简介
Request对象用来与客户端交互,收集客户端信息或服务器端的环境变量。Request对象获取信息的主要来源有五个方面。
• Client Certification:当用户使用安全认证的时候,Request对象使用这个信息。
• Cookies:所有与站点相关联的Cookie可以通过Request对象传递给服务器。
• Form:通过Request对象,我们可以访问请求页面Form中的有关数据。
• QueryString:请求页面的URL包含了许多信息,通过解析,Request对象可以方便地使用这些数据。
• ServerVariables:当用户连接到服务器,服务器端收集与用户相关的信息,Request对象通过ServerVariables集访问这些信息。
总而言之,内置对象Request负责数据采集。所谓数据采集可以理解为:网页中要求客户输入登录姓名和密码;或者在电子商务、网上订购系统当中,客户在商品列表中选取自己喜欢的商品,并填写订购商品的名称、数目以及自己的信用卡号等,这些信息需要传给服务器端,用来记录和核查。
下面我们具体介绍Request对象的使用方法。Request对象的语法很简单,如下所示:
Request[.collection|property|method](variable)
1. 使用Form获取方法
HTML中的Form格式如下所示:
<Form action=<处理程序名或网址>
method="GET"|"POST"
name=该Form的名称
οnreset=按下reset键所调用的程序
οnsubmit=按下submit键所调用的程序
target=输出窗口或分页名称
……
Form元素
……
</Form>
HTML的Form负责规定信息输入界面及信息输入,而在ASP中,Form则是Request对象获取信息的一种方法。在POST请求方式下,使用Form方法获取HTML的Form表单中的信息。
Request对象的Form集合的语法如下:
Request.Form(element)[(index)|.Count]
其中参数element指定集合要查询的表单元素的名称;index是可选参数,用来访问某参数中多个值当中的一个,它可以是1到Request.Form(parameter).Count之间的任意整数;Count是指集合中元素的个数。
Form集合按请求正文中参数名称来检索。Request.Form(element)的值是请求正文中所有element值的数组,通过调用Request.Form(element).count来确定参数中值的个数。如果参数未关联多个值,则计数为1;如果找不到参数,记数为0。要引用多个值的表格元素的单个值,需要指定index值。index参数可以是从1到Request.Form(element).count中的任意数字。如果引用多个表单参数的一个,而未指定index值,返回的数据将是以逗号分隔的字符串。
下面给出一个非常简单的ASP应用,使用对象从Form集合当中获取数据。读者可以遵循以下步骤,创建一个Request对象的简易应用。
(1)创建一个HTML文件basicform.html并输入如下代码。这里文件当中没有任何ASP代码,因此以HTML作为其扩展名,当然读者也可以用HTM作为其扩展名,效果是一样的。
<HTML>
<HEAD>
<TITLE>Basic Form</TITLE>
</HEAD>
<BODY>
<H1>Basic Input Form</h1>
<Form action="basicform_process.asp" method=POST>
keywords:
<INPUT type="type" name="txtKeywords" size="20"><P>
<INPUT type="Submit" name="cmdSubmit" value="Submit">
</Form>
</BODY>
</HTML>
(2)创建basicform_process.asp文件并输入如下代码,用于处理先前输入的数据。
<HTML>
<HEAD>
<TITLE>Basic Form Request</TITLE>
</HEAD>
<BODY>
<H1>Basic Form - Response</H1>
You entered these keywords
<% =Request.Form("txtKeywords") %>
<P></P>
</BODY>
</HTML>
(3)配置服务器IIS,浏览第一个HTML页面basicform.html。
(4)用户在主页面basicform.html输入信息,点击按钮,触发得到第二个页面,该页面显示先前输入的信息。
在程序basicform_process.asp加粗部分,我们使用到Request对象:
<% =Request.Form("txtKeywords") %>
这里使用Form获取方法,获取变量txtKeywords当中的字符串信息。
2. QueryString获取方法
Request对象的QueryString集合语法如下:
Request.QueryString(variable)[(index)|.Count]
利用QueryString方法获取标识在URL后面的所有返回变量及其值,可以进行网页之间的信息传递。
下面,我们给出一个实例,用来介绍Request对象的QueryString获取方法。
(1)首先创建主页面index.asp,并输入如下代码。
<HTML>
<HEAD>
<TITLE>QueryString用法示例</TITLE>
</HEAD>
<BODY>
<A href="querystring.asp?name=张三&age=22">显示</a>
</BODY>
</HTML>
(2)然后,创建信息显示页面querystring.asp,并输入如下代码。
<HTML>
<HEAD>
<TITLE> QueryString用法示例</TITLE>
</HEAD>
<BODY>
<%
Dim name,age
name=Request.QueryString("name")
age=Request.QueryString("age")
%>
你好,你的姓名是<%=name%>,你的年龄是<%=age%>
</BODY>
</HTML>
(3)配置IIS,访问index.asp进入主页面,用户在主页面用鼠标单击“显示”即可得到信息显示页面。
本例中,当客户端发出如下请求时,QueryString将可得到name和age两个变量的值。
<A href="querystring.asp"?name=白芸&age=22>
而信息显示页面通过QueryString集合来获取相应变量的值。
name=Request.QueryString("name")
age=Request.QueryString("age")
3. ServerVariables集合
ServerVariables集合用于获取预定环境变量的值,其语法结构如下:
Request.ServerVariables (server environment variable)
这里有多种服务器环境变量,主要内容如表3.1所示。
表3.1 服务器环境变量说明
服务器环境变量 | 说明 |
ALL_HTTP | 所有由客户端发送的HTTP报文头 |
CONTENT_TYPE | 内容的数据类型。用于带有附加信息的询问,例如HTTP程序GET、POST和PUT |
GATEWAY_INTERFACE | 服务器使用的CGI规格的修订版。格式为CGI或其修订版 |
HTTP_REFERER | 包含客户使用超链接的Internet地址 |
HTTP_USER_AGENT | 包含网站访问者使用的浏览器类型 |
LOGON_USER | 登录Windows NT的用户账号 |
PATH_TRANSLATED | 当前ASP程序所映射的物理地址 |
QUERY_STRING | 包含URL问号后的内容 |
REMOTE_ADDR | 远程网站访问者的IP地址 |
REMOTE_HOST | 发出请求的主机名。如果服务器没有该信息,它将设置REMOTE_ADDR,使之为空 |
REQUEST_METHOD | 包含提出请求的方法,相当于HTTP的GET、HEAD、POST方法等 |
SCRIPT_NAME | 包含ASP的脚本运行的虚拟路径,常用于自参考URL |
SERVER_NAME | 服务器名称,DNS别名或IP地址 |
SERVER_PORT | 发送请求的端口号 |
URL | 给出URL的基本段 |
使用ServerVariables集合中的各变量可以获得许多有用的环境信息。例如,如果客户端发送一个报文头,可以使用HTTP_的环境变量参数来获取报文头的值。
SomeNewHeader : SomeNewValue
调用Request对象的ServerVariables集合获取该信息:
<% Request.ServerVariables("HTTP_SomeNewHeader") %>
另外,在使用Request对象时可以不使用其方法和属性,而是直接请求变量。例如,如下程序段可以获取访问者IP地址:
<%@ Language=VBScript %>
<%
Dim userIP
userIP = Request("REMOTE_ADDR")
%>
服务器会按照以下顺序在Request对象的集合中进行搜索:QueryString、Form、Cookies、ClientCertificate、ServerVariables。如果遇到重名则返回第一个变量所对应的值。
下面给出一个简单的实例(ServerVariables.asp),用以显示某些环境服务器变量的值:
<HTML>
<!-- This example displays the content of several ServerVariables. -->
ALL_HTTP server variable =
<%= Request.ServerVariables("ALL_HTTP") %> <BR>
CONTENT_LENGTH server variable =
<%= Request.ServerVariables("CONTENT_LENGTH") %> <BR>
CONTENT_TYPE server variable =
<%= Request.ServerVariables("CONTENT_TYPE") %> <BR>
QUERY_STRING server variable =
<%= Request.ServerVariables("QUERY_STRING") %> <BR>
SERVER_SOFTWARE server variable =
<%= Request.ServerVariables("SERVER_SOFTWARE") %> <BR>
</HTML>
而以下代码(ServerVariables_table.asp)使用循环将存在的服务器环境变量值显示在表格里面。
<TABLE BORDER="1">
<TR><TD><B>Server Variable</B></TD><TD><B>Value</B></TD></TR>
<% For Each strKey In Request.ServerVariables %>
<TR>
<TD><%= strKey %></TD>
<TD><%= Request.ServerVariables(strKey) %></TD>
</TR>
<% Next %>
</TABLE>
页面运行结果如图3.4所示。
图3.4 ASP程序运行结果-服务器环境变量值
3.2.3 Response对象简介
Response对象用于向客户端浏览器发送数据,用户可以使用该对象将服务器的数据以HTML的格式发送到用户端的浏览器,它与Request组成了一对接收、发送数据的对象,这也是实现动态的基础。
Response对象的语法如下:
Response.collection|property|method
例如:
Response.Write("userName")
该语句的目的是输出赋予变量userName的字符串。
Response对象有许多属性和方法,下面将详细介绍。
1. Response对象的方法
Response对象方法包括:Write方法、Redirect方法。
Write方法
Write方法的作用是以一个字符串的形式向客户端输出信息,Write方法的语法如下:
Response.Write variant
例如:
<%
Response.Write("你的名字是张三")
%>
该代码段在客户端浏览器中显示字符串“你的名字是张三”。结合前面章节所学的知识,可以将Response和Request对象搭配使用,以显示客户输入的信息,例如:
<%
Request.Form("userName")
Response.Write("你的名字是"&userName)
%>
当用户在表单中输入姓名“张三”后,提交表单,服务器对该ASP程序处理后在浏览器中显示字符串“你的名字是张三”。
另外,也可以使用下面的方式来显示字符:
<%
="你的姓名是"&Request.Form("userName")
%>
注意:这两种方法的显示结果都是一样的。
Response.Write是在ASP页面中产生HTML输出的一种很简单的方式。这种方法需要在ASP定界符内调用,输出的所有内容必须包括在双引号字符内,就像所有其他字符串函数一样,如下代码所示:
Response.Write"<A href=""http://www.microsoft.com"">"
当中许多双引号,外侧的一对用以表明字符串的开始和结束。字符串内的两对双引号指示实际输出的双引号。这句话将产生如下的HTML:
<A href="http://www.microsoft.com">
在打印百分号时可能遇到一个问题,如在ASP编程当中,如下代码:
Response.Write "<Table width = 100%>"
ASP引擎看到字符串内的%>,会误认为要结束代码块,解决的方法是使用反斜杠将尖括号“转义”,如下所示:
Response.Write "<Table width = 100% />"
反斜杠在代码运行的时候并不打印出来,这样便可以获得想要的结果:<Table width = 100%>。
注意:Response.Write并不会自动在结果HTML中自动添加换行符。如果需要换行,必须在Response.Write语句中追加BR或P标记。为了使文本在文件中以多行放置,可以追加Chr(13)&Chr(10)创建一个回车和换行的组合,添加这些换行的符号,将代码分隔开,使程序的可读性更强。
Redirect方法
使用Response对象的Redirect方法可以把客户引导到另外一个页面。Redirect方法的语法如下:
Response.Redirect URL
URL可以是本地路径或远程路径,例如:
Response.Redirect "http://www.microsoft.com "
将使用户的浏览器转向微软公司的站点。
2. Response对象的属性
Response对象的属性包括:Buffer属性、ContentType属性、Charset属性、Expires属性及ExpiresAbsolute属性等。
Buffer属性
Buffer属性用于指示是否输出缓存中的页面。当缓冲页输出时,只有当前页的所有服务器脚本处理完毕或者调用了Flush或End方法后,服务器才将响应发送给客户端浏览器。服务器将输出发送给客户端浏览器后,就不能再设置Buffer属性了,因此,通常在ASP文件的第一行使用Response.Buffer。
当服务器运行一大段ASP程序时,为了让客户端得到一个连续显示的页面,可以适当使用Response对象的Buffer属性。例如:
<% @language=vbscript%>
<%
Response.Buffer=true
%>
<HTML>...... //一段HTML原文(A)
<%
...... //一段执行时间很长的ASP脚本
%>
...... //一段HTML文本(B)
<%
Response.Flush
%>
如果不把Buffer属性设为True,那么客户端会首先看到(A)的HTML画面,然后等了一段时间,最后才看到(B)画面。这样处理不怎么理想,所以将Buffer属性赋值为True,则(A)的输出先保存在服务器端的缓冲区里面,然后处理完脚本,再把(B)中的内容添加进来,最后调用Response对象的Flush方法,将缓冲区内容一次性发送给客户端。另外,Buffer属性还可以起到纠错的能力,因此HTML内容在处理过程当中,在还没有发送到客户端时,可以使用Clear方法清空服务器缓冲区中的所有HTML文本。
与Buffer属性相关的方法有Clear、End及Flush方法等。
• Clear方法:可以用于清除缓冲区当中所有HTML内容,但Clear方法只能清除响应正文,而并不能清除响应标题。
• End方法:如果用户离开页面,服务器端放弃运行该页面。类似地,如果在页面上某一处不再需要作继续处理,可以通过调用Response对象的End方法退出页面运行。End方法使Web服务器停止脚本处理,并返回当前结果。文件中剩余的内容将不予以处理。如果Response对象的Buffer属性设置为True,这时End方法即把缓存中的内容发送到客户并清除缓冲区。例如:
<%
Response.buffer=true
On error resume next
Err.clear
If Err.number<>0 Then
Response.Clear
Response.End
End If
%>
• Flush方法:使缓冲区立即输出当前内容。它必须是把Buffer属性设置为True时才能使用,否则会产生一个运行模式错误。
ContentType属性
ContentType属性指定服务器响应的HTTP内容类型。如果未指定ContentType,默认为 text/HTML。
Charset属性
Charset属性将字符集名称附加到Response对象的content-type后。
例如:
<% Response.Charset="gb2312") %>
将产生以下结果:
content-type:text/html; Charset=gb2312
这里无论字符串表示的字符集是否有效,该语句都会将其插入content-type标题中。如果某个页包含多个含有Response.Charset 的标记,则每个Response.Charset都将替代前一个CharsetName。这样,字符集将被设置为该页中Response.Charset的最后一个实例所指定值。
Expires属性
Response对象的Expires属性指定了在浏览器上缓冲存储的页面的有效时间。如果用户在某个页面过期前又回到此页,就会显示缓冲区中的页面。如果设置Response.Expires=0,则可使缓存的页面立即过期。这是一个较为实用的属性,当客户通过ASP的登录页面进入Web站点后,可以利用该属性使登录页面立即过期,以确保安全。
ExpiresAbsolute属性
与Expires属性不同的是,Response对象的ExpiresAbsolute属性指定缓存于浏览器中的页面的确切到期日期和时间。在未到期之前,若用户返回到该页,就会显示缓冲区中的页面。如果未指定具体时刻,则该页面在当天午夜到期。如果未指定年、月、日,则该主页在脚本运行当天的指定时间到期。例如,以下代码指定的页面将在2004年12月1日上午9点1分30秒到期。
< % Response.ExpiresAbsolute=#Dec 1,2004 9:01:30# %>
3.3 “游戏任我选”
3.3.1 创建主页面
“游戏任我选”的主页面是gameOrder.html,源代码请登录http://www.khp.com.cn网站查询。
首先,我们设置了表单提交的方式,表单提交后由gameOrder_process.asp进行处理:
<Form action="gameOrder_process.asp" method=POST id=form1 name=form1>
.....
</Form>
然后,制作供用户输入用户名的文本框。
<INPUT style="WIDTH: 108px; HEIGHT: 22px" size =13 name="txtNickName" value=Jason >
接下来制作供用户选择游戏角色的单选框。将标示各类不同游戏角色的单选框统一命名为optRole,以便供gameOrder_process.asp进行处理。
<Form action="gameOrderProcess.asp" method=post language="" id=form1 name=form1>
.....
<B><FONT style="BACKGROUND-COLOR: #Lavender" Color=Indigo>喜欢扮演的角色:</FONT></span></B>
.....
<INPUT type="radio" name="optRole" value="a"><FONT
Color=firebrick> 矮人<BR>
<INPUT type="radio" name="optRole" value="b"> 弓箭手<BR>
<INPUT type="radio" name="optRole" value="c" CHECKED> 法师<BR>
<INPUT type="radio" name="optRole" value="d"> 天使<BR>
<INPUT type="radio" name="optRole" value="e"> 骑士<BR>
</FONT><P><b>
再接下来,制作一系列的复选框,供用户选择自己所喜爱的游戏,对不同的复选框分别命名为chkGame*,供gameOrder_process.asp进行处理。
<FONT Color=Indigo>
自己喜爱的游戏:</FONT>
</b></P>
<Table cellpadding=4 width="439">
<TR>
<TD width="151"><FONT Color=firebrick>
<INPUT type="checkbox" name="chkGame1"
value="Y" checked>英雄无敌4<BR>
<INPUT type="checkbox" name="chkGame2"
value="Y" checked>反恐精英 <BR>
<INPUT type="checkbox" name="chkGame3"
value="Y">魔兽3:冰封王座<BR>
<INPUT type="checkbox" name="chkGame4"
value="Y">樱花大战3<BR></FONT>
</TD>
<TD width="119"><FONT Color=firebrick>
<INPUT type="checkbox" name="chkGame5"
value="Y">三国志9<BR>
<INPUT type="checkbox" name="chkGame6"
value="Y">仙剑奇侠传三<BR>
<INPUT type="checkbox" name="chkGame7"
value="Y">仙剑奇侠传二<BR>
<INPUT type="checkbox" name="chkGame8"
value="Y">FIFA足球<BR></FONT>
</TD>
<TD width="137"><FONT Color=firebrick>
<INPUT type="checkbox" name="chkGame9"
value="Y">E3大展—2003<BR>
<INPUT type="checkbox" name="chkGame10"
value="Y">英雄无敌4<BR>
<INPUT type="checkbox" name="chkGame11"
value="Y">星际争霸<BR>
<INPUT type="checkbox" name="chkGame12"
value="Y">大话西游<BR></FONT>
</TD>
</TR>
</Table>
最后,我们设置一个按钮,将按钮命名为cmdSubmit,该按钮触发动作的发生。
<INPUT type="submit" name="cmdSubmit" value="提 交" style="FLOAT: left">
3.3.2 使用Request对象采集数据
“游戏任我选”的数据处理页面是gameOrderProcess.asp,源代码请登录http://www.khp.com.cn网站查询。该ASP程序通过Request对象采集数据,获取各种用户输入的信息,进行数据处理并显示。
该ASP程序当中,首先我们使用Option Explicit语句,用来强制声明VBScript中使用的所有变量,拼写错误的变量名称将在编译时而不是在运行时捕获。
Option Explicit
注意:Option Explicit语句必须在声明任何变量或程序之前使用。
然后,我们声明了一组变量用于处理各种用户个人信息值。
· string类型的变量roleChoosed;
· currency类型的变量experience,用于保存各种角色对应的生命值;
· 整数变量i用于循环;
· 数组类型的变量a_strGame(12),用于保存游戏名称;
· 数组类型的变量a_strDate(12),用于保存游戏时间。
<%@ Language=VBScript%>
<%
Option Explicit
dim roleChoosed 'as string
dim experience 'as Currency
dim i 'as variant
dim a_strGame(12) 'as array of string
dim a_strDate(12) 'as array of string
.....
%>
接下来,我们将游戏的名称加载到保存游戏名称的数组a_strGame(12)中。当然这里可以用一个数据库来完成,但是目前还没有数据库,所以使用下面这段代码完成这一过程。
a_strGame(1) = "英雄无敌4"
a_strDate(1) = "2000年"
a_strGame(2) = "反恐精英"
a_strDate(2) = "2001年"
a_strGame(3) = "魔兽3:冰封王座"
a_strDate(3) = "2001年"
a_strGame(4) = "樱花大战3"
.....
然后,利用Request对象获取请求页面即主页面中的optRole变量值,将用户选择的角色名称字符串存储在变量RoleChoosed当中。接着将保存生命值的变量experience赋予对应角色的生命值。在这里我们使用了Select…Case分支语句。
<%
'通过Request对象访问请求页面中Form集合中optRole变量的信息
Select Case Request.Form("optRole")
Case "a"
RoleChoosed = "矮人"
experience=70
Case "b"
RoleChoosed = "弓箭手"
experience=75
Case "c"
RoleChoosed = "法师"
experience=80
Case "d"
RoleChoosed = "天使"
experience=90
Case "e"
RoleChoosed = "骑士"
experience=89
End Select
%>
在获取各种表单提交信息后,可以使用多种方法在网页当中输出获取的变量信息。为了在网页上输出用户的名称,使用了Response.Write方法。
<FONT Color="#990000">
<STRONG><% Response.Write(Request.Form("txtNickName")) %></STRONG>,你好!
</FONT>
另外,也可以使用直接显示变量的方法,显示用户选择的角色信息和相应的生命值数据:
<STRONG><%= RoleChoosed%></STRONG>
.....
生命值:<% = experience%>
为了给读者一个总体的印象,我们给出该ASP程序的源代码如下。
<%@ Language=VBScript%>
<%
Option Explicit
dim roleChoosed 'as string
dim experience 'as Currency
dim i 'as variant
dim a_strGame(12) 'as array of string
dim a_strDate(12) 'as array of string
a_strGame(1) = "英雄无敌4"
a_strDate(1) = "2000年"
a_strGame(2) = "反恐精英"
a_strDate(2) = "2001年"
a_strGame(3) = "魔兽3:冰封王座"
a_strDate(3) = "2001年"
a_strGame(4) = "樱花大战3"
a_strDate(4) = "2003年"
a_strGame(5) = "三国志9"
a_strDate(5) = "2001年"
a_strGame(6) = "仙剑奇侠传三"
a_strDate(6) = "2002年"
a_strGame(7) = "仙剑奇侠传二"
a_strDate(7) = "2001年"
a_strGame(8) = "FIFA足球"
a_strDate(8) = "2004年"
a_strGame(9) = "E3大展—2003"
a_strDate(9) = "2001年"
a_strGame(10) = "英雄无敌4"
a_strDate(10) = "2003年"
a_strGame(11) = "星际争霸"
a_strDate(11) = "2001年"
a_strGame(12) = "大话西游"
a_strDate(12) = "2000年"
%>
<HTML>
<HEAD>
<TITLE>游戏选择**虚拟游戏社区**</TITLE>
</HEAD>
<BODY bgColor=Lavender>
<H1><FONT face=华文新魏 Color=indigo>虚拟游戏社区</FONT></H1>
<P><FONT Color="#990000">
<STRONG><% Response.Write(Request.Form("txtNickName")) %></STRONG>,你好!</FONT>
</P>
<Table width=100%>
<TD align=left>你选择扮演的游戏角色是:</TD>
<TR>
<TD align=left>
<FONT Color="#990000">
<%
'通过Request对象访问请求页面中Form集合中optRole变量的信息
Select Case Request.Form("optRole")
Case "a"
roleChoosed = "矮人"
experience = 70
Case "b"
roleChoosed = "弓箭手"
experience = 75
Case "c"
roleChoosed = "法师"
experience = 80
Case "d"
roleChoosed = "天使"
experience = 90
Case "e"
roleChoosed = "骑士"
experience = 89
End Select
%>
<STRONG><%= roleChoosed%></STRONG></FONT>
</TD>
<TD align=right>
生命值:<% = experience%>
</TD>
</TR>
<FONT Color="#990000">
<TR><TD align =left>你选择的游戏有:</TD></TR>
<%
For i=1 to 12
'通过Request对象访问请求页面中Form集合中chkGame变量的信息
if Request.Form("chkGame" & i)= "Y" then
%>
<TR>
<TD><% =a_strGame(i)%></TD>
<TD align = right>
选择日期:<%=a_strDate(i)%>
</TD>
</TR>
<%
End if
next
%> </font>
<TR>
</b></TD>
</TR>
</table>
<h3 align=right>
当前日期:
<%
Response.Write date()
%>
</h3>
</BODY>
</HTML>
3.3.3 服务器配置
启动IIS服务器,建立一个新的虚拟目录。使用虚拟目录创建向导,将虚拟目录别名命名为“游戏任我选”,并指定要发布到网站上的内容的位置路径,如图3.5所示。
图3.5 使用IIS创建“游戏任我选”虚拟目录
3.4 完善系统界面——使用Cookie
3.4.1 增添新功能
增添用户信息显示页面。在用户“游戏选择反馈”页面增添“生成报表”按钮。用户在“游戏选择反馈”页面,单击“生成报表”按钮后,显示“用户信息显示”页面,显示报表,效果如图3.6所示。
图3.6 “订单显示”页面效果图
3.4.2 Cookie介绍
Cookie是服务器端和客户端之间传送的普通HTTP头,可保存也可不保存在客户的硬盘上。如果需要保存,每一个Cookie是文件大小不超过4KB的文本文件,多个Cookie可保存到同一个文件中。
Cookie是Web服务器嵌在用户Web浏览器中,用来代表用户的令牌。当下次同一浏览器请求一页时,它将发送从Web服务器收到的Cookie。Cookie允许有一组信息与用户关联。
实际上,Cookie是一个标签,当用户访问一个需要惟一标识的网站时,服务器端应用程序会在用户的硬盘上留下一个标记,每当用户下一次访问同一个站点时,站点的页面会查找这个标记。每个网站都有自己的标记,标记的内容可以随时读取,但只能由该网站的页面完成。每个站点的Cookie与其他所有站点的Cookie存在同一文件夹中的不同文件内(在Windows目录下的Cookie文件夹中可以找到它们)。一个Cookie就是一个惟一标识客户的标记,Cookie可以包含在一个对话期或几个对话期之间某个Web站点的所有页面共享的信息,使用Cookie还可以在页面之间交换信息。
其中,Request提供的Cookies集合允许用户检索在HTTP请求中发送的Cookie的值。Response的Cookies集合可以设置向客户端写入Cookies。这项功能经常被使用在要求认证客户密码以及电子公告板、Web聊天室等ASP程序中。
3.4.3 浏览器配置
大多数浏览器在安装时默认配置为接受Cookie,也只有当浏览器被设置为接受Cookie,包含Cookie的ASP程序才可以正常运行。
在IE 6.0中,打开IE的“工具”菜单的“Internet属性”,专门增加了“隐私”标签来管理Cookie,如图3.7所示。
IE 6.0的Cookie策略可以设定成从“阻止所有Cookie”、“高”、“中高”、“中”、“低”和“接受所有Cookie”六个级别(默认级别为“中”),分别对应从严到松的Cookie策略。单击图3.7中的“编辑”,还可以编辑某些特定的网站,将其设定为“一直可以或永远不可以使用Cookie”。
图3.7 IE6.0对Cookie的管理
通过IE 6.0的Cookie策略,就能设定浏览网页时的Cookie规则,以便更好地保护自己的信息,增加使用IE的安全性。例如,在默认级别“中”时,IE允许网站将Cookies放入本地电脑,但拒绝第三方的操作。
3.4.4 Cookie的使用方法
1. 语法
Response对象的Cookie集合的语法如下:
Response.Cookies(cookie)[(key)|.attribute] = value
· 参数Cookie指定用于被更改的Cookie的名称;
· key为可选参数,如果指定了,则Cookie成为一个字典,并将value值赋值给key;
· value是被设置给Cookie的值。
2. 如何设置、访问、修改和清除Cookie
设置Cookie
要学习的第一项任务就是如何在访问者的系统中设置Cookie值。要设置Cookie的值,可使用Response.Cookies。如果Cookie不存在,Response.Cookies将创建新的Cookie。例如,要向浏览器发送一个有关联值(Mars)的Cookie名(planet),可使用下列命令,这些命令必须出现在Web页的<HTML>标记前:
<% Response.Cookies("planet")="Mars" %>
如果只希望Cookie在当前的用户会话中被使用,则只需向浏览器发送Cookie。但是,如果要在用户已经终止或重新启动浏览器之后确认用户,就必须强制浏览器将Cookie存储在计算机的硬盘上。要保存Cookie,可使用Response.Cookies的Expires属性并将日期设置为此后的某一天:
<%
Response.Cookies("planet") = "Mars"
Response.Cookies("planet").Expires = "January 1, 1999"
%>
Cookie可有多个值,这样的Cookie被称为一个带索引的Cookie,每个Cookie值都被赋予一个关键字。我们也可以设置一个特定的Cookie关键字的值,例如:
<% Response.Cookies("planet")("Mars")="SpaceMissions" %>
如果某个现有的Cookie具有关键字值,但Response.Cookies未指明该关键字的名称,则该关键字值将被删除。类似地,如果某个现有的Cookie没有关键字值,但Response.Cookies指明了关键字的名称和值,则现有的Cookie值将被删除,并生成新的key-value对。
在下面给出的代码中,我们建立的Cookie具有访问者上次来到主页留下的个人信息,包括用户名、用户选择游戏角色等相关私人信息。
<%
Response.Write date()
'给cookies赋值
Response.Cookies("nick")=Request.Form("txtNickName")
Response.Cookies("rl")=roleChoosed
Response.Cookies("exp")=experience
%>
访问Cookie
创建Cookie后,可以使用如下语句访问一个Cookie值。
<% =Request.Cookies("nickName") %>
我们可以通过包含一个key值来访问Cookie字典的子关键字。如果访问Cookie时,没有指定key,则所有的关键字都会作为单个查询字符串返回。例如,如果nickName有两个关键字,First和Second,而在调用Request.Cookies时并没有指定其中任何一个关键字,那么将得到以下字符串。
First=firstkeyvalue & Second=secondkeyvalue
如果客户端浏览器发送了两个同名的Cookie,那么Request.Cookie将返回其中路径名较深的一个。例如,如果有两个同名的Cookie,但其中一个的路径属性为/www/,而另一个为/www/home/,客户端浏览器同时获得两个Cookie都发送到/www/home目录中,但Request.Cookie只返回第二个Cookie。
修改和清除Cookie
一旦创建了Cookie,修改其值是非常容易的,和创建Cookie所使用的方法一样,使用新值将旧值替换。
<%
dim blnNewCookie 'as boolean
blnNewCookie=(Request.Cookies("LastVisit")="")
Response.Cookies("LastVisit")=Date & "" & Time
Response.Cookies("LastVisit").Expires=DateAdd("d",1,Date)
%>
<HTML>
<HEAD>
<TITLE>Create & Update a Cookie</TITLE>
</HEAD>
<BODY>
<%
if blnNewCookie then
%>
Cookie已经创建
<%
else
%>
Cookie已经更新
<%
End if
%>
value:<% Response.Write Request.Cookies("LastVisit")%> <BR>
</BODY>
</HTML>
清除Cookie也很简单。把其值更新成一个空字符,Cookie将消失。
Request.Cookies("LastVisit")=""
设置Cookie路径
由ASP存储在用户的Web浏览器中的每个Cookie都包含路径信息。当浏览器请求的文件的位置与在Cookie中指定的路径相同时,浏览器自动将Cookie转发给服务器。默认情况下,Cookie路径与包含最初生成Cookie的ASP文件的应用程序名对应。例如,如果在名为UserApplication的应用程序中的ASP文件生成了一个Cookie,那么每当用户的Web浏览器在此应用程序中获取文件时,除其他在路径/User Application下的Cookie外,浏览器还要将该Cookie转发给服务器。
要给Cookie声明一个不同于默认的应用程序路径的路径,可以使用ASP的Response.Cookies集合的Path属性。例如,下列脚本将路径SalesApp/Customer/Profiles/赋予名为Purchases的Cookie:
<%
Response.Cookies("Purchases") = "12"
Response.Cookies("Purchases").Expires = "January 1, 2001"
Response.Cookies("Purchases").Path =
"/SalesApp/Customer/Profiles/"
%>
每当包含Purchases Cookie的Web浏览器请求位于路径/SalesApp/Customer/Profiles/或其子目录的文件时,浏览器将Cookie转发给服务器。
许多Web浏览器,包括Microsoft Internet Explorer和Netscape浏览器,保留Cookie路径的大小写。也就是说,如果一个被请求的文件的大小写与保留的Cookie路径不同,那么浏览器是不会向服务器转发Cookie的。例如,对于ASP,虚拟目录/TRAVEL和/travel是相同的ASP应用程序,而对于保留URL的大小写的浏览器而言,/TRAVEL和/travel则是两个不同的应用程序。应确保ASP文件的所有URL具有相同的大小写,以保证用户的浏览器能够转发存储的Cookie。
如果需要,可使用下列语句设置Cookie路径,使得无论应用程序或路径是什么,只要用户的Web浏览器向服务器请求文件,就会转发Cookie:
Response.Cookies("Purchases").Path = "/"
但是,请注意,在不区分应用程序的情况下向服务器发送Cookie,如果Cookie包含不应被指定应用程序以外的程序访问的敏感信息,就可能产生安全性问题。
3.4.5 如何完善“游戏任我选”
1.添加“生成订单”按钮
在“游戏选择反馈”页面添加一个按钮,命名为btnMakeOrder。
<INPUT type=submit value="生成报表" name="btnMakeOrder">
2.使用Cookies保存用户信息
<%
Response.Write date()
'给cookies赋值
Response.Cookies("nick")=Request.Form("txtNickName")
Response.Cookies("rl")=roleChoosed
Response.Cookies("exp")=experience
%>
3.创建“用户信息显示”页面
新建页面makeOrder.asp,并输入如下代码。
<%@ language=VBScript%>
<HTML>
<HEAD>
<TITLE>游戏选择**虚拟游戏社区**</TITLE>
</HEAD>
<BODY bgColor=Lavender>
<h1><FONT face=华文新魏 Color=indigo>虚拟游戏社区</FONT></h1>
<table cellspacing=0 cellpadding=2 width=490 border=1
borderColorlight="#CCCC99" borderColordark="#FFFFFF">
<TR align="center" valign="bottom" bgColor=Ivory>
<TD height="18" width="80"><font Color=indigo>用户名</font></TD>
<TD height="18" width="80"><font Color=indigo>扮演角色
</font></TD>
<TD height="18" width="80"><font Color=indigo>经验值</font></TD>
</TR>
<TR align="center" valign="bottom" bgColor=Ivory>
<TD height="18" width="80"><%= Request.Cookies("nick") %></TD>
<TD height="18" width="80"><%= Request.Cookies("rl") %></TD>
<TD height="18" width="80"><%= Request.Cookies("exp") %></TD>
</TR>
</table>
<P> </P>
</BODY>
</HTML>
此代码的工作原理是通过对Cookie的访问,在表格的相应位置显示用户名及游戏角色等相关用户个人的信息。
本章介绍的只是动态网页处理基本响应和请求的一些基本知识,还有许多内容需要进一步了解。这些对象将贯穿全书,随着使用的深入,读者将越来越清楚地了解它们,同时将继续探索ASP的扩展能力并掌握它的精华。
3.5 本章知识点回顾
Request对象获得客户端窗口通过HTTP请求传递给服务器值。 下面列举了Request对象的方法、属性和集合。 | |
Method方法 | |
BinaryRead方法 | 当数据作为POST请求的一部分发往服务器时,从客户请求中获得count字节的数据,返回一个Variant数组(或者SafeArray)。如果ASP代码已经引用了Request.Form集合,这个方法就不能用。同样,如果用了BinaryRead方法,就不能访问Request.Form集合。 语法: variant = Request.BinaryRead(count) 示例: 将请求内容放置到数组当中。 <% Dim binread Dim bytecount bytecount = Request.TotalBytes binread = Request.BinaryRead(bytecount) %> |
Property属性 | |
TotalBytes属性 | 只读,返回由客户端发出的请求的整个字节数量。 语法: Counter = Request.TotalBytes 示例: 将Request对象当中的字节数赋值于某一变量bytecount。 <% Dim bytecount bytecount = Request.TotalBytes %> |
Collection集合 | |
ClientCertificate 集合 | Client Certificate集从Web浏览器发布的请求中检索(X.509标准中指定的)验证域。如果Web浏览器使用SSL3.0/PCT1协议,即它使用的以https://而不是http://开头的URL连接服务器并且服务器请求认证,则浏览器发送认证域,每个成员均为只读。 语法: Request.ClientCertificate( Key[SubField] ) 示例: 验证客户端认证主题的组织名。 <% If (Request.ClientCertificate("Subject")="Msft") Response.Write("Good Choice!") End if %> |
Cookies集合 | Cookies集使你能获得HTTP请求中发送的Cookie的值,每个成员均为只读。 语法: Request.Cookies(cookie)[(key)|.attribute] 示例: 在网页中显示myCookie的值。 Here is the value of the Cookie named myCookie: <%= Request.Cookies("myCookie") %> |
Form集合 | 当客户端浏览器传递在使用POST方法的HTML表单中输入的值时,表单元素和值都保存在FORM集中。然后使用FORM集获得客户端传递给服务器的值,每个成员均为只读。 语法: Request.Form(element)[(index)|.Count] 示例: 网页中显示相应的欢迎信息。 Welcome, <%= Request.Form("firstname") %>. Your favorite flavor is <%= Request.Form("flavor") %>. |
QueryString集合 | 该集合用来获取HTTP查询字符串中变量的值。HTTP查询字符串由值后面跟着的问号(?)来指定。在查询字符串中,使用&号分隔每套变量和值。使用等号(=)把值分配给变量,每个成员均为只读。 语法: Request.QueryString(variable)[(index)|.Count] 示例: 客户端请求为: /scripts/directory-lookup.asp?name=fred&age=22 使用以下脚本: Welcome, <%= Request.QueryString("name") %>. Your age is <%= Request.QueryString("age") %>. 页面返回的结果是: Welcome, Fred. Your age is 22. |
ServerVariables 集合 | 获取预设环境变量的值,每个成员均为只读。 语法: Request.ServerVariables (server environment variable) 示例: <% Request.ServerVariables("HTTP_SomeNewHeader") %> |
Response对象用以把输出发送给客户端。对象被内置给ASP处理引擎,使用时不必实例化它。下面列举了Response对象的方法、属性、集合。 | |
Method方法 | |
Addheader方法 | 用指定的值添加HTML首标。这种方法总是给响应添加一个新的HTTP首标。它不会代替现有的有相同名称的首标。一旦添加了首标,就不能删除它。 语法: Response.AddHeader name, value 示例: 获取客户端是否使用BASIC基本权限。 <% Response.Addheader "WWW-Authenticate", "BASIC" %> |
AppendToLog方法 | 该方法给请求的Web服务器日志条目末尾添加一个字符串。 语法: Response.AppendToLog string |
Binary方法 | 该方法把给定的信息写给当前的HTTP输出,而没有进行字符集转换。 语法: Response.BinaryWrite data 示例: 你如果获得一个对象产生字节数组,可以调用BinaryWrite往自定义的应用程序输出字节。 <% Set BinGen = Server.CreateObject(MY.BinaryGenerator) Pict = BinGen.MakePicture Response.BinaryWrite Pict %> |
Clear方法 | 清除被缓冲的HTML输出 语法: Response.Clear |
End方法 | 停止当前的ASP进程,返回被缓冲的HTML输出中的当前结果。 语法: Response.End 示例: 如果Response.Buffer值为TRUE,调用Response.End会使缓冲区溢出。如果你不想将输出报告给用户,你可以使用以下代码段。 <% Response.Clear Response.End %> |
Flush方法 | 发送当前被缓冲的HTML输出。 语法: Response.Flush |
Redirect方法 | 给浏览器发送重定向消息,使浏览器尝试连接另一个URL。 语法: Response.Redirect URL |
Write方法 | 向HTTP输出字符串参数。 语法: Response.Write variant |
Property属性 | |
Buffer属性 | 决定代理服务器是否能高度缓存ASP产生的输出。 语法: Response.Buffer [= flag] |
CharSet属性 | 把字符集的名称(如ISO-LATIN-7)附加给响应对象中的Content-type首标。 语法: Response.Charset(CharsetName) 不包含Response.Charset属性的ASP页面 content-type:text/html 如果包含Response.Charset属性,代码段: <% Response.Charset("ISO-LATIN-7") %> 得到的结果是: content-type:text/html; charset=ISO-LATIN-7 |
ContentType属性 | 指定响应的HTTP内容的类型,如果没有指定ContentType则默认为text/HTML。 语法: Response.ContentType [= ContentType ] 示例: 为ContentType属性赋值。 <% Response.ContentType = "text/HTML" %> <% Response.ContentType = "image/GIF" %> <% Response.ContentType = "image/JPEG" %> |
Expires属性 | 指定浏览器上高速缓存的页面过期之前的日期。 语法: Response.Expires [= number] |
ExpiresAbsolute 属性 | 指定浏览器上高速缓存的页面过期的日期和时间。 语法: Response.ExpiresAbsolute [= [date] [time]] 示例: 指明该网页在2010年5月1日1:30过15秒过期。 <% Response.ExpiresAbsolute=#May 31,2010 13:30:15# %> |
IsClientConnected属性 | 指定客户端是否和服务器断开连接。 语法: Response.IsClientConnected ( ) 示例: <% 'check to see if the client is connected If Not Response.IsClientConnected Then 'get the sessionid to send to the shutdown function Shutdownid = Session.SessionID 'perform shutdown processing Shutdown(Shutdownid) End If %> |
PICS属性 | 把PICS标签的值添加给响应首标的pics-label域。 语法: Response.PICS(PICSLabel) |
Status属性 | 返回服务器返回的状态行。 语法: Response.Status = StatusDescription 示例: 设置Response对象状态。 <% Response.Status = "401 Unauthorized" %> |
Collection集合 | |
Cookies | 设置Cookie的值。如果指定的Cookie不存在,则创建一个Cookie;如果存在,则它得到新的值,原先的值被替换。 语法: Response.Cookies(cookie)[(key)|.attribute] = value 示例: 为Cookie各属性赋值。 <% Response.Cookies("Type") = "Chocolate Chip" Response.Cookies("Type").Expires = "July 31, 1997" Response.Cookies("Type").Domain = "msn.com" Response.Cookies("Type").Path = "/www/home/" Response.Cookies("Type").Secure = FALSE %> |
重要说明:本文档允许在网络免费传播,但是请保证本文档的完整性,保留最后的书评。
初学者编程入门与提高的最佳用书!
芝 麻 开 门
——和阿里巴巴一起学编程
在本文的一开始,笔者请读者想一想以下问题:
l 初学编程,面对复杂的开发语言、开发环境,您是否曾感到无从下手?
l 在学习编程的过程中,您是否曾觉得枯燥乏味?
l 是否在学习一段时间之后仍然觉得还没有真正入门、难于提升?
如果有过,那么请关注科海社策划、清华社出版的《游戏编程导学》系列!
小型游戏是初学编程的理想切入点。《游戏编程导学》系列通过趣味游戏示例,以目标式教学为主,使得你的学习不再是一件枯燥乏味、无从下手、难于入门与提升的事情。
科海社策划、清华社出版的《游戏编程导学》系列是在受到读者好评的《趣味程序导学》系列基础上的全新升级版,——全面修正错漏,吸收读者反馈,融入了作者最新的开发经验、更深入的思考和理解,添加了更多更新颖的游戏实例,具有精益求精、更上层楼的图书品质。
《游戏编程导学》系列努力做到:
l 趣味性:在学习过程中自己动手设计游戏,感受学习的乐趣,保持学习的兴趣,并能不断取得阶段性成果。
l 直观性:开发语言和开发环境的复杂特点、纷繁内容有机地融入到游戏实例中,免除冗长的泛泛的讲述,具体直观,通俗易懂,深入浅出。
l 操作性:本套丛书结构明晰,便于理解,便于操作,读者可以跟随书本,体会程序设计的思想、思路,进行实际的操作,掌握相应的知识点,体会有关经验和技巧,最终开发出一个个有实际价值的游戏作品。
l 目标式教学:将基本能力和基本知识点与恰当的游戏实例结合,目标明确,循序渐进,每一章最后总结出“知识点回顾”,读者可以掌握扎实的基本功,真正入门,逐步提高。
由于上述特点(趣味性、直观性、可操作性、目标式教学),也特别适合用作程序设计培训教程。
趣味游戏举例:
◆ “幸运52”模拟游戏:领你轻松入门
◆“速算24”扑克游戏:数学逻辑,异常处理,调试技巧
◆ 华容道游戏:鼠标键盘事件处理,图形图像编程
◆“K歌之王实力大比拼”游戏:多媒体程序设计,文本编辑器制作,数据库编程,ActiveX编程,注册表操作,数据存储与游戏进度存储
◆ 俄罗斯方块,国际象棋:自定义类与组件,使用第三方组件,大型综合
◆ 网络黑白棋对战:网络编程
阿里巴巴念三声“芝麻开门”的咒语,就轻松打开了宝藏之门。如果阿里巴巴也学编程的话,他的咒语会是什么呢?一位叫阿里巴巴的网友说,咒语是没有的,但是带一本《游戏编程导学》是初学者的理想选择!他正是这么做的,并且希望朋友们跟他一起轻松入门,“攫取”程序开发的宝藏!
提示:本系列是编程导学,而不是讲述大型游戏开发。
推荐使用:初学者编程入门与提高的最佳用书!
本丛书包括:
《Delphi游戏编程导学》 《ASP游戏编程导学》 《Flash MX 2004游戏设计》
《VisualBasic游戏编程导学》 《Java游戏编程导学》
《Visual C++游戏编程导学》(12月初即出)
重要说明:本文档允许在网络免费传播,但是请保证本文档的完整性,保留最后的书评。
w 免费下载 第3章 |