ASP函数大全

原创 2007年09月24日 10:21:00

ASP系列函数大全

ASP函数大全 
ASP函数与VBSCRIPT类似,以下举一些常用的函数 
 
Array() 
 
函数返回一个数组 
 
表达式 Array(list) 
 
允许数据类型: 字符,数字均可 
 
实例: <% 
 
Dim myArray() 
 
For i = 1 to 7 
 
Redim Preserve myArray(i) 
 
myArray(i) = WeekdayName(i) 
 
Next 
 
%> 
 
返回结果: 建立了一个包含7个元素的数组myArray 
 
myArray("Sunday","Monday", ... ... "Saturday" 
 
 
CInt() 
 
函数将一个表达式转化为数字类型 
 
表达式 CInt(expression) 
 
允许数据类型: 任何有效的字符均可 
 
实例: <% 
 
f = "234" 
 
response.write cINT(f) + 2 
 
%> 
 
返回结果: 236 
 
转化字符"234"为数字"234",如果字符串为空,则返回0值 
 
 
CreateObject() 
 
函数建立和返回一个已注册的ACTIVEX组件的实例。 
 
表达式 CreateObject(objName) 
 
允许数据类型: objName 是任何一个有效、已注册的ACTIVEX组件的名字. 
 
实例: <% 
 
Set con = Server.CreateObject("ADODB.Connection" 
 
%> 
 
 
CStr() 
 
函数转化一个表达式为字符串. 
 
表达式 CStr(expression) 
 
允许数据类型: expression 是任何有效的表达式。 
 
实例: <% 
 
s = 3 + 2 
 
response.write "The 返回结果 is: " & cStr(s) 
 
%> 
 
返回结果: 转化数字“5”为字符“5”。 
 
 
Date() 
 
函数返回当前系统日期. 
 
表达式 Date() 
 
允许数据类型: None. 
 
实例: <%=Date%> 
 
返回结果: 9/9/00 
 
 
DateAdd() 
 
函数返回一个被改变了的日期。 
 
表达式 DateAdd(timeinterval,number,date) 
 
允许数据类型: 
timeinterval is the time interval to add; 
number is amount of time intervals to add; 
and date is the starting date. 
 
实例: <% 
 
currentDate = #9/9/00# 
 
newDate = DateAdd("m",3,currentDate) 
 
response.write newDate 
 
%> 
 
 
<% 
 
currentDate = #12:34:45 PM# 
 
newDate = DateAdd("h",3,currentDate) 
 
response.write newDate 
 
%> 
 
返回结果: 9/9/00 
 
3:34:45 PM 
 
"m" = "month"; 
 
"d" = "day"; 
 
If currentDate is in time format then, 
 
"h" = "hour"; 
 
"s" = "second"; 
 
 
DateDiff() 
 
函数返回两个日期之间的差值 。 
 
表达式 DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear]]) 
 
允许数据类型: timeinterval 表示相隔时间的类型,如“M“表示“月”。 
 
实例: <% 
 
fromDate = #9/9/00# 
 
toDate = #1/1/2000# 
 
response.write "There are " & _ 
 
DateDiff("d",fromDate,toDate) & _ 
 
" days to millenium from 9/9/00." 
 
%> 
 
返回结果: 从9/9/00 到2000年还有 150 天. 
 
 
Day() 
 
函数返回一个月的第几日 . 
 
表达式 Day(date) 
 
允许数据类型: date 是任何有效的日期。 
 
实例: <%=Day(#9/9/00#)%> 
 
返回结果: 4 
 
 
FormatCurrency() 
 
函数返回表达式,此表达式已被格式化为货币值 
 
表达式 FormatCurrency(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]]) 
 
允许数据类型: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置; LeadingDigit 三态常数,指示是否显示小数值小数点前面的零。
实例: <%=FormatCurrency(34.3456)%> 
 
返回结果: $34.35 
 
 
FormatDateTime() 
 
函数返回表达式,此表达式已被格式化为日期或时间 
 
表达式 FormatDateTime(Date, [, NamedFormat]) 
 
允许数据类型: NamedFormat 指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate. 
 
实例: <%=FormatDateTime("09/9/00", vbLongDate)%> 
 
返回结果: Sunday, September 09, 2000 
 
 
FormatNumber() 
 
函数返回表达式,此表达式已被格式化为数值. 
 
表达式 FormatNumber(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]]) 
 
允许数据类型: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。. 
 
实例: <%=FormatNumber(45.324567, 3)%> 
 
返回结果: 45.325 
 
 
FormatPercent() 
 
函数返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 (%) 
 
表达式 FormatPercent(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit]]]]) 
 
允许数据类型: 同上. 
 
实例: <%=FormatPercent(0.45267, 3)%> 
 
返回结果: 45.267% 
 
 
Hour() 
 
函数以24时返回小时数. 
 
表达式 Hour(time) 
 
允许数据类型: 
 
