|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
语言是不是不是最重要的?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[A(草花、方块、红桃、黑桃),2,…,K];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用列举型数据。这些,我们能够在编程中慢慢地增加完美。
跟着编程理论的深切,我们的履历也会随之丰厚起来。怎样写一系列的类往撑持各式游戏(包含晋级、斗田主等必要用巨细王牌的游戏)?怎样纪录玩家得分?怎样撑持收集?怎样处置收集游戏中玩家分开?云云等等。经一个月、两个月,一年、两年的理论后,你将成为内行内行。
数据库有很多应用领域,但是如果你单单学数据库的话基本上做数据库管理员比较合适而已,跟领域结合的你还得再学习那些领域知识。(其实数据挖掘我真是不懂,本来这学期开了一门课了。 |
|