《魔兽世界插件》教程---21点扑克游戏 Blackjack

网友投稿 334 2022-11-30

《魔兽世界插件》教程---21点扑克游戏 Blackjack

1.效果图

因为我是新手,只能做一个非常简单的插件,21点扑克游戏。比较有趣吧,插件也可以做一个游戏?游戏中的游戏!

2.编写魔兽世界插件准备

首先你要一个最新的魔兽世界客户端,我的有26G大小。记得要申请一个试玩账户,试玩账户不会消耗游戏时间,可不能用正常账户,那调试代码烧点卡烧的厉害!用什么编辑器呢?魔兽世界插件大部分是Lua,一部分是XML,SciTE比较适合Lua,但我感觉用NotePad++比较好。前期可能要用下一个大型的编辑器叫"AddOn Studio for World of Warcraft",有点像VS。它用来调试XML不错。还要准备3个第三方魔兽世界插件来帮助我们!BugGrabber,BugSack,TinyPad。前面两个是调试用的,如果我们写的插件有错误的话会提示第几行,什么错误。TinyPad是一个游戏内记事本功能的插件,可以在里面写Lua脚本,直接游戏运行,当我们要测试少量的wow API比较有用看完《Programming in Lua, 3rd Edition》和《Beginning Lua with World of Warcraft Add-ons》(真的看完就不用往下看这篇教程了=。=,对英语阅读有一定要求,但不难)比较有用的网站,google.com, wowwiki.com。暴雪是没有公布插件API的,只能google了。

总结下跟一般的编程一样的。

运行效果查看:魔兽世界客户端+试玩账户

编辑器:首推NotePad++,SciTE,AddOn Studio

调试:!BugGrabber,BugSack,TinyPad + print("") ,print 可以在游戏中打印日志,我们可以打印变量来调试。

教程:《Beginning Lua with World of Warcraft Add-ons》

3.还是先写一个插件版的Hello World吧

4.写一个简单插件界面吧

这次是一个完整的插件,名字叫testButton,包括三个文件:

Frame.lua  -- 用来存放脚本

Frame       -- 用来描述界面,以XML编写

testButton.toc -- 用来描述我们的插件,比如插件支持的魔兽世界版本,插件名字,插件作者,插件包含文件等等。

先来看下testButton.toc

## Author: Walle## Interface: 50400## Title: testButton## Version: 1.0Frame.xmlFrame.lua

再看下xml,里面有两个button

self:RegisterForDrag("LeftButton") self:StartMoving() self:StopMovingOrSizing()

这个XML看起来有点复杂,可以用Addon Studio 建一个项目,拖个按钮进去,玩玩。就大致了解上面的东西了。无论是Frame还是Button等都有大小用下面的来表示一个200x200的。

Anchors 来表示位置。point可以设置CENTER,TOP,LEFT等等,下面的Offset是偏移量,比如你设置了CENTER,那么-35就是中心偏左35。

                                                   

Backdrop表示Fram的边框,直接从Addon Studio抄下来。

我们注意到Button有个属性是inherits,继承的意思

inherits="UIPanelButtonTemplate" 这里表示简单的继承了WOW原生的按钮样式,按钮可以设置非常复杂的样式,这里不再赘述,大家可以参考WOW API。

XML中都可以加脚本,比如这里:

                                         self:GetParent():Hide()                     

它的效果就是简单的使整个都隐藏起来。

我们对整个Frame还增加了拖动效果。

还有必须说明的是一般用XML能实现的,直接用Lua代码也可以的。

比如设置宽度,高度,可以这样写:

Frame1:SetWidth(500)

Frame1:SetHeight(500)

大家可以在tinypad中,执行看下效果。不单单是改变属性,创建一个按钮也可以用Lua代码的。大家可以去Google。

最后看下Frame.lua

它里面就是一个简单的function:

function BtnClick()     print ("BtnClick") end

testbutton项目下载:​​ 和 10 牌都算作 10 点。A 牌既可算作1 点也可算作11 点,由玩家自己决定。其余所有2 至9 牌均按其原面值计算。首先玩家开始要牌,如果玩家拿到的前两张牌是一张 A 和一张10点牌,就拥有黑杰克(Blackjack);此时,如果庄家没有黑杰克,玩家就能赢得2倍的赌金(1赔2)。如果庄家的明牌有一张A,则玩家可以考虑买不买保险,金额是赌筹的一半。如果庄家是blackjack,那么玩家拿回保险金并且直接获胜;如果庄家没有blackjack则玩家输掉保险继续游戏。没有黑杰克的玩家可以继续拿牌,可以随意要多少张。目的是尽量往21点靠,靠得越近越好,最好就是21点了。在要牌的过程中,如果所有的牌加起来超过21点,玩家就输了——叫爆掉(Bust),游戏也就结束了。假如玩家没爆掉,又决定不再要牌了,这时庄家就把他的那张暗牌打开来。一般到17点或17点以上不再拿牌,但也有可能15到16点甚至12到13点就不再拿牌或者18到19点继续拿牌。假如庄家爆掉了,那他就输了。假如他没爆掉,那么你就与他比点数大小,大为赢。一样的点数为平手,你可以把你的赌注拿回来。