实例: <%=Hour(#4:45:34 PM#)%> 
 
返回结果: 16 
 
(Hour has been converted to 24-hour system) 
 
 
Instr() 
 
函数返回字符或字符串在另一个字符串中第一次出现的位置. 
 
表达式 Instr([start, ] strToBeSearched, strSearchFor [, compare]) 
 
允许数据类型: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符.compare比较方式(详细见ASP常数) 
 
实例: <% 
 
strText = "This is a test!!" 
 
pos = Instr(strText, "a" 
 
response.write pos 
 
%> 
 
返回结果: 9 
 
 
InstrRev() 
 
函数同上,只是从字符串的最后一个搜索起 
 
表达式 InstrRev([start, ] strToBeSearched, strSearchFor [, compare]) 
 
允许数据类型: 同上. 
 
实例: <% 
 
strText = "This is a test!!" 
 
pos = InstrRev(strText, "s" 
 
response.write pos 
 
%> 
 
返回结果: 13 
 
 
 
Int() 
 
函数返回数值类型,不四舍五入。 
 
表达式 Int(number) 
 
允许数据类型: 
 
实例: <%=INT(32.89)%> 
 
返回结果: 32 
 
 
IsArray() 
 
函数判断一对象是否为数组,返回布尔值 . 
 
表达式 IsArray(name) 
 
实例: <% 
 
strTest = "Test!" 
 
response.write IsArray(strTest) 
 
%> 
 
返回结果: False 
 
 
IsDate() 
 
函数判断一对象是否为日期,返回布尔值 
 
表达式 IsDate(expression) 
 
实例: <% 
 
strTest = "9/4/2000" 
 
response.write IsDate(strTest) 
 
%> 
 
返回结果: True 
 
 
IsEmpty() 
 
函数判断一对象是否初始化,返回布尔值. 
 
表达式 IsEmpty(expression) 
 
实例: <% 
 
Dim i 
 
response.write IsEmpty(i) 
 
%> 
 
返回结果: True 
 
 
IsNull() 
 
函数判断一对象是否为空,返回布尔值. 
 
表达式 IsNull(expression) 
 
实例: <% 
 
Dim i 
 
response.write IsNull(i) 
 
%> 

返回结果: False 
 
 
IsNumeric() 
 
函数判断一对象是否为数字,返回布尔值. 
 
表达式 IsNumeric(expression) 
 
实例: <% 
 
i = "345" 
 
response.write IsNumeric(i) 
 
%> 
 
返回结果: True 
 
就算数字加了引号,ASP还是认为它是数字。 
 
 
IsObject() 
 
函数判断一对象是否为对象,返回布尔值. 
 
表达式 IsObject(expression) 
 
实例: <% 
 
Set con = Server.CreateObject("ADODB.Connection" 
 
response.write IsObject(con) 
 
%> 
 
返回结果: True 
 
 
LBound() 
 
函数返回指定数组维的最小可用下标. 
 
表达式 Lbound(arrayname [, dimension]) 
 
实例: <% 
 
i = Array("Monday","Tuesday","Wednesday" 
 
response.write LBound(i) 
 
%> 
 
返回结果: 0 
 
 
LCase() 
 
函数 返回字符串的小写形式 
 
表达式 Lcase(string) 
 
实例: <% 
 
strTest = "This is a test!" 
 
response.write LCase(strTest) 
 
%> 
 
返回结果: this is a test! 
 
 
Left() 
 
函数返回字符串左边第length个字符以前的字符(含第length个字符). 
 
表达式 Left(string, length) 
 
实例: <% 
 
strTest = "This is a test!" 
 
response.write Left(strTest, 3) 
 
%> 
 
返回结果: Thi 
 
 
Len() 
 
函数返回字符串的长度. 
 
表达式 Len(string | varName) 
 
实例: <% 
 
strTest = "This is a test!" 
 
response.write Len(strTest) 
 
%> 
 
返回结果: 15 
 
 
LTrim() 
 
函数去掉字符串左边的空格. 
 
表达式 LTrim(string) 
 
实例: <% 
 
strTest = " This is a test!" 
 
response.write LTrim(strTest) 
 
%> 
 
返回结果: This is a test! 
 
 
Mid() 
 
函数返回特定长度的字符串(从start开始,长度为length). 
 
表达式 Mid(string, start [, length]) 
 
实例: <% 
 
strTest = "This is a test! Today is Monday." 
 
response.write Mid(strTest, 17, 5) 
 
%> 
 
返回结果: Today 
 
 
Minute() 
 
函数返回时间的分钟. 
 
表达式 Minute(time) 
 
实例: <%=Minute(#12:45:32 PM#)%> 
 
返回结果: 45 
 
 
Month() 
 
函数返回日期. 
 
表达式 Month(date) 
 
实例: <%=Month(#08/04/99#)%> 
 
返回结果: 8 
 
 
MonthName() 
 
函数返回指定月份 
 
表达式 MonthName(month, [, Abb]) 
 
实例: <%=MonthName(Month(#08/04/99#))%> 
 
返回结果: August 
 
 
Now() 
 
函数返回系统时间 
 
表达式 Now() 
 
实例: <%=Now%> 
 
返回结果: 9/9/00 9:30:16 AM 
 
 
Right() 
 
函数返回字符串右边第length个字符以前的字符(含第length个字符). 
 
表达式 Right(string, length) 
 
实例: <% 
 
strTest = "This is an test!" 
 
response.write Right(strTest, 3) 
 
%> 
 
返回结果: st! 
 
 
Rnd() 
 
函数产生一个随机数. 
 
表达式 Rnd [ (number) ] 
 
实例: <% 
 
Randomize()

Rnd() 
 
函数产生一个随机数. 
 
表达式 Rnd [ (number) ] 
 
实例: <% 
 
Randomize() 
response.write RND() 
 
%> 
 
返回结果: 任何一个在0 到 1 之间的数 
 
 
Round() 
 
函数返回按指定位数进行四舍五入的数值. 
 
表达式 Round(expression [, numRight]) 
 
实例: <% 
 
i = 32.45678 
 
response.write Round(i) 
 
%> 
 
返回结果: 32 
 
 
Rtrim() 
 
函数去掉字符串右边的字符串. 
 
表达式 Rtrim(string) 
 
实例: <% 
 
strTest = "This is a test!! " 
 
response.write RTrim(strTest) 
 
%> 
 
返回结果: This is a test!! 
 
 
Split() 
 
函数将一个字符串分割并返回分割结果 
 
表达式 Split (S[,d]) 
 
实例:<%V= Split(A,B,C) 
 
For i = 0 To UBound(V) 
 
Response.Write V(i) 
 
Next 
 
%> 
 
返回结果: A B C 
 
 
Second() 
 
函数返回秒. 
 
表达式 Second(time) 
 
实例: <%=Second(#12:34:28 PM#)%> 
 
返回结果: 28 
 
 
StrReverse() 
 
函数反排一字符串 
 
表达式 StrReverse(string) 
 
实例: <% 
 
strTest = "This is a test!!" 
 
response.write StrReverse(strTest) 
 
%> 
 
返回结果: !!tset a si sihT 
 
 
Time() 
 
函数返回系统时间. 
 
表达式 Time() 
 
实例: <%=Time%> 
 
返回结果: 9:58:28 AM 
 
 
Trim() 
 
函数去掉字符串左右的空格. 
 
表达式 Trim(string) 
 
实例: <% 
 
strTest = " This is a test!! " 
 
response.write Trim(strTest) 
 
%> 
 
返回结果: This is a test!! 
 
 
UBound() 
 
函数返回指定数组维数的最大可用下标>. 
 
表达式 Ubound(arrayname [, dimension]) 
 
实例: <% 
 
i = Array("Monday","Tuesday","Wednesday" 
 
response.write UBound(i) 
 
%> 
 
返回结果: 2 
 
 
UCase() 
 
函数返回字符串的大写形式. 
 
表达式 UCase(string) 
 
允许数据类型: 
 
实例: <% 
 
strTest = "This is a test!!" 
 
response.write UCase(strTest) 
 
%> 
 
返回结果: THIS IS A TEST!! 
 
 
VarType() 
 
函数返回指示变量子类型的值 
 
表达式 VarType(varName) 
 
实例: <% 
 
i = 3 
 
response.write varType(i) 
 
%> 
 
返回结果: 2(数字)详见"asp常数" 
 
 
WeekDay() 
 
函数返回在一周的第几天. 
 
表达式 WeekDay(date [, firstdayofweek]) 
 
实例: <% 
 
d = #9/9/00# 
 
response.write Weekday(d) 
 
%> 
 
返回结果: 4(星期三) 
 
 
WeekDayName() 
 
函数返回一周第几天的名字. 
 
表达式 WeekDayName(weekday [, Abb [, firstdayofweek]]) 
 
实例: <% 
 
d = #9/9/00# 
 
response.write WeekdayName(Weekday(d)) 
 
%> 
 
返回结果: Wednesday 
 
 
Year() 
 
函数返回当前的年份. 
 
表达式 Year(date) 
 
实例: <%=Year(#9/9/00#)%> 
 
返回结果: 1999


iceway 发表于 >2005-10-26 13:39:51 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-5-8
35岁之前成功的12条黄金法则 [转]

第一章:一个目标

一艘没有航行目标的船,任何方向的风都是逆风
1、你为什么是穷人,第一点就是你没有立下成为富人的目标
2、你的人生核心目标是什么?
杰出人士与平庸之辈的根本差别并不是天赋、机遇,而在于有无目标。
3、起跑领先一步,人生领先一大步:成功从选定目标开始
4、贾金斯式的人永远不会成功
为什么大多数人没有成功?真正能完成自己计划的人只有5%,大多数人不是将自己的目标舍弃,就是沦为缺乏行动的空想
5、 如果你想在35岁以前成功,你一定在25至30岁之间确立好你的人生目标
6、 每日、每月、每年都要问自己:我是否达到了自己定下的目标

第二章:两个成功基点

站好位置,调正心态,努力冲刺,35岁以前成功
(一)人生定位
1、 人怕入错行:你的核心竞争力是什么?
2、 成功者找方法,失败者找借口
3、 从三百六十行中选择你的最爱
人人都可以创业,但却不是人人都能创业成功
4、 寻找自己的黄金宝地
(二)永恒的真理:心态决定命运,35岁以前的心态决定你一生的命运
1、 不满现状的人才能成为富翁
2、 敢于梦想,勇于梦想,这个世界永远属于追梦的人
3、 35岁以前不要怕,35岁以后不要悔
4、 出身贫民,并非一辈子是贫民,只要你永远保持那颗进取的心。中国成功人士大多来自小地方
5、 做一个积极的思维者
6、 不要败给悲观的自己
有的人比你富有一千倍,他们也会比你聪明一千倍么?不会,他们只是年轻时心气比你高一千倍。
人生的好多次失败,最后并不是败给别人,而是败给了悲观的自己。
7、 成功者不过是爬起来比倒下去多一次
8、 宁可去碰壁,也不要在家里面壁
克服你的失败、消极的心态
(1) 找个地方喝点酒
(2) 找个迪厅跳跳舞
(3) 找帮朋友侃侃山
(4) 积极行动起来

第三章:三大技巧


1、管理时间:你的时间在哪里,你的成就就在哪里。
把一小时看成60分钟的人,比看作一小时的人多60倍
2、你不理财,财不理你
3、自我管理,游刃有余
(1) 创业不怕本小,脑子一定要好
(2) 可以开家特色店
(3) 做别人不愿做的生意

第四章:四项安身立命的理念

35岁以前一定要形成个人风格
1、做人优于做事
做事失败可以重来,做人失败却不能重来
(1) 做人要讲义气
(2) 永不气馁
2、豁达的男人有财运,豁达的女人有帮夫运
35岁以前搞定婚姻生活
3、忠诚的原则:35岁以前你还没有建立起忠诚美誉,这一缺点将要困扰你的一生
4、把小事做细,但不要耍小聪明
中国人想做大事的人太多,而愿把小事做完美的人太少

第五章:五分运气

比尔·盖茨说:人生是不公平的,习惯去接受它吧
1、人生的确有很多运气的成人:谋事在人,成事在天:中国的古训说明各占一半
2、机会时常意外地降临,但属于那些不应决不放弃的人
3、抓住人生的每一次机会
机会就像一只小鸟,如果你不抓住,它就会飞得无影无踪
4、 者早一步,愚者晚一步

第六章:六项要求

1、智慧
(1)别人可你以拿走你的一切,但拿不走你的智慧
(2)巧妙运用自己的智慧
(3)智者与愚者的区别
2、勇气
(1)勇气的力量有时会让你成为"超人"
(2)敢于放弃,敢于"舍得"
3、培养自己的"领导才能、领袖气质"
(1) 激情感染别人
(2) "三o七法则"实现领袖气质
(3) 拍板决断能力
(4) 人格魅力
4、创造性:不要做循规蹈矩的人
25-35岁是人生最有创造性的阶段,很多成功人士也都产生在这一阶段
5、明智
(1) 知道自己的长处、短处,定向聚焦
(2) 尽量在自己的熟悉的领域努力
6、持之以恒的行动力:在你选定行业坚持十年,你一定会成为大赢家

第七章:七分学习

1、知识改变命运
2、35岁以前学会你行业中必要的一切知识
a) 每天淘汰你自己
b) 在商言商
3、太相信的书人,只能成为打工仔
4、思考、实践、再思考、再实践

第八章:八分交际

朋友多了路好走
1、智商很重要,情商更重要:35岁以前建立起人际关系网
2、人脉即财脉:如何搞好人际关系
3、交友有原则
4、善于沟通:35岁以前要锻炼出自己的演讲才能

第九章:九分习惯

习惯的力量是惊人的,35岁以前养成的习惯决定着你的成功的大小
1、积极思维的好习惯
2、养成高效工作的好习惯
(1) 办公室
(2) 生活可以不拘小节,但要把工作做细
(3) 学习聆听,不打断别人说话
3、养成锻炼身体的好习惯
4、广泛爱好的好习惯
5、快速行动的好习惯

第十章:十分自信

1、自信是成功的精神支柱
2、自信方能赢得别人的信任
3、把自信建立在创造价值的基础上
4、如何建立自信
(1) 为自己确立目标
(2) 发挥自己的长处
(3) 做事要有计划
(4) 做事不拖拉
(5) 轻易不要放弃
(6) 学会自我激励
(7) 不要让自己成为别人

第十一章 11个需要避开的成功陷阱

1、只有功劳,没有苦劳
2、不要"怀才不遇",而要寻找机遇
3、不要想发横财
4、不要为钱而工作,而让钱为你工作
5、 盲目跟风,人云亦云,人做我也做
6、 小富即安,不思进取,知足常乐
7、 承认错误而非掩饰错误
8、 脚踏实地而非想入非非
9、 野心太大而不是信心十足
10、反复跳槽不可取
11、眼高手低
12、不择手段

第十二章 十二分努力

没有人能随随便便成功
1、小不是成功,大不是成功,由小变大才是成功
2、中国社会进入微利时代:巧干+敢干+实干=成功
3、努力尝试就有成功的可能
4、做任何事情,尽最大努力
5、把事情当成事业来做
6、我看打工者
7、祝你早日掘到第一桶金


iceway 发表于 >2005-5-8 23:28:38 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-4-7
htc的客户端表单验证 [转]

本文转自http://p5.club.163.com/viewArticleByWWW.m?boardId=asp&articleId=asp_1030fbde6094b7a&boardOffset=0(作者:lqflsh(只让女生追) 2005-04-05 08:23:53.0)

昨天发了一篇实用表格的文章,今天我发一篇关于表单验证的文章吧!很多人喜欢直接用javascript验证表单,比如文本框内不能为空,必须填写数字,必须是小数等等,这样对于表单内控件较少的情况下很实用,但是要是表单内控件相对多的情况下,来看看htc的效果吧!(其实htc也是javascript)

首先建立文件 form.htc,把下面的代码复制到form.htc就可以了
/////////////////////////////////////////////////////////////////////////////////////////////////////////

<!-- ---------------------------------------------------------------------
//
// File: form.htc
// version: 1.0
// Description:客户端表单验证.
// author: 伍子
//
//-------------------------------------------------------------------- -->
<PUBLIC:COMPONENT id="formCheck" urn="wwb:formCheck">
<PUBLIC:ATTACH EVENT="onsubmit" ONEVENT="checkForm()"/>
<script language="JavaScript">
function checkForm()
{
var oForm=event.srcElement;
var eles = oForm.elements;
//遍历所有表元素
for(var i=0;i<eles.length;i++)
{
//是否需要验证
var sType=eles[i].valueType;
if(sType)
{
if(eles[i].mustInput!=null && eles[i].mustInput)
{
if(trim(eles[i].value)==""
{
if(eles[i].objName!=null)
{
alert(eles[i].objName+"不可以为空";
}
else
{
alert("该文本框为必输字段";
}
eles[i].focus();
event.returnValue=false;
return false;
}
}
switch(sType)
{
//整数
case "int":
if(!checkInt(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//小数
case "float":
if(!checkFloat(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//字符串
case "string":
if(!checkString(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//日期
case "date":
if(!checkDate(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//邮件
case "email":
if(!checkEmail(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//单选按钮
case "radio":
if(!checkRadio(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//复选按钮
case "checkbox":
if(!checkBox(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//下拉列表框
case "select":
if(!checkSelect(eles[i]))
{
event.returnValue=false;
return false;
}
break;
//列表框
case "list":
if(!checkList(eles[i]))
{
event.returnValue=false;
return false;
}
break;
}
}
}
event.returnValue=true;
return true;
}

/***检查是否为整数***/
function checkInt(ele)
{
if(!isInt(ele.value))
{
alert("请输入有效整数";
ele.focus();
return false;
}
else
{
if(ele.maxInput!=null && !isNaN(ele.maxInput))
if(parseInt(ele.maxInput)<parseInt(ele.value))
{
alert("您输入的"+ convertNullToSpace(ele.objName)+"值应该小于"+ele.maxInput);
ele.focus();
return false;
}
if(ele.minInput!=null && !isNaN(ele.minInput))
if(parseInt(ele.minInput)>parseInt(ele.value))
{
alert("您输入的"+ convertNullToSpace(ele.objName)+"值应该大于"+ele.minInput);
ele.focus();
return false;
}
}
return true;
}

/***检查是否为小数***/
function checkFloat(ele)
{
if(isNaN(ele.value))
{
alert("请输入有效数字";
ele.focus();
return false;
}
else
{
if(ele.decimalLen!=null && !checkDecimal(ele.value,ele.decimalLen))
{
alert("您输入的"+convertNullToSpace(ele.objName)+"值小数位最多为"+ele.decimalLen);
ele.focus();
return false;
}
if(ele.maxInput!=null && !isNaN(ele.maxInput))
if(parseInt(ele.maxInput)<parseInt(ele.value))
{
alert("您输入的"+ convertNullToSpace(ele.objName)+"值应该小于"+ele.maxInput);
ele.focus();
return false;
}
if(ele.minInput!=null && !isNaN(ele.minInput))
if(parseInt(ele.minInput)>parseInt(ele.value))
{
alert("您输入的"+ convertNullToSpace(ele.objName)+"值应该大于"+ele.minInput);
ele.focus();
return false;
}
}
return true;
}

/***检查是否为字符串***/
function checkString(ele)
{
if(ele.stringLen!=null && !isNaN(ele.stringLen))
{
var value=new String(ele.value);
if(value.length>parseInt(ele.stringLen))
{
alert("您输入的"+convertNullToSpace(ele.objName)+"最大长度为"+ele.stringLen);
ele.focus();
return false;
}
}
return true;
}
/***检查是否为日期格式***/
function checkDate(ele)
{
if(!isDate(ele.value))
{
alert("请输入有效日期(yyyy-mm-dd)";
ele.focus();
return false;
}
return true;
}

/***检查是否为电子邮箱***/
function checkEmail(ele)
{
if(!isEmail(ele.value))
{
alert("请输入有效邮箱";
ele.focus();
return false;
}
return true;
}
/***检查单选按钮是否需要选择***/
function checkRadio(ele)
{
//var rads = document.getElementsByName(ele.name);
eval("var rads="+name+"."+ele.name);
var selectCount=0;
for(var i=0;i<rads.length;i++)
{
if(rads[i].checked)
{
selectCount++;
}
}

if(ele.mustSelect!=null && ele.mustSelect)
{
if(selectCount==0)
{
alert("请选择"+convertNullToSpace(ele.objName));
ele.focus();
return false;
}
}
return true;
}
/***检查复选按钮是否需要选择***/
function checkBox(ele)
{
//var rads = document.getElementsByName(ele.name);
eval("var chks="+name+"."+ele.name);
var selectCount=0;
for(var i=0;i<chks.length;i++)
{
if(chks[i].checked)
{
selectCount++;
}
}
if(ele.minSelect!=null && !isNaN(ele.minSelect))
{
if(selectCount<parseInt(ele.minSelect))
{
alert(convertNullToSpace(ele.objName)+"至少选择"+ele.minSelect+"项";
ele.focus();
return false;
}
}
if(ele.maxSelect!=null && !isNaN(ele.maxSelect))
{
if(selectCount>parseInt(ele.maxSelect))
{
alert(convertNullToSpace(ele.objName)+"至多选择"+ele.maxSelect+"项";
ele.focus();
return false;
}
}
return true;
}
/***检查下拉列表框是否需要选择***/
function checkSelect(ele)
{
//var rads = document.getElementsByName(ele.name);
if(ele.mustSelect!=null && ele.mustSelect)
{
if(ele.selectedIndex==0)
{
alert("请选择"+convertNullToSpace(ele.objName));
ele.focus();
return false;
}
}
return true;
}
/***检查列表框的选择项数***/
function checkList(ele)
{
//var rads = document.getElementsByName(ele.name);
var selectCount=0;
for(var i=0;i<ele.options.length;i++)
{
if(ele.options[i].selected)
{
selectCount++;
}
}
alert(selectCount);
if(ele.minSelect!=null && !isNaN(ele.minSelect))
{
if(selectCount<parseInt(ele.minSelect))
{
alert(convertNullToSpace(ele.objName)+"至少选择"+ele.minSelect+"项";
ele.focus();
return false;
}
}
if(ele.maxSelect!=null && !isNaN(ele.maxSelect))
{
if(selectCount>parseInt(ele.maxSelect))
{
alert(convertNullToSpace(ele.objName)+"至多选择"+ele.maxSelect+"项";
ele.focus();
return false;
}
}
return true;
}
/***判断是否为整数***/
function isInt(s)
{
var patrn=/^[-,+]{0,1}[0-9]{0,}$/;
if (!patrn.exec(s))
return false;
return true;
}
/***判断是否为数字***/
function isNumber(s)
{
var patrn=/^[-,+]{0,1}[0-9]{0,}[.]{0,1}[0-9]{0,}$/;
if (!patrn.exec(s))
return false;
return true;
}
/***判断是否为日期***/
function isDate(str)
{
var r = str.match(/^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2})$/);
if(r==null)
{
return false;
}
var d= new Date(r[1], r[3]-1, r[4]);
if(!(d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]))
{
return false;
}
return true;
}
/***判断是否为邮箱***/
function isEmail(str)
{
if(str.match(/[/w-]+@{1}[/w-]+/.{1}/w{2,4}(/.{0,1}/w{2}){0,1}/ig)!=str)
return false;
else
return true;
}
/***将NULL转化为空格,用于显示对象名称***/
function convertNullToSpace(paramValue)
{
if(paramValue==null)
return "";
else
return paramValue;
}
/***检查小数位数***/
function checkDecimal(num,decimalLen)
{
var len = decimalLen*1+1;
if(num.indexOf('.')>0)
{
num=num.substr(num.indexOf('.')+1,num.length-1);
if ((num.length)<len)
{
return true;
}
else
{
return false;
}
}
return true;
}
/***去除空格***/
function trim(str)
{
if (str.length > 0)
{
while ((str.substring(0,1) == " " && (str.length > 0))
{
str = str.substring(1,str.length);
}
while (str.substring(str.length-1,str.length) == " "
{
str = str.substring(0,str.length-1);
}
}
return str;
}

</PUBLIC:COMPONENT>

 


那么使用方法也很简单
客户端表单验证

表单定义:
<form name="form1" action="" style="behavior:url('form.htc')"></form>
客户端表单验证是由表单的onSubmit事件触发,由于表单的onSubmit事件只能由提交按钮触发,
所以如果要用函数提交表单form1.submit(),则必须同时执行form1.onSubmit()。

类型定义:

一、整型(int)
定义:
valueType="int"
属性:
objName 对象名称(字符串)
mustInput 必输项(true/false)
minInput 最小值(数字)
maxInput 最大值(数字)
举例:
<input type="text" name="test" valueType="int" objName="总载重吨" mustInput="true" maxInput="10000">

二、浮点型(float)
定义:
valueType="float"
属性:
objName 对象名称(字符串)
mustInput 必输项(true/false)
minInput 最小值(数字)
maxInput 最大值(数字)
decimalLen小数位数(数字)
举例:
<input type="text" name="test" valueType="float" objName="运价" mustInput="true" maxInput="10000.50" decimalLen="2">

三、字符串(string)
定义:
valueType="string"
属性:
objName 对象名称(字符串)
mustInput 必输项(true/false)
stringLen 字符串长度(数字)
举例:
<input type="text" name="test" valueType="string" objName="英文船名" mustInput="true" stringLen="100">

四、日期(date)
定义:
valueType="date"
属性:
objName 对象名称(字符串)
mustInput 必输项(true/false)
举例:
<input type="text" name="test" valueType="date" objName="开始日期" mustInput="true">
备注:
日期现在只能校验的格式为(yyyy-mm-dd)

五、邮箱(email)
定义:
valueType="email"
属性:
objName 对象名称(字符串)
mustInput 必输项(true/false)
举例:
<input type="text" name="test" valueType="email" objName="邮箱" mustInput="true">

六、单选(radio)
定义:
valueType="radio"
属性:
objName 对象名称(字符串)
mustSelect 必输项(true/false)
举例:
<input type="radio" name="test" valueType="radio" objName="租船方式" mustSelect="true">
备注:
对于同一组单选按钮,只需要定义第一个即可。

七、复选(checkbox)
定义:
valueType="checkbox"
属性:
objName 对象名称(字符串)
minSelect 最小选择数(数字)
maxSelect 最大选择数(数字)
举例:
<input type="checkbox" name="test" valueType="checkbox" objName="爱好" minSelect="2" maxSelect="5">
备注:
对于同一组复选按钮,只需要定义第一个即可。

八、下拉列表框(select)
定义:
valueType="select"
属性:
objName 对象名称(字符串)
mustSelect 必输项(true/false)
举例:
<select name="test" valueType="select" objName="租船方式" mustSelect="true">

九、列表框(list)
定义:
valueType="list"
属性:
objName 对象名称(字符串)
minSelect 最小选择数(数字)
maxSelect 最大选择数(数字)
举例:
<select name="test" valueType="list" objName="爱好" minSelect="2" maxSelect="5">
原帖来自于网易社区:http://p5.club.163.com/viewArticleByWWW.m?boardId=asp&articleId=asp_1030fbde6094b7a


iceway 发表于 >2005-4-7 10:22:39 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-4-6
IIS5.0掉电后CPU占用100%解决办法

如果是因为掉电引起的访问IIS时CPU被inetinfo.exe进程占用100%的问题,可以直接windows updates一下就可以了


iceway 发表于 >2005-4-6 15:42:40 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-4-6
SQL SERVER 2000安装出错的几点肯定和解决办法 [转]

我当时安装的时候,无论是一路默认选项,还是选择别的什么选项,所得结果都是一样,就是上面的4幅图片。(安装的时候请把系统托盘里能关的程序都关掉,避免内存冲突)

这是怎么回事呢?
首先排除盗版盘问题,因为我用的是我们一个大客户的正版
再者排除系统的问题,因为我也怀疑是系统的问题,所以我重新格式化后,新装的win2k ad server,(BTW:也是正版的)
在我试了N次之后还是不行,仔细看了最后一张图,想到了看它得日志

sql server 2k 会在它安装的时候,即时得生成一个安装日志文件:名字叫作sqlstp.txt(可能是sqlsetup得缩写吧)它的位置在:/%system%/winnt/目录下面
打开它你可以看到它记录着安装程序几点几分执行了什么动作
如果你安装成功的话,它的最后一行应该有Installation Succeeded字样
否则,在它出错得时刻肯定有纪录
比如我的这里就是:command line option syntax error.type command/? for help
意思是:命令行语法错误。command/?查看帮助
还有关于我的安装目录的文字:D:/1/e/recycled2/常用软件备份/数据库/sql_server2000
所以我就怀疑是不是我的目录有问题,是安装路径不能有中文目录,还是安装路径
太长了,还是我的recycled2目录有问题?(这个目录经过加密得98下它就是个回收站)所以我先考虑换了一下目录,把它挪到了根目录下,再安装,ok!

其实就这么简单,我只是想说明一下解决问题的方法,大家不要一有问题就先上论坛问,应该先自己好好考虑一下然后再问,或许自己就能找到原因,而且记忆深刻。
还有就是,大家要善于看日志,不光是安装程序有日志,win2k服务器也有很多日志文件,比如:iis日志、系统应用程序日志等等,养成看日志的习惯就会解决很多的问题,包括是否有黑客攻击你的iis服务器...

关于安装服务器配置失败的时候(sqlunirl.dll是MDAC的一个组件),你可以考虑如下方法试试:
1.重装MDAC
2.修改注册表:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/setup
删除ExceptionComponents
重启,安装


iceway 发表于 >2005-4-6 15:40:06 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-3-28
SQL SERVER的字段类型说明 [转]

SQL SERVER的字段类型说明

  以下为SQL SERVER7.0以上版本的字段类型说明。SQL SERVER6.5的字段类型说明请参考SQL SERVER提供的说明。

字段类型 描述
bit 0或1的整型数字
int 从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字
smallint 从-2^15(-32,768)到2^15(32,767)的整型数字
tinyint 从0到255的整型数字

decimal 从-10^38到10^38-1的定精度与有效位数的数字
numeric decimal的同义词

money 从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十
smallmoney 从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十

float 从-1.79E+308到1.79E+308可变精度的数字
real 从-3.04E+38到3.04E+38可变精度的数字

datetime 从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒
smalldatetime 从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟

timestamp 时间戳,一个数据库宽度的唯一数字
uniqueidentifier 全球唯一标识符GUID

char 定长非Unicode的字符型数据,最大长度为8000
varchar 变长非Unicode的字符型数据,最大长度为8000
text 变长非Unicode的字符型数据,最大长度为2^31-1(2G)

nchar 定长Unicode的字符型数据,最大长度为8000
nvarchar 变长Unicode的字符型数据,最大长度为8000
ntext 变长Unicode的字符型数据,最大长度为2^31-1(2G)

binary 定长二进制数据,最大长度为8000
varbinary 变长二进制数据,最大长度为8000
image 变长二进制数据,最大长度为2^31-1(2G)


iceway 发表于 >2005-3-28 15:13:12 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-3-28
SQL SERVER的数据类型 [转]

1.SQL SERVER的数据类型

  数据类弄是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQLServer 提供了 25 种数据类型:
  ·Binary [(n)]
  ·Varbinary [(n)]
  ·Char [(n)]
  ·Varchar[(n)]
  ·Nchar[(n)]
  ·Nvarchar[(n)]
  ·Datetime
  ·Smalldatetime
  ·Decimal[(p[,s])]
  ·Numeric[(p[,s])]
  ·Float[(n)]
  ·Real
  ·Int
  ·Smallint
  ·Tinyint
  ·Money
  ·Smallmoney
  ·Bit
  ·Cursor
  ·Sysname
  ·Timestamp
  ·Uniqueidentifier
  ·Text
  ·Image
  ·Ntext
(1)二进制数据类型

  二进制数据包括 Binary、Varbinary 和 Image
  Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。
  Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。
  Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是n 个字节。
  在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
(2)字符数据类型

  字符数据的类型包括 Char,Varchar 和 Text
  字符数据是由任何字母、符号和数字任意组合而成的数据。
  Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。
(3)Unicode 数据类型

  Unicode 数据类型包括 Nchar,Nvarchar 和Ntext
  在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。
  在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
(4)日期和时间数据类型

  日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型
  日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。
  日期的格式可以设定。设置日期格式的命令如下:
  Set DateFormat {format | @format _var|
  其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。
  例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式
(5)数字数据类型

  数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数
  整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是    Int,Smallint和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。
  精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。
  在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据表示正的或者负的货币数量 。

  在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 Smallmoney
  Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。

(7)特殊数据类型

  特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即    Timestamp、Bit 和 Uniqueidentifier。
  Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。
  Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。
  Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
2.用户定义的数据类型

  用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为   postal_code 的数据类型,它基于 Char 数据类型。
  当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。
(1)创建用户定义的数据类型

  创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下:
  sp_addtype {type},[,system_data_bype][,'null_type']
  其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char   等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOT NULL'或者'NONULL'。
  例子:
  Use cust
  Exec sp_addtype ssn,'Varchar(11)',"Not Null'
  创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。
  例子:
  Use cust
  Exec sp_addtype birthday,datetime,'Null'
  创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。
  例子:
  Use master
  Exec sp_addtype telephone,'varchar(24),'Not Null'
  Eexc sp_addtype fax,'varchar(24)','Null'
  创建两个数据类型,即 telephone 和 fax
(2)删除用户定义的数据类型

  当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {'type'}。
  例子:
  Use master
  Exec sp_droptype 'ssn'
  注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。


iceway 发表于 >2005-3-28 15:04:45 [全文] [评论] [引用] [推荐] [档案] [推给好友]


2005-3-19
Tc2.0编写俄罗斯方块游戏 [转]

原文网址:http://www.vcok.com/class/list.asp?id=213

  很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后,
问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。

  俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。

  下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题:
******************************************************
Tc2.0中怎么样设置图形显示?
Tc2.0中常用图形函数的用法?
怎样获取鍵盘输入?
怎样控制方块的移动?
怎样控制时间间隔(用于游戏中控制形状的下落)?
游戏中的各种形状及整个游戏空间怎么用数据表示?
游戏中怎么判断左右及向下移动的可能性?
游戏中怎么判断某一形状旋转的可能性?
按向下方向键时加速某一形状下落速度的处理?
怎么判断某一形状已经到底?
怎么判断某一已经被填满?
怎么消去已经被填满的一行?
怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行)
怎样修改游戏板的状态?
怎样统计分数?
怎样处理升级后的加速问题?
怎样判断游戏结束?
关于计分板设计的问题。
关于“下一个”形状取法的问题。
剩下的问题。

******************************************************
新的问题:
 我想有一个最高记录的显示,应该怎么做呀?
 我想实现一个进度存储功能,应该怎么做呀?


Tc2.0中怎么样设置图形显示?

  Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。一般是显示25
行,每行80个字符。程序缺省的是字符模式。在字符模式下不能显式图形和进行绘图操作。要想进行图形显示和绘图操作,必须切换到图形模
式下。

  Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。initgraph()和closegraph()都是图形
函数,使用图形函数必须包括头文件"graphics.h"。

  void far initgraph(int far *graphdriver,int far *graphmode,char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。pathtodriver表示存放图形驱动文件的路径。

  Tc2.0中有多种图形驱动,每种图形驱动下又有几种图形显示模式。在我的程序中图形驱动序号为VGA,图形显示模式序号为VGAHI。这是一种分辨率为640*480(从左到右坐标依次为0-639,从上到下坐标依次为0-479),能够显示16种颜色的图形模式。别的图形驱动序号和图形显示模式序号,可以从手册或联机帮助中找到。

  pathtodriver指示存放图形驱动文件的路径。图形驱动序号不同,图形驱动文件也不同。序号为VGA图形驱动对应"egavga.bgi"这个图形驱动文件。"egavga.bgi"一般在Tc目录下。

void far closegraph(void);
  没有参数,从图形模式直接返回字符模式。

initgraph()和closegraph()的常用用法如下:
int gdriver = VGA, gmode=VGAHI, errorcode;

/* initialize graphics mode */
initgraph(&gdriver, &gmode, "e://tc2";

/* read result of initialization */
errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s/n", grapherrormsg(errorcode));
printf("Press any key to halt:";
getch();
exit(1); /* return with error code */
}

/* return to text mode */
closegraph();


Tc2.0中常用图形函数的用法?

在这里讲几个游戏中用到的绘图用的图形函数:
setcolor();
line();
rectangle();
settextjustify();
outtextxy();
setfillstyle();
bar();

void far setcolor(int color);
  设置画线、画框和在图形模式下显示文字的当前颜色。这个函数将影响line()、rectangle()和outtextxy()函数绘图的颜色。
color可以取常的颜色常量:
BLACK ? 0
BLUE ? 1
GREEN ? 2
CYAN ? 3
RED ? 4
MAGENTA ? 5
BROWN ? 6
LIGHTGRAY ? 7
DARKGRAY ? 8
LIGHTBLUE ? 9
LIGHTGREEN ?10
LIGHTCYAN ?11
LIGHTRED ?12
LIGHTMAGENTA ?13
YELLOW ?14
WHITE ?15

void far line(int x1,int y1,int x2,int y2);
用当前颜色从(x1,y1)画一条到(x2,y2)的线段。

void far rectangle(int left,int top,int right,int bottom);
用当前颜色画一个左上角为(left,top)、右下角为(right,bottom)的矩形框。

void far settextjustify(int horz,int vert);
设置图形模式下文字输出的对齐方式。主要影响outtextxy()函数。
horiz和vert可取如下枚举常量:
horiz ?LEFT_TEXT ? 0 ?Left-justify text
?CENTER_TEXT ? 1 ?Center text
?RIGHT_TEXT ? 2 ?Right-justify text
vert ?BOTTOM_TEXT ? 0 ?Justify from bottom
?CENTER_TEXT ? 1 ?Center text
?TOP_TEXT ? 2 ?Justify from top

void far outtextxy(int x,int y,char * textstring);
在(x,y)处用当前字体(缺省的字体是DEFAULT_FONT)显示字符串textstring,字符串的对齐方式由settextjustify()指定。

void far setfillstyle(int pattern,int color);
设置图形的填充模式和填充颜色,主要影响bar()等函数。
pattern一般取枚举常量值SOLID_FILL,color的取值与setcolor(int color)中color的取值范围相同。

  介绍完了前面两个问题,现在来写一个程序。这个程序演示前了面所介绍的几个图形函数。
程序prog1.c


怎样获取鍵盘输入?

  在Tc2.0中有一个处理键盘输入的函数bioskey();
int bioskey(int cmd);
  当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按
键码从键盘缓冲队列中清除。
  当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清除。如果键盘缓冲队列为空,则一直等到有键按
下,才将得到的按键码返回。

  Escape键的按键码为0x11b,下面的小程序可以获取按键的按键码。

for (;
{
key=bioskey(0); /* wait for a keystroke */
printf("0x%x/n",key);
if (key==0x11b) break; /* Escape */
}

常用按键的按键码如下:

#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d


  完整的程序请参见prog2.c、prog3.c。
prog2.c获取按键的按键码,按Escape键退出程序。
prog3.c根据不同的按键进行不同的操作,按Escape键退出程序。


怎样控制方块的移动?
  方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以
了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)


怎样控制时间间隔(用于游戏中控制形状的下落)?
  解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量
加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。


  截获时钟中断要用到函数getvect()和setvect()。
两个函数的声明如下:
?void interrupt (*getvect(int interruptno))();
?void setvect(int interruptno, void interrupt (*isr) ( );

  保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回时的指令是iret,而不是一般函数用到的ret指令。

getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。
setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。


  在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题
的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。

/* prog5.c */
This is an interrupt service routine. You can NOT compile this
program with Test Stack Overflow turned on and get an executable
file which will operate correctly. */

/* 这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。
按escape键提前退出程序 。*/

#include <stdio.h>
#include <dos.h>
#include <conio.h>

/* Escape key */
#define VK_ESC 0x11b

#define TIMER 0x1c /* 时钟中断的中断号 */

/* 中断处理函数在C和C++中的表示略有不同。
如果定义了_cplusplus则表示在C++环境下,否则是在C环境下。 */

#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif

int TimerCounter=0; /* 计时变量,每秒钟增加18。 */

/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */
void interrupt ( *oldhandler)(__CPPARGS);

/* 新的时钟中断处理函数 */
void interrupt newhandler(__CPPARGS)
{
/* increase the global counter */
TimerCounter++;

/* call the old routine */
oldhandler();
}

/* 设置新的时钟中断处理过程 */
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
oldhandler=getvect(TIMER);
disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */
setvect(TIMER,IntProc);
enable(); /* 开启中断 */
}

/* 恢复原有的时钟中断处理过程 */
void KillTimer()
{
disable();
setvect(TIMER,oldhandler);
enable();
}


void main(void)
{
int key,time=0;

SetTimer(newhandler); /* 修改时钟中断 */

for (;
{
if (bioskey(1))
{
key=bioskey(0);
if (key==VK_ESC) /* 按escape键提前退出程序 */
{
printf("User cancel!/n";
break;
}
}
if (TimerCounter>18) /* 1秒钟处理一次 */
{
/* 恢复计时变量 */
TimerCounter=0;
time++;
printf("%d/n",time);
if (time==10) /* 10秒钟后结束程序 */
{
printf("Program terminated normally!/n";
break;
}
}
}
KillTimer(); /* 恢复时钟中断 */

}


游戏中的各种形状及整个游戏空间怎么用数据表示?

以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。

□□□□ □□□□ □□□□ □□□□
□■□□ □■■□ □□□□ □□□□
□■□□ □■□□ □■□□ □■■□
□■■□ □■□□ ■■■□ ■■□□

□□□□ □■□□ □□□□
□□□□ □■□□ □□□□
■■□□ □■□□ □■■□
□■■□ □■□□ □■■□

我定义了一个结构来表示形状。
struct shape
{
int xy[8];
int color;
int next;
}
-1 0 1 2
-3□□□□
-2□□□□
-1□□□□
0□■□□

  所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4
个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺
序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的xy就是用来表示这4个数对的。为了简化程序,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。
  shape中的color表示形状的颜色,不同的形状有不同的颜色。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。假定旋转的方向是逆时针方向(顺时针方向道理一样)。shape中的next就表示当前形状逆时针旋转后的下一个形状的序号。例如:第一种形状及其旋
转变形的形状用结构表示如下。

□□□□ □□□□ □□□□ □□□□
□■□□ □□□□ □■■□ □□□□
□■□□ □□■□ □□■□ ■■■□
□■■□ ■■■□ □□■□ ■□□□

struct shape shapes[19]=
{
/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/
{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */
{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */
{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */
{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */

……

}

  游戏空间指的是整个游戏主要的界面(呵呵,这个定义我实在想不出更准确的,还请哪位大虾指点)。实际上是一个宽10格子、高20格子的
游戏板。用一个全局数组board[12][22]表示。表示的时候:board[x][y]为1时表示游戏板上(x,y)这个位置上已经有方块占着了,board[x][y]
为0表示游戏板上这位置还空着。为了便于判断形状的移动是否到边、到底,初始的时候在游戏板的两边各加一列,在游戏板的下面加一行,全
部填上1,表示不能移出界。即board[0][y],board[11][y](其中y从0到21)初始都为1,board[x][21](其中x从1到10)初始都为1。
1 2 3 4 5 6 7 8 910
1□□□□□□□□□□
2□□□□□□□□□□
3□□□□□□□□□□
4□□□□□□□□□□
5□□□□□□□□□□
6□□□□□□□□□□
7□□□□□□□□□□
8□□□□□□□□□□
9□□□□□□□□□□
10□□□□□□□□□□
11□□□□□□□□□□
12□□□□□□□□□□
13□□□□□□□□□□
14□□□□□□□□□□
15□□□□□□□□□□
16□□□□□□□□□□
17□□□□□□□□□□
18□□□□□□□□□□
19□□□□□□□□□□
20□□□□□□□□□□

  prog6.c演示了用结构表示各种形状的方法。虽然程序稍长一些,但并不是特别复杂。其中游戏板初始化部分并没有真正用到,但是后面的程
序会用到的。其中SIZE定义为16,这样将整个屏幕的坐标系由原来的640×480转换成40×30(640/16=40,480/16=30)。游戏中所有的坐标都是基于40×30的坐标系的,这样有助于简化程序。坐标的转换在程序中由DrawBlock(int x,int y)来体现。

  新的坐标系如下图所示:
-8-7-6-5-4-3-2-1 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031
-4□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
-3□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
-2□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
-1□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
0□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
1□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
2□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
3□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□
4□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□
5□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□
6□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□
7□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
8□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
9□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
10□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
11□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
12□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
13□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
14□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
15□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
16□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
17□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
18□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
19□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
20□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□
21□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
22□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
23□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
24□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
25□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
26□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

  新坐标中最主要的是就是上面两块黑色的部分。左边那块大的就是游戏板(横坐标从1到10,纵坐标从1到20),右边那块小的就是显示“下一个”形状的部分(横坐标从14到17,纵坐标从3到6)。这个新的坐标系是整个游戏的基础,后面所有的移动、变形等的计算都是基于这个坐标系的。


游戏中怎么判断左右及向下移动的可能性?

  看懂了前面的各种形状和游戏板等的表示,接下来的东西就都好办多了。先来看一下某个形状如何显示在游戏板当中。假设要在游戏板中
显示第一个形状。第一个形状在结构中的表示如下:

struct shape shapes[19]=
{
/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/
{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1},

……

}

  那么这个组成形状四个方块的坐标表示为(0,-2)、(0,-1)、(0,0)和(1,0)。这实际上是相对坐标。假形状的实际坐标指的是4x4方块中的第
二列、第三行的方块的位置,设这个位置为(x,y)。那么组成这个形状的四个小方块的实际坐标(以第一个形状为例)就是(x+0,y-2)、(x+0,y-1)、(x+0,y+0)和(x+1,y+0)。由于所有的形状都可以在4x4的方块阵列中表示,这样就找到了一种统一的方法来表示所有的形状了。

-1 0 1 2
-3□□□□ 相对坐标
-2□■□□
-1□■□□ 组成第一种形状的四个方块的相对坐标为(0,-2)、(0,-1)、(0,0)和(1,0)。
0□■■□

让我们看看形状是如何显示在游戏板中的(以第一个形状为例)。

1 2 3 4 5 6 7 8 910
1□■□□□□□□□□ 形状的坐标为(2,3)。组成形状的四个方块的坐标由形状的
2□■□□□□□□□□ 坐标加上这四个小方块各自的相对坐标得出。它们分别是:
3□■■□□□□□□□ (2+0,3-2)、(2+0,3-1)、(2+0,3-0)和(2+1,3-0)。即:
4□□□□□□□□□□ (2,1)、(2,2)、(2,3)和(3,3)。如左图所示。
5□□□□□□□□□□
6□□□□□□□□□□
7■□□□□□□□□□ 形状的坐标为(1,9)。组成形状的四个方块的坐标分别是:
8■□□□□□□□□□ (1+0,9-2)、(1+0,9-1)、(1+0,9-0)和(1+1,9-0)。即:
9■■□□□□□□□□ (1,7)、(1,8)、(1,9)和(2,9)。如左图所示。
10□□□□□□□□□□
11□□□□□□□□□□
12□□□□□□□□□□
13□□□□□□□□□□
14□□□□□□□□□□
15□□□□□□□□□□
16□□□□□□□□□□
17□□□□□□□□□□
18□□□□□□□□■□ 形状的坐标为(9,20)。组成形状的四个方块的坐标分别是:
19□□□□□□□□■□ (9+0,20-2)、(9+0,20-1)、(9+0,20-0)和(9+1,20-0)。即:
20□□□□□□□□■■ (9,18)、(9,19)、(9,20)和(10,20)。如左图所示。

  从现在起,我不再举别的示例程序了。从现在开始所有的示例代码均来自于我写的"Russia.c"。为了记录游戏板的状态,用了一个全局数组board[12][22]。board[x][y](其中x从0到11,y从1到21)等于1表示(x,y)这个位置已经被填充了,组成形状的四个方块的坐标都不能为(x,y),否则将发生冲突。board[x][y](其中x从1到10,y从1到20)等于表示(x,y)这个位置还没有被填充。

  游戏板初始化时,给board[0][y],board[11][y](其中y从1到21)都赋为1,给board[x][21](其中x从1到10)都赋为1。这相当于一开始就给游戏板左右和下方加了个“边”。所有的形状都不能够移入这个“边”,否则将发生冲突。

  现在我们可以开始讨论如何判断一个形状向左、向右和向下移动的可能性了。先说个概念,“当前形状”是指那个正在下落还没有落到底的那个形状。如果当前形状向左移动,不与游戏板现有状态发生冲突,则可以向左移动。具体做法是:先假设当前形状已经向左移动了,判断此时是否与游戏板现有状态发生冲突。如果不发生冲突,则可以向左移动。否则,不可以向左移动。

  判断索引号为ShapeIndex的形状在坐标(x,y)是否与游戏板当前状态发生冲突的代码如下。我把详细的说明加在这段代码中。

enum bool Confilict(int ShapeIndex,int x,int y)
{
int i;

/* 对组成索引号为ShapeIndex的形状的四个方块依次判断 */
for (i=0;i<=7;i++,i++) /* i分别取0,2,4,6 */
{
/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。
此时,发生冲突。 */
if (shapes[ShapeIndex].xy[i]+x<1 ||
shapes[ShapeIndex].xy[i]+x>10) return True;

/* 如果四个方块中某个方块的y坐标小于1,表示整个形状还没有完全落入游戏板中。
此时,没有必要对这个方块进行判断。*/
if (shapes[ShapeIndex].xy[i+1]+y<1) continue;

/* 如果四个方块中有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处
与游戏板当前状态冲突 */
if (board[shapes[ShapeIndex].xy[i]+x][shapes[ShapeIndex].xy[i+1]+y])
return True;
}

/* 四个方块中没有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处
没有与游戏板当前状态冲突 */
return False;
}

对以上代码附加说明如下:
  shapes[ShapeIndex].xy[i](其中i等于0,2,4,6)表示组成索引号为ShapeIndex的形状的某个方块的x相对坐标。(i等于0时,表示第1个方块的x相对坐标;i等于2时,表示第2个方块的x相对坐标;i等于4时,表示第3个方块的x相对坐标;i等于6时,表示第4个方块的x相对坐标。)

  shapes[ShapeIndex].xy[i](其中i等于1,3,5,7)表示组成索引号为ShapeIndex的形状的某个方块的y相对坐标。(i等于1时,表示第1个方块的y相对坐标;i等于3时,表示第2个方块的y相对坐标;i等于5时,表示第3个方块的y相对坐标;i等于7时,表示第4个方块的y相对坐标。)

  shapes[ShapeIndex].xy[i]+x(其中i等于0,2,4,6)表示索引号为ShapeIndex的形状的坐标为(x,y)时,组成该形状的某个方块的x实际坐标。(i等于0时,表示第1个方块的x实际坐标;i等于2时,表示第2个方块的x实际坐标;i等于4时,表示第3个方块的x实际坐标;i等于6时,表示第4个方块的x实际坐标。)

  shapes[ShapeIndex].xy[i]+y(其中i等于1,3,5,7)表示索引号为ShapeIndex的形状的坐标为(x,y)时,组成该形状的某个方块的y实际坐
标。(i等于1时,表示第1个方块的y实际坐标;i等于3时,表示第2个方块的y实际坐标;i等于5时,表示第3个方块的y实际坐标;i等于7时,表示第4个方块的y实际坐标。)

现在来看看这句是什么意思吧。
board[shapes[ShapeIndex].xy[i]+x][shapes[ShapeIndex].xy[i+1]+y]

可以这样理解,把上面一句分开来看::

ActualX=shapes[ShapeIndex].xy[i]+x;/* 其中x为0,2,4,6 */
表示某个方块实际的x坐标。

ActualY=[shapes[ShapeIndex].xy[i+1]+y;
表示某个方块实际的y坐标。

board[ActualX][ActualY]就是与某个方块坐标相同处的游戏板的标志。如果此标志不为0(为1),表示这个方块与游戏板发生冲突。如果此标志为0,表示这个方块没有与游戏板发生冲突。

这段写的比较长,但是不是特别难理解。游戏中很多地方都用到了这种相对坐标向实际坐标的转换方式,看懂了这一段对理解其他部分的代码很有帮助。


仔细看过这段代码后,你可能会提一个问题:不是已经在游戏板的左右两边都加了“边”了吗,为什么还要加下面这个对x坐标的判断呢?

/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。
此时,发生冲突。 */
if (shapes[ShapeIndex].xy[i]+x<1 ||
shapes[ShapeIndex].xy[i]+x>10) return True;

这是因为有一种特殊情况,如下图所示:

■■
■ 2 3 4 5 6 7 8 910
1■□□□□□□□□□ 这在当前形状刚出来的时候,是可能发生的。但是我们只给游戏板
2□□□□□□□□□□ 加了一层“边”。对于这个形状的最左边的那个方块将失去判断,
3□□□□□□□□□□ 如果不予理会,这个形状将会“挂”在游戏板的左上角!当初我也
4□□□□□□□□□□ 没有想到这一点,后来发现会有形状“挂”在最顶层,而导致游戏
5□□□□□□□□□□ 提前退出。发现了这个问题。
6□□□□□□□□□□
7□□□□□□□□□□
8□□□□□□□□□□ 加了这个判断后,游戏板的左右两个“边”对冲突的判断就是去意
9□□□□□□□□□□ 义了。因为没有这两个“边”,对于冲突的判断也不会出错。不过
10□□□□□□□□□□ 为了程序易于理解,还是保留了游戏板的左右两个“边”。
11□□□□□□□□□□
12□□□□□□□□□□
13□□□□□□□□□□
14□□□□□□□□□□
15□□□□□□□□□□
16□□□□□□□□□□
17□□□□□□□□□□
18□□□□□□□□□□
19□□□□□□□□□□
20□□□□□□□□□□

  如果你对我上面提出的新问题及对于这个问题的解释不太明白,没关系,这并不重要。因为现在才刚刚开始,而且刚才所说的这个问题只
有在特殊情况下才出现(当然,一旦发生上面说的问题,游戏就出错啦!^_^ ),对于理解整个程序的思路影响不大。看多了就会明白了(你
会说:原来就这么简单!)。
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ASP 系列函数大全

ASP函数与VBSCRIPT类似,以下举一些常用的函数        Array()        函数返回一个数组        表达式 Array(list)   &...

Asp.Net函数大全

#region =========================================================== \\ ★ 【样式】 Res...

ASP FSO文件处理函数大全

代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-...

ASP字符串函数大全

Len  Len(string|varname)  返回字符串内字符的数目,或是存储一变量所需的字节数。  Trim  Trim(string)  将字符串前后的空格去掉  Ltrim  Ltrim(...

ASP函数大全

  • 2014-07-29 13:41
  • 145KB
  • 下载

Asp.net MVC Action大全(转)

作者:高天乐  来源:博客园  发布时间:2010-08-04 14:25  阅读:201 次  原文链接  [收藏]   using System; using System...

ASP系统函数大全

  • 2013-08-30 08:58
  • 40KB
  • 下载

ASP函数速查大全手

  • 2010-10-06 15:34
  • 134KB
  • 下载

<转>ASP.NET MVC HtmlHelper用法大全

ASP.NET MVC HtmlHelper用法大全   HTML扩展类的所有方法都有2个参数: 以textbox为例子 public static string TextBox( thi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)