精灵巫婆 发表于 2015-1-16 22:32:36

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用列举型数据。这些,我们能够在编程中慢慢地增加完美。
  跟着编程理论的深切,我们的履历也会随之丰厚起来。怎样写一系列的类往撑持各式游戏(包含晋级、斗田主等必要用巨细王牌的游戏)?怎样纪录玩家得分?怎样撑持收集?怎样处置收集游戏中玩家分开?云云等等。经一个月、两个月,一年、两年的理论后,你将成为内行内行。
数据库有很多应用领域,但是如果你单单学数据库的话基本上做数据库管理员比较合适而已,跟领域结合的你还得再学习那些领域知识。(其实数据挖掘我真是不懂,本来这学期开了一门课了。

第二个灵魂 发表于 2015-1-19 16:22:18

那么,ASP.Net有哪些改进呢?

admin 发表于 2015-1-19 16:22:19

在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.ckuyun.com),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的

柔情似水 发表于 2015-1-24 15:16:08

对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。

再现理想 发表于 2015-2-1 18:29:17

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

精灵巫婆 发表于 2015-2-22 02:43:35

ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。

因胸联盟 发表于 2015-3-6 22:32:44

平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。

不帅 发表于 2015-3-13 22:10:41

主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。

变相怪杰 发表于 2015-3-20 21:01:57

当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
页: [1]
查看完整版本: ASP.NET网页编程之用Visual Basic.NET编写扑克牌游戏