没做这个游戏之前我也大致知道21点游戏规则,没有想到还有个保险的东西。大家可以去搜下有关21点的flash游戏来玩下。

6.Lua基础教程

老实说,我写这个插件不是为了写一个帮助的插件,是想要学习下Lua的语法。所以看《Programming in Lua, 3rd Edition》就很有必要。

下面只是列举下一些非常基础的Lua语法,用来做我们这次《21点扑克游戏》足够用了。21点扑克游戏,我写了一个函数来得到手里牌的总的值。我们知道A这个牌比较特殊,即可当1,也可做11,但不可能有两张牌都作为11,总的就是>=22就爆掉了。下面这个函数比较简单,先尝试循环所有的牌,对值相加,如果没有A的话就直接返回,如果有A的话,尝试把它以11点来算,如果没爆的话就是最佳值。

function GetTotalValue(cards) local containAce = false --//变量用local关键词,没有local就是全局变量 local totalValue = 0 local anotherTotalValue = 0 for i, v in ipairs(cards) do --//for 循环 totalValue = totalValue + v.value if v.value == 1 then --//if 列子 containAce = true end --//if 结束 end --//for 循环结束 if containAce then anotherTotalValue = totalValue + 10 --// change Ace's value to 11 end if containAce and anotherTotalValue <= 21 then return anotherTotalValue end return totalValueend

简单解释下就是Lua中可以以一行作为结束,都不用加;,局部变量前缀是local,有点像Javascript中的var,但Lua的Local也可以直接不写就是全局变量了。Lua会有很多end,for循环结束有end,if结束也有end,function结束也是end。C++ 中的 && 和 || 在 Lua中是 and 和 or,另外 C++中的 != 在 Lua 中是 ~=

Lua中最重要的就是Table,它没有Javascript中的Array,但这个Table比Array还要强大。再来看一个例子,是我们这个游戏的初始化牌的方法。总共牌共有52张。

POKER_CARD_NAME = "%s of %s"POKER_CARDS = { --//Table好像内部是一个hashtable,所以可以这样用。这样POKER_CARDS["K"] 就== "King"了 K = "King", Q = "Queen", J = "Jack", ["10"] = "Ten", ["9"] = "Nine", ["8"] = "Eight", ["7"] = "Seven", ["6"] = "Six", ["5"] = "Five", ["4"] = "Four", ["3"] = "Three", ["2"] = "Two", A = "Ace",}POKER_SUITS = { H = "Hearts", D = "Diamonds", C = "Clubs", S = "Spades",}local ranks = {"K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2", "A"} --//也可以直接初始话这样,index是用1开始的比较奇怪。local suits = {"H", "D", "C", "S"}local cards = {}local cardsByRank = {}local value = 10for i, r in ipairs(ranks) do cardsByRank[r] = {} for i, s in ipairs(suits) do cards[#cards + 1] = { --// #cards可以得到cards这个table的长度,这里每个card又是一个table rank = POKER_CARDS[r], suit = POKER_SUITS[s], name = POKER_CARD_NAME:format(POKER_CARDS[r], POKER_SUITS[s]), --//string类型中有简单的format语法 code = r..s, value = value } cardsByRank[r][s] = cards[#cards] end if i >= 4 then value = value - 1 end end

7.再讲下别的注意事项

我们这个插件游戏中,需要用到扑克的图片。魔兽世界插件是支持图片显示的,用Frame中的texture就可以了。具体大家可以看代码,图片格式支持两种,一种是TGA,另外一种我忘了。图片大小比较变态,要(2的n次方) x (2的n次方)。比如一个64x128就是合格的图片大小。

魔兽世界插件也支持音乐播放,好像支持mp3格式和ogg格式。大家可以用"格式工厂"软件来转换。播放音乐的API是PlaySoundFile,参数是路径。

function InsurancePayMusic()     PlaySoundFile("Interface\\AddOns\\BlackJack\\sounds\\ins_pay.ogg") end

8.这次做的插件下载地址

​​

参考:

​​《魔兽世界插件》教程​​

《Programming in Lua, 3rd Edition》

《Beginning Lua with World of Warcraft Add-ons》

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:cocos2d 游戏选关界面 附源码
下一篇:关于Kill指令停掉Java程序的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~