ASP.NET网页编程之用Visual Basic.NET编写扑克牌游戏
语言是不是不是最重要的?visual 扑克游戏各式各样,统一种游戏各地弄法亦不尽不异。编程喜好者多喜好编写一些当地弄法的扑克游戏。那末,编写本人的扑克游戏该从那边动手呢?扑克游戏编程关头有两点:一是扑克牌面的绘制;二是扑克游戏划定规矩的算法完成。初学扑克游戏编程的喜好者可从一些复杂的游戏、借用一些现有资本入手下手。本文拟借用Windows自带的Cards.dll和复杂的21点游戏为例,先容扑克游戏编程的开端办法。
1、扑克牌面绘制
Cards.dll撑持Windows自带的游戏,如Solitaire(纸牌游戏)。假如我们晓得怎样利用Cards.dll中的API函数,那末,我们就可以像Windows自带的游戏一样绘制扑克牌面。我们必要利用个中三个基础函数:cdtInit,cdtDrawExt,和cdtTerm。而且必要两个变量:width和height用于初始化函数cdtInit举行初始化。上面给出这些接口函数的声明及参数申明。
PrivatewidthAsInteger=0
PrivateheightAsInteger=0
DeclareFunctioncdtInitLib"cards.dll"(ByRefwidthAsInteger,_
ByRefheightAsInteger)AsBoolean
参数申明:width,height前往牌默许宽和高,单元为pixels。
DeclareFunctioncdtDrawExtLib"cards.dll"(ByValhdcAsIntPtr,_
ByValxAsInteger,ByValyAsInteger,ByValdxAsInteger,_
ByValdyAsInteger,ByValcardAsInteger,_
ByValmodeAsInteger,ByValcolorAsLong)AsBoolean
参数申明:hdc(handletoadevicecontext)句柄;
x,y指定牌左上角坐标位;
dx,dy指定牌宽和高;
card必要绘制的牌,0-51;53-65牌反面;
mode指定绘制体例,牌面向上为0,牌面向下为1;
color指定背景致。
DeclareSubcdtTermLib"cards.dll"()
无参数。
我们必要在游戏入手下手时挪用cdtInit对cards.dll举行初始化,如许我们才干利用cards.dll中的cdtDrawEx等函数;每绘制一张牌,我们都要调一次cdtDrawExt函数;当我们停止游戏时,挪用一次cdtTerm以停止cards.dll的利用。
2、游戏划定规矩的算法完成
二十一点游戏是玩家要获得比农户更年夜的点数总和,但点数凌驾二十一点即为爆牌,并输失落注码。J、Q、K算10点,A可算1点或11点,其他按牌面值计点数。“BlackJack”是由一张A和J、Q、K或10所构成。入手下手时每人发两张牌,一张明,一张暗,凡点数不敷二十一点,可选择博牌。假如首两张牌是对子可选择分牌。
为简化起见,程序中只要两个玩家Dealer和Player,都创造牌,无下注历程,不纪录胜负,不撑持分牌和更加等。二十一点游戏中,一张牌只需有四个属性申明:Face牌面巨细、Suit牌面花样,Count点数,FaceUp牌面是不是向上。因而,这里我们不必Card类而用Card布局。
Structurecard
PublicfaceAsInteger
PublicsuitAsInteger
PubliccountAsInteger
PublicfaceupAsBoolean
EndStructure
游戏入手下手时,我们起首要取一副牌,然后将牌洗好,指定从第几张牌入手下手倡议。洗牌时为获得真实的随机数,用My.Computer.Clock.TickCount作发生随机数的种子。
DimDeck()Ascard
Deck=Newcard(51){}
DimTopCardAsInteger
PrivateSubGetDeck()
Dimi,jAsInteger
Fori=0To3
Forj=0To12
Deck(j+13*i).face=j
Deck(j+13*i).suit=i
Ifj<10Then
Deck(j+13*i).count=j+1
Else
Deck(j+13*i).count=10
EndIf
Deck(j+13*i).faceup=False
Next
Next
EndSub
PrivateSubShuffle()
Dimi,j,kAsInteger
DimtcAscard
Fork=1To500
i=CType(My.Computer.Clock.TickCount*Rnd(),Integer)Mod52
j=CType(Int(Rnd()*52),Integer)
tc=Deck(i)
Deck(i)=Deck(j)
Deck(j)=tc
Next
topcard=0
EndSub
游戏界面中,我们设置三个命令按钮,两个标签。Button1为“发牌”、Button2为“要牌”、Button3为“停牌”。Label1纪录农户点数,Label2纪录玩家点数。游戏过程当中,假如一副牌发完,当即重洗一副牌,并弹出动静对话框告诉。以以下出三个按钮单击事务代码。个中农户游戏过程当中,为简化起见,不曾利用游戏技能。
DimplayerCountAsInteger=0
DimplayerAceAsInteger=0
DimdealerCountAsInteger=0
DimdealerAceAsInteger=0
Dimipcard,idcardAsInteger
PrivateSubdelay(ByValdtAsInteger)
DimtAsInteger
t=My.Computer.Clock.TickCount
Do
IfMy.Computer.Clock.TickCount>=t+dtThenExitDo
Loop
EndSub
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
Button1.Visible=False
Label1.Text=””
Label2.Text=””
Label1.Refresh()
Label2.Refresh()
MyBase.CreateGraphics.Clear(Color.DarkGreen)
dealerAce=0
playerAce=0
dealerCount=0
playerCount=0
cdtDrawExt(MyBase.CreateGraphics.GetHdc,200,200,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
playerCount+=Deck(TopCard).count
IfDeck(TopCard).face=0ThenplayerCount+=10:playerAce+=1
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
Label2.Text=playerCount.ToString
Label2.Refresh()
delay(1000)
cdtDrawExt(MyBase.CreateGraphics.GetHdc,200,10,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
dealerCount+=Deck(TopCard).count
IfDeck(TopCard).face=0ThendealerCount+=10:dealerAce+=1
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
Label1.Text=dealerCount.ToString
Label1.Refresh()
delay(1000)
cdtDrawExt(MyBase.CreateGraphics.GetHdc,220,200,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
playerCount+=Deck(TopCard).count
IfDeck(TopCard).face=0AndplayerAce=0ThenplayerCount+=10:playerAce+=1
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
Label2.Text=playerCount.ToString
Label2.Refresh()
delay(1000)
cdtDrawExt(MyBase.CreateGraphics.GetHdc,220,10,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
dealerCount+=Deck(TopCard).count
IfDeck(TopCard).face=0AnddealerAce=0ThendealerCount+=10:dealerAce+=1
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
Label1.Text=dealerCount.ToString
Label1.Refresh()
delay(1000)
ipcard=2
idcard=2
Button2.Visible=True
Button3.Visible=True
EndSub
PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.Click
cdtDrawExt(MyBase.CreateGraphics.GetHdc,200+20*ipcard,200,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
playerCount+=Deck(TopCard).count
IfDeck(TopCard).face=0ThenplayerCount+=10:playerAce+=1
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
ipcard+=1
Label2.Text=playerCount.ToString
Label2.Refresh()
IfplayerCount>21Then
IfplayerAce>=1Then
playerCount-=10
playerAce-=1
Label2.Text=playerCount.ToString
Label2.Refresh()
Else
MsgBox("Playerloss!")
Button1.Visible=True
Button2.Visible=False
Button3.Visible=False
EndIf
EndIf
EndSub
PrivateSubButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton3.Click
Button2.Visible=False
Button3.Visible=False
dealERPlay()
EndSub
PrivateSubdealerPlay()
Do
IfdealerCount<17Then
cdtDrawExt(MyBase.CreateGraphics.GetHdc,200+20*idcard,10,75,100,(Deck(TopCard).face*4+Deck(TopCard).suit),0,0)
dealerCount+=Deck(TopCard).count
IfdealerCount>21AnddealerAce=1ThendealerCount-=10:dealerAce-=1
IfDeck(TopCard).face=0AnddealerCount<=11ThendealerCount+=10
TopCard+=1
IfTopCard>=52ThenShuffle():MsgBox("NEWDECK!")
idcard+=1
Else
ExitDo
EndIf
Loop
Label1.Text=dealerCount.ToString
Label1.Refresh()
IfdealerCount<=21Then
IfplayerCount>dealerCountThen
MsgBox("Playerwin!")
Else
MsgBox("Dealerwin!")
EndIf
Else
MsgBox("Playerwin!")
EndIf
Button1.Visible=True
Button2.Visible=False
Button3.Visible=False
EndSub
运转了局以下图所示:
3、理论与进步
上述编程中,我们用了却构形貌Card,对Card的Face取值(A,2,…,K)和Suit取值(Club,Diamond,Heart,Spade)用了数值0-12和0-3暗示。游戏划定规矩也作了简化,只要两个玩家,也未对玩家族性(如:财产、下注、所持牌、持牌点数等)举行形貌。理论标明,较好的办法是用Card、player类,Face和Suit用列举型数据。这些,我们能够在编程中慢慢地增加完美。
跟着编程理论的深切,我们的履历也会随之丰厚起来。怎样写一系列的类往撑持各式游戏(包含晋级、斗田主等必要用巨细王牌的游戏)?怎样纪录玩家得分?怎样撑持收集?怎样处置收集游戏中玩家分开?云云等等。经一个月、两个月,一年、两年的理论后,你将成为内行内行。
数据库有很多应用领域,但是如果你单单学数据库的话基本上做数据库管理员比较合适而已,跟领域结合的你还得再学习那些领域知识。(其实数据挖掘我真是不懂,本来这学期开了一门课了。 那么,ASP.Net有哪些改进呢? 在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.ckuyun.com),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。 ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
页:
[1]