戦争ゲーム
意外と簡単に勝負がついてしまうようだ
片方の総取りになってしまう
場のカードを取るときshuffleしないと無限ループになることがあるのも面白い JavaScriptにshuffle()関数は無いようだがP5.jsのものが使える
手 = hand, 場 = table
code:sensou.js
var cards1, cards2, table = []
function* player(cards){ // プレーヤプロセス
while(true){
var result = yield cards.shift() // 手を出す
yield // 結果を待つ
result.forEach((v) => cards.push(v))
}
}
function setup(){
cards1 = new Array(13) // 1〜13のカードを用意
for(var i=0;i<13;i++) cards1i = i+1 cards2 = cards1.concat() // 配列をコピー
shuffle(cards1,true)
shuffle(cards2,true)
p1 = player(cards1)
p2 = player(cards2)
createCanvas(400,400)
frameRate(10) // 毎秒10回勝負する
}
function draw(){
if(cards1.length == 0 || cards2.length == 0) return
var hand1 = p1.next().value // プレーヤの手を取得
var hand2 = p2.next().value
table.push(hand1); table.push(hand2)
shuffle(table,true) // 場の札をシャッフル
v = hand1 == hand2 ? 0 : // 勝敗判定
hand1 == 1 && hand2 == 2 ? 2 :
hand1 == 2 && hand2 == 1 ? 1 :
hand1 > hand2 ? 1 : 2
switch(v){
case 0: p1.next([]); p2.next([]); break;
case 1: p1.next(table); p2.next([]); table = []; break;
case 2: p1.next([]); p2.next(table); table = []; break;
}
clear()
text('player1: '+cards1.join(' '),10,10)
text('player2: '+cards2.join(' '),10,30)
}
code:sensou.rb
# カード準備
cards = []
(1..13).each { |i|
(1..4).each {
cards << i
}
}
cards.shuffle!
# 勝負開始
ba = [] # 引き分けのときに出したままになるカード
while true do
x = cardsx.shift # 先頭の1枚を出す
y = cardsy.shift
if x == y # 引き分けなら場に出す
else
if x == 1 && y != 2
xwin = true
elsif y == 1 && x != 2
xwin = false
else
xwin = (x > y)
end
if xwin
cardsx += (ba + x, y).shuffle else
cardsy += (ba + x, y).shuffle end
ba = []
end
puts '*' * cardsx.length
break if cardsx.length == 0 || cardsy.length == 0
end