本文系 Creating JVM language 翻譯的第 20 篇。
原文中的代碼和原文有不一致的地方均在新的代碼倉庫中更正過,建議參考新的代碼倉庫幌羞。
源碼
撲克牌洗牌模擬器
在之前的 19 篇博客中属桦,我把實現(xiàn)編程語言的每一步都詳細的記錄下來了聂宾。如果不拿這門語言,練練手纪他,做個東西玩茶袒,那就沒什么意思了,對不向叉?
我準(zhǔn)備實現(xiàn)一個撲克牌的洗牌模擬器母谎。思路是提供一定數(shù)量的玩家供璧,指定每個玩家的撲克牌的數(shù)量。作為輸出隅居,每個玩家都能獲得一定數(shù)量的隨機撲克牌。
Card 類
Card {
string color
string pattern
Card(string cardColor,string cardPattern) {
color = cardColor
pattern = cardPattern
}
string getColor() {
color
}
string getPattern() {
pattern
}
string toString() {
return "{" + color + "," + pattern + "}"
}
}
沒有黑科技万栅,就是一個對象扰她,并且是不可變的廉涕。
CardDrawer 類
CardDrawer {
start {
var cards = new List() //creates java.util.ArrayList
addNumberedCards(cards) //calling method with 3 arguments (last 2 are default)
addCardWithAllColors("Ace",cards)
addCardWithAllColors("Queen",cards)
addCardWithAllColors("King",cards)
addCardWithAllColors("Jack",cards)
//Calling with named arguments (and in differnet order)
//The last parameter (cardsPerPlayer) is ommited (it's default value is 5)
drawCardsForPlayers(playersAmount -> 5,cardsList -> cards)
}
addNumberedCards(List cardsList,int first=2, int last=10) {
for i from first to last { //loop from first to last (inclusive)
var numberString = new java.lang.Integer(i).toString()
addCardWithAllColors(numberString,cardsList)
}
}
addCardWithAllColors(string pattern,List cardsList) {
cardsList.add(new Card("Clubs",pattern))
cardsList.add(new Card("Diamonds",pattern))
cardsList.add(new Card("Hearts",pattern))
cardsList.add(new Card("Spades",pattern))
}
drawCardsForPlayers(List cardsList,int playersAmount = 3,int cardsPerPlayer = 5) {
if(cardsList.size() < (playersAmount * cardsPerPlayer)) {
print "ERROR - Not enough cards" //No exceptions yet :)
return
}
var random = new java.util.Random()
for i from 1 to playersAmount {
var playernumberString = new java.lang.Integer(i).toString()
print "player " + playernumberString + " is drawing:"
for j from 1 to cardsPerPlayer {
var dawnCardIndex = random.nextInt(cardsList.size() - 1)
var drawedCard = cardsList.remove(dawnCardIndex)
print " drawed:" + drawedCard
}
}
}
}
運行
首先我們需要編譯 Card 類廉白。然后編譯 CardDrawer 類。
java -classpath compiler/target/compiler-1.0-SNAPSHOT-jar-with-dependencies.jar: com.kubadziworski.compiler.Compiler EnkelExamples/RealApp/Card.enk
java -classpath compiler/target/compiler-1.0-SNAPSHOT-jar-with-dependencies.jar:. com.kubadziworski.compiler.Compiler EnkelExamples/RealApp/CardDrawer.enk
kuba@kuba-laptop:~/repos/Enkel-JVM-language$ java CardDrawer
player 1 is drawing:
drawed:{Diamonds,Queen}
drawed:{Spades,7}
drawed:{Hearts,Jack}
drawed:{Spades,4}
drawed:{Hearts,2}
player 2 is drawing:
drawed:{Diamonds,4}
drawed:{Hearts,Ace}
drawed:{Diamonds,Jack}
drawed:{Spades,Queen}
drawed:{Spades,King}
player 3 is drawing:
drawed:{Diamonds,Ace}
drawed:{Clubs,2}
drawed:{Clubs,3}
drawed:{Spades,8}
drawed:{Clubs,7}
player 4 is drawing:
drawed:{Spades,Ace}
drawed:{Diamonds,3}
drawed:{Clubs,4}
drawed:{Clubs,6}
drawed:{Diamonds,2}
player 5 is drawing:
drawed:{Hearts,4}
drawed:{Hearts,Queen}
drawed:{Hearts,10}
drawed:{Clubs,Jack}
drawed:{Diamonds,8}
完美聋溜!
再見,Enkel
為了實現(xiàn) Enkel 和分享整個過程我花費了大量的精力叭爱。寫代碼是一回事撮躁,能夠表達和分享是另一回事(能夠讓讀者通俗易懂本身就是一個很大的挑戰(zhàn))。
在這個過程中我學(xué)習(xí)到了很多买雾,也希望屏幕前面的你也能有所收獲把曼。
很不幸的是,這是系列中的最后一篇了漓穿,這個項目將繼續(xù)下去祝迂,所以,保持關(guān)注吧器净!