Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
5
Task/War-card-game/00-META.yaml
Normal file
5
Task/War-card-game/00-META.yaml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
category:
|
||||
- Cards
|
||||
- Games
|
||||
from: http://rosettacode.org/wiki/War_card_game
|
||||
18
Task/War-card-game/00-TASK.txt
Normal file
18
Task/War-card-game/00-TASK.txt
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
War Card Game
|
||||
|
||||
Simulate the card game War. Use the Bicycle playing card manufacturer's rules. Show a game as played. User input is optional.
|
||||
|
||||
References:
|
||||
|
||||
:* Bicycle card company: [https://bicyclecards.com/how-to-play/war War game site]
|
||||
|
||||
:* Wikipedia: [[wp:War_(card_game)|War (card game)]]
|
||||
|
||||
Related tasks:
|
||||
* [[Playing cards]]
|
||||
* [[Card shuffles]]
|
||||
* [[Deal cards for FreeCell]]
|
||||
* [[Poker hand_analyser]]
|
||||
* [[Go Fish]]
|
||||
|
||||
|
||||
70
Task/War-card-game/11l/war-card-game.11l
Normal file
70
Task/War-card-game/11l/war-card-game.11l
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
UInt32 seed = 0
|
||||
F nonrandom(n)
|
||||
:seed = (1664525 * :seed + 1013904223) [&] FFFF'FFFF
|
||||
R Int(:seed >> 16) % n
|
||||
|
||||
F nonrandom_shuffle(&x)
|
||||
L(i) (x.len - 1 .< 0).step(-1)
|
||||
V j = nonrandom(i + 1)
|
||||
swap(&x[i], &x[j])
|
||||
|
||||
V SUITS = [‘♣’, ‘♦’, ‘♥’, ‘♠’]
|
||||
V FACES = [‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘J’, ‘Q’, ‘K’, ‘A’]
|
||||
V DECK = multiloop(FACES, SUITS, (f, s) -> f‘’s)
|
||||
V CARD_TO_RANK = Dict((0 .< DECK.len).map(i -> (:DECK[i], (i + 3) I/ 4)))
|
||||
|
||||
T WarCardGame
|
||||
[String] deck1, deck2, pending
|
||||
|
||||
F ()
|
||||
V deck = copy(:DECK)
|
||||
nonrandom_shuffle(&deck)
|
||||
.deck1 = deck[0.<26]
|
||||
.deck2 = deck[26..]
|
||||
|
||||
F gameover()
|
||||
‘ game over who won message ’
|
||||
I .deck2.empty
|
||||
I .deck1.empty
|
||||
print("\nGame ends as a tie.")
|
||||
E
|
||||
print("\nPlayer 1 wins the game.")
|
||||
E
|
||||
print("\nPlayer 2 wins the game.")
|
||||
R 0B
|
||||
|
||||
F turn()
|
||||
‘ one turn, may recurse on tie ’
|
||||
I .deck1.empty | .deck2.empty
|
||||
R .gameover()
|
||||
|
||||
V card1 = .deck1.pop(0)
|
||||
V card2 = .deck2.pop(0)
|
||||
V (rank1, rank2) = (:CARD_TO_RANK[card1], :CARD_TO_RANK[card2])
|
||||
print(‘#<10#<10’.format(card1, card2), end' ‘’)
|
||||
I rank1 > rank2
|
||||
print(‘Player 1 takes the cards.’)
|
||||
.deck1.extend([card1, card2])
|
||||
.deck1.extend(.pending)
|
||||
.pending.clear()
|
||||
E I rank1 < rank2
|
||||
print(‘Player 2 takes the cards.’)
|
||||
.deck2.extend([card2, card1])
|
||||
.deck2.extend(.pending)
|
||||
.pending.clear()
|
||||
E
|
||||
print(‘Tie!’)
|
||||
I .deck1.empty | .deck2.empty
|
||||
R .gameover()
|
||||
|
||||
V card3 = .deck1.pop(0)
|
||||
V card4 = .deck2.pop(0)
|
||||
.pending.extend([card1, card2, card3, card4])
|
||||
print(‘#<10#<10’.format(‘?’, ‘?’)‘Cards are face down.’)
|
||||
R .turn()
|
||||
|
||||
R 1B
|
||||
|
||||
V WG = WarCardGame()
|
||||
L WG.turn()
|
||||
L.continue
|
||||
65
Task/War-card-game/AutoHotkey/war-card-game.ahk
Normal file
65
Task/War-card-game/AutoHotkey/war-card-game.ahk
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
suits := ["♠", "♦", "♥", "♣"]
|
||||
faces := [2,3,4,5,6,7,8,9,10,"J","Q","K","A"]
|
||||
deck := [], p1 := [], p2 := []
|
||||
for i, s in suits
|
||||
for j, v in faces
|
||||
deck.Push(v s)
|
||||
deck := shuffle(deck)
|
||||
deal := deal(deck, p1, p2)
|
||||
p1 := deal.1, p2 := deal.2
|
||||
|
||||
for i, v in p2
|
||||
{
|
||||
if InStr(v, "A")
|
||||
p2[i] := p1[i], p1[i] := v
|
||||
if InStr(v, "K")
|
||||
p2[i] := p1[i], p1[i] := v
|
||||
if InStr(v, "Q")
|
||||
p2[i] := p1[i], p1[i] := v
|
||||
if InStr(v, "J")
|
||||
p2[i] := p1[i], p1[i] := v
|
||||
}
|
||||
MsgBox % war(p1, p2)
|
||||
return
|
||||
war(p1, p2){
|
||||
J:=11, Q:=11, K:=11, A:=12, stack := [], cntr := 0
|
||||
output := "------------------------------------------"
|
||||
. "`nRound# Deal Winner P1 P1"
|
||||
. "`n------------------------------------------"
|
||||
. "`nround0 26 26"
|
||||
|
||||
while (p1.Count() && p2.Count()) {
|
||||
cntr++
|
||||
stack.Push(c1:=p1.RemoveAt(1)), stack.Push(c2:=p2.RemoveAt(1))
|
||||
r1:=SubStr(c1,1,-1) ,r2:=SubStr(c2,1,-1)
|
||||
v1:=r1<11?r1:%r1% ,v2:=r2<11?r2:%r2%
|
||||
output .= "`nround# " cntr "`t" SubStr(c1 " n", 1, 4) "vs " SubStr(c2 " ", 1, 4)
|
||||
if (v1 > v2){
|
||||
loop % stack.Count()
|
||||
p1.Push(stack.RemoveAt(1))
|
||||
output .= "`t`tP1 wins"
|
||||
}
|
||||
else if (v1 < v2){
|
||||
loop % stack.Count()
|
||||
p2.Push(stack.RemoveAt(1))
|
||||
output .= "`t`tP2 wins"
|
||||
}
|
||||
if (v1 = v2){
|
||||
output .= "`t`t**WAR**`t" P1.Count() "`t" P2.Count()
|
||||
stack.Push(c1:=p1.RemoveAt(1)), stack.Push(c2:=p2.RemoveAt(1))
|
||||
if !(p1.Count() && p2.Count())
|
||||
break
|
||||
output .= "`nround# " ++cntr "`t(" SubStr(c1 " ", 1, 3) ") - (" SubStr(c2 " ", 1, 3) ")"
|
||||
output .= "`tFace Dn"
|
||||
}
|
||||
output .= "`t" P1.Count() "`t" P2.Count()
|
||||
if !Mod(cntr, 20)
|
||||
{
|
||||
MsgBox % output
|
||||
output := ""
|
||||
}
|
||||
}
|
||||
output .= "`n" (P1.Count() ? "P1 Wins" : "P2 Wins")
|
||||
output := StrReplace(output, " )", ") ")
|
||||
output := StrReplace(output, " -", " -")
|
||||
return output
|
||||
98
Task/War-card-game/C++/war-card-game.cpp
Normal file
98
Task/War-card-game/C++/war-card-game.cpp
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
class war_game {
|
||||
public:
|
||||
war_game() {
|
||||
for ( char suit : SUITS ) {
|
||||
for ( char pip : PIPS ) {
|
||||
deck.emplace_back(card(suit, pip));
|
||||
}
|
||||
}
|
||||
std::random_shuffle(deck.begin(), deck.end());
|
||||
|
||||
handA = { deck.begin(), deck.begin() + 26 };
|
||||
handB = { deck.begin() + 26, deck.end() };
|
||||
}
|
||||
|
||||
void next_turn() {
|
||||
card cardA = handA.front(); handA.erase(handA.begin());
|
||||
card cardB = handB.front(); handB.erase(handB.begin());
|
||||
tabledCards.emplace_back(cardA);
|
||||
tabledCards.emplace_back(cardB);
|
||||
int32_t rankA = getRank(cardA.pip);
|
||||
int32_t rankB = getRank(cardB.pip);
|
||||
std::cout << cardA.pip << cardA.suit << " " << cardB.pip << cardB.suit << std::endl;
|
||||
|
||||
if ( rankA > rankB ) {
|
||||
std::cout << " Player A takes the cards" << std::endl;
|
||||
std::random_shuffle(tabledCards.begin(), tabledCards.end());
|
||||
handA.insert(handA.end(), tabledCards.begin(), tabledCards.end());
|
||||
tabledCards.clear();
|
||||
} else if ( rankA < rankB ) {
|
||||
std::cout << " Player B takes the cards" << std::endl;
|
||||
std::random_shuffle(tabledCards.begin(), tabledCards.end());
|
||||
handB.insert(handB.end(), tabledCards.begin(), tabledCards.end());;
|
||||
tabledCards.clear();
|
||||
} else {
|
||||
std::cout << " War!" << std::endl;
|
||||
if ( game_over() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
card cardAA = handA.front(); handA.erase(handA.begin());
|
||||
card cardBB = handB.front(); handB.erase(handB.begin());
|
||||
tabledCards.emplace_back(cardAA);
|
||||
tabledCards.emplace_back(cardBB);
|
||||
std::cout << "? ? Cards are face down" << std::endl;
|
||||
if ( game_over() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
next_turn();
|
||||
}
|
||||
}
|
||||
|
||||
bool game_over() const {
|
||||
return handA.size() == 0 || handB.size() == 0;
|
||||
}
|
||||
|
||||
void declare_winner() const {
|
||||
if ( handA.size() == 0 && handB.size() == 0 ) {
|
||||
std::cout << "The game ended in a tie" << std::endl;
|
||||
} else if ( handA.size() == 0 ) {
|
||||
std::cout << "Player B has won the game" << std::endl;
|
||||
} else {
|
||||
std::cout << "Player A has won the game" << std::endl;
|
||||
}
|
||||
}
|
||||
private:
|
||||
class card {
|
||||
public:
|
||||
card(const char suit, const char pip) : suit(suit), pip(pip) {};
|
||||
char suit, pip;
|
||||
};
|
||||
|
||||
int32_t getRank(const char ch) const {
|
||||
auto it = find(PIPS.begin(), PIPS.end(), ch);
|
||||
if ( it != PIPS.end() ) {
|
||||
return it - PIPS.begin();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::vector<card> deck, handA, handB, tabledCards;
|
||||
inline static const std::vector<char> PIPS = { '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' };
|
||||
inline static const std::vector<char> SUITS = { 'C', 'D', 'H', 'S' };
|
||||
};
|
||||
|
||||
int main() {
|
||||
war_game wargame;
|
||||
|
||||
while ( ! wargame.game_over() ) {
|
||||
wargame.next_turn();
|
||||
}
|
||||
|
||||
wargame.declare_winner();
|
||||
}
|
||||
106
Task/War-card-game/Go/war-card-game.go
Normal file
106
Task/War-card-game/Go/war-card-game.go
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
var suits = []string{"♣", "♦", "♥", "♠"}
|
||||
var faces = []string{"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"}
|
||||
var cards = make([]string, 52)
|
||||
var ranks = make([]int, 52)
|
||||
|
||||
func init() {
|
||||
for i := 0; i < 52; i++ {
|
||||
cards[i] = fmt.Sprintf("%s%s", faces[i%13], suits[i/13])
|
||||
ranks[i] = i % 13
|
||||
}
|
||||
}
|
||||
|
||||
func war() {
|
||||
deck := make([]int, 52)
|
||||
for i := 0; i < 52; i++ {
|
||||
deck[i] = i
|
||||
}
|
||||
rand.Shuffle(52, func(i, j int) {
|
||||
deck[i], deck[j] = deck[j], deck[i]
|
||||
})
|
||||
hand1 := make([]int, 26, 52)
|
||||
hand2 := make([]int, 26, 52)
|
||||
for i := 0; i < 26; i++ {
|
||||
hand1[25-i] = deck[2*i]
|
||||
hand2[25-i] = deck[2*i+1]
|
||||
}
|
||||
for len(hand1) > 0 && len(hand2) > 0 {
|
||||
card1 := hand1[0]
|
||||
copy(hand1[0:], hand1[1:])
|
||||
hand1[len(hand1)-1] = 0
|
||||
hand1 = hand1[0 : len(hand1)-1]
|
||||
card2 := hand2[0]
|
||||
copy(hand2[0:], hand2[1:])
|
||||
hand2[len(hand2)-1] = 0
|
||||
hand2 = hand2[0 : len(hand2)-1]
|
||||
played1 := []int{card1}
|
||||
played2 := []int{card2}
|
||||
numPlayed := 2
|
||||
for {
|
||||
fmt.Printf("%s\t%s\t", cards[card1], cards[card2])
|
||||
if ranks[card1] > ranks[card2] {
|
||||
hand1 = append(hand1, played1...)
|
||||
hand1 = append(hand1, played2...)
|
||||
fmt.Printf("Player 1 takes the %d cards. Now has %d.\n", numPlayed, len(hand1))
|
||||
break
|
||||
} else if ranks[card1] < ranks[card2] {
|
||||
hand2 = append(hand2, played2...)
|
||||
hand2 = append(hand2, played1...)
|
||||
fmt.Printf("Player 2 takes the %d cards. Now has %d.\n", numPlayed, len(hand2))
|
||||
break
|
||||
} else {
|
||||
fmt.Println("War!")
|
||||
if len(hand1) < 2 {
|
||||
fmt.Println("Player 1 has insufficient cards left.")
|
||||
hand2 = append(hand2, played2...)
|
||||
hand2 = append(hand2, played1...)
|
||||
hand2 = append(hand2, hand1...)
|
||||
hand1 = hand1[0:0]
|
||||
break
|
||||
}
|
||||
if len(hand2) < 2 {
|
||||
fmt.Println("Player 2 has insufficient cards left.")
|
||||
hand1 = append(hand1, played1...)
|
||||
hand1 = append(hand1, played2...)
|
||||
hand1 = append(hand1, hand2...)
|
||||
hand2 = hand2[0:0]
|
||||
break
|
||||
}
|
||||
fdCard1 := hand1[0] // face down card
|
||||
card1 = hand1[1] // face up card
|
||||
copy(hand1[0:], hand1[2:])
|
||||
hand1[len(hand1)-1] = 0
|
||||
hand1[len(hand1)-2] = 0
|
||||
hand1 = hand1[0 : len(hand1)-2]
|
||||
played1 = append(played1, fdCard1, card1)
|
||||
fdCard2 := hand2[0] // face down card
|
||||
card2 = hand2[1] // face up card
|
||||
copy(hand2[0:], hand2[2:])
|
||||
hand2[len(hand2)-1] = 0
|
||||
hand2[len(hand2)-2] = 0
|
||||
hand2 = hand2[0 : len(hand2)-2]
|
||||
played2 = append(played2, fdCard2, card2)
|
||||
numPlayed += 4
|
||||
fmt.Println("? \t? \tFace down cards.")
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(hand1) == 52 {
|
||||
fmt.Println("Player 1 wins the game!")
|
||||
} else {
|
||||
fmt.Println("Player 2 wins the game!")
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
war()
|
||||
}
|
||||
27
Task/War-card-game/J/war-card-game-1.j
Normal file
27
Task/War-card-game/J/war-card-game-1.j
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
DECK=: '2 3 4 5 6 7 8 9 10 J K Q A' (,' of ',])&.>/&cut '♣ ♦ ♥ ♠'
|
||||
rank=: DECK {{ {."1 ($m)#:(,m) i. y }}
|
||||
shuffle=: {~ ?~@#
|
||||
deal=: _26 ]\ shuffle@,@DECK
|
||||
cardwar=: {{
|
||||
TURNS=: 0
|
||||
'P1 P2'=: <each deal''
|
||||
while. 0<P1 *&# P2 do. turn TURNS=: TURNS+1 end.
|
||||
after=. ' after ',TURNS,&":' turn','s'#~1~:TURNS
|
||||
if. #P1 do. 'Player 1 wins', after
|
||||
elseif. #P2 do. 'Player 2 wins', after
|
||||
else. 'Tie',after end.
|
||||
}}
|
||||
plays=: {{ ((m)=: }.".m)](echo n,~(m,' plays '),;'nothing'&[^:(0=#@]){.".m)]({.".m) }}
|
||||
turn=: {{
|
||||
c=. (b=. 'P2' plays''),(a =. 'P1' plays'')
|
||||
while. a =&rank b do.
|
||||
if. 0=P1 *&# P2 do. echo 'No more cards to draw' return. end.
|
||||
c=. c, (a=. 'P1' plays''),(b =. 'P2' plays''), 'P1' plays' face down', 'P2' plays' face down'
|
||||
end.
|
||||
('P',":1+a <&rank b) takes ({~ ?~@#)c-.a:
|
||||
}}
|
||||
takes=: {{
|
||||
(m)=: (".m),y
|
||||
echo m,' takes ',;(<' and ') _2}}.,(<', '),.y
|
||||
echo''
|
||||
}}
|
||||
40
Task/War-card-game/J/war-card-game-2.j
Normal file
40
Task/War-card-game/J/war-card-game-2.j
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
cardwar''
|
||||
P1 plays 6 of ♦
|
||||
P2 plays 9 of ♥
|
||||
P2 takes 6 of ♦ and 9 of ♥
|
||||
|
||||
P1 plays K of ♣
|
||||
P2 plays 6 of ♣
|
||||
P1 takes K of ♣ and 6 of ♣
|
||||
|
||||
P1 plays A of ♦
|
||||
P2 plays A of ♥
|
||||
P2 plays 5 of ♠ face down
|
||||
P1 plays J of ♥ face down
|
||||
P2 plays 2 of ♣
|
||||
P1 plays J of ♦
|
||||
P1 takes A of ♥, J of ♥, A of ♦, 2 of ♣, 5 of ♠ and J of ♦
|
||||
|
||||
P1 plays 7 of ♥
|
||||
P2 plays 10 of ♣
|
||||
P2 takes 10 of ♣ and 7 of ♥
|
||||
|
||||
(... many lines deleted ...)
|
||||
|
||||
P1 plays 2 of ♦
|
||||
P2 plays 5 of ♥
|
||||
P2 takes 2 of ♦ and 5 of ♥
|
||||
|
||||
P1 plays K of ♥
|
||||
P2 plays 4 of ♥
|
||||
P1 takes 4 of ♥ and K of ♥
|
||||
|
||||
P1 plays 3 of ♦
|
||||
P2 plays 3 of ♣
|
||||
P2 plays 2 of ♦ face down
|
||||
P1 plays 6 of ♠ face down
|
||||
P2 plays 5 of ♥
|
||||
P1 plays K of ♠
|
||||
P1 takes 6 of ♠, K of ♠, 5 of ♥, 3 of ♣, 3 of ♦ and 2 of ♦
|
||||
|
||||
Player 1 wins after 86 turns
|
||||
103
Task/War-card-game/Java/war-card-game.java
Normal file
103
Task/War-card-game/Java/war-card-game.java
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public final class WarCardGame {
|
||||
|
||||
public static void main(String[] args) {
|
||||
WarGame warGame = new WarGame();
|
||||
|
||||
while ( ! warGame.gameOver() ) {
|
||||
warGame.nextTurn();
|
||||
}
|
||||
|
||||
warGame.declareWinner();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
final class WarGame {
|
||||
|
||||
public WarGame() {
|
||||
deck = new ArrayList<Card>(52);
|
||||
for ( Character suit : SUITS ) {
|
||||
for ( Character pip : PIPS ) {
|
||||
deck.add( new Card(suit, pip) );
|
||||
}
|
||||
}
|
||||
Collections.shuffle(deck);
|
||||
|
||||
handA = new ArrayList<Card>(deck.subList(0, 26));
|
||||
handB = new ArrayList<Card>(deck.subList(26, 52));
|
||||
tabledCards = new ArrayList<Card>();
|
||||
}
|
||||
|
||||
public void nextTurn() {
|
||||
Card cardA = handA.remove(0);
|
||||
Card cardB = handB.remove(0);
|
||||
tabledCards.add(cardA);
|
||||
tabledCards.add(cardB);
|
||||
int rankA = PIPS.indexOf(cardA.pip);
|
||||
int rankB = PIPS.indexOf(cardB.pip);
|
||||
|
||||
System.out.print(cardA + " " + cardB);
|
||||
if ( rankA > rankB ) {
|
||||
System.out.println(" Player A takes the cards");
|
||||
Collections.shuffle(tabledCards);
|
||||
handA.addAll(tabledCards);
|
||||
tabledCards.clear();
|
||||
} else if ( rankA < rankB ) {
|
||||
System.out.println(" Player B takes the cards");
|
||||
Collections.shuffle(tabledCards);
|
||||
handB.addAll(tabledCards);
|
||||
tabledCards.clear();
|
||||
} else {
|
||||
System.out.println(" War!");
|
||||
if ( gameOver() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
Card cardAA = handA.remove(0);
|
||||
Card cardBB = handB.remove(0);
|
||||
tabledCards.add(cardAA);
|
||||
tabledCards.add(cardBB);
|
||||
System.out.println("? ? Cards are face down");
|
||||
if ( gameOver() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nextTurn();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean gameOver() {
|
||||
return handA.size() == 0 || handB.size() == 0;
|
||||
}
|
||||
|
||||
public void declareWinner() {
|
||||
if ( handA.size() == 0 && handB.size() == 0 ) {
|
||||
System.out.println("The game ended in a tie");
|
||||
} else if ( handA.size() == 0 ) {
|
||||
System.out.println("Player B has won the game");
|
||||
} else {
|
||||
System.out.println("Player A has won the game");
|
||||
}
|
||||
}
|
||||
|
||||
private record Card(Character suit, Character pip) {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "" + pip + suit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private List<Card> deck, handA, handB, tabledCards;
|
||||
|
||||
private static final List<Character> PIPS =
|
||||
Arrays.asList( '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' );
|
||||
private static final List<Character> SUITS = List.of( 'C', 'D', 'H', 'S' );
|
||||
|
||||
}
|
||||
49
Task/War-card-game/Julia/war-card-game.julia
Normal file
49
Task/War-card-game/Julia/war-card-game.julia
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# https://bicyclecards.com/how-to-play/war/
|
||||
|
||||
using Random
|
||||
|
||||
const SUITS = ["♣", "♦", "♥", "♠"]
|
||||
const FACES = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" ]
|
||||
const DECK = vec([f * s for s in SUITS, f in FACES])
|
||||
const rdict = Dict(DECK[i] => div(i + 3, 4) for i in eachindex(DECK))
|
||||
|
||||
deal2(deck) = begin d = shuffle(deck); d[1:2:51], d[2:2:52] end
|
||||
|
||||
function turn!(d1, d2, pending)
|
||||
(isempty(d1) || isempty(d2)) && return false
|
||||
c1, c2 = popfirst!(d1), popfirst!(d2)
|
||||
r1, r2 = rdict[c1], rdict[c2]
|
||||
print(rpad(c1, 10), rpad(c2, 10))
|
||||
if r1 > r2
|
||||
println("Player 1 takes the cards.")
|
||||
push!(d1, c1, c2, pending...)
|
||||
empty!(pending)
|
||||
elseif r1 < r2
|
||||
println("Player 2 takes the cards.")
|
||||
push!(d2, c2, c1, pending...)
|
||||
empty!(pending)
|
||||
else # r1 == r2
|
||||
println("Tie!")
|
||||
(isempty(d1) || isempty(d2)) && return false
|
||||
c3, c4 = popfirst!(d1), popfirst!(d2)
|
||||
println(rpad("?", 10), rpad("?", 10), "Cards are face down.")
|
||||
return turn!(d1, d2, push!(pending, c1, c2, c3, c4))
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function warcardgame()
|
||||
deck1, deck2 = deal2(DECK)
|
||||
while turn!(deck1, deck2, []) end
|
||||
if isempty(deck2)
|
||||
if isempty(deck1)
|
||||
println("Game ends as a tie.")
|
||||
else
|
||||
println("Player 1 wins the game.")
|
||||
end
|
||||
else
|
||||
println("Player 2 wins the game.")
|
||||
end
|
||||
end
|
||||
|
||||
warcardgame()
|
||||
130
Task/War-card-game/Lua/war-card-game.lua
Normal file
130
Task/War-card-game/Lua/war-card-game.lua
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
-- main.lua
|
||||
function newGame ()
|
||||
-- new deck
|
||||
local deck = {}
|
||||
for iSuit = 1, #CardSuits do
|
||||
for iRank = 1, #CardRanks do
|
||||
local card = {
|
||||
iSuit = iSuit,
|
||||
iRank = iRank,
|
||||
suit = CardSuits[iSuit],
|
||||
rank = iRank,
|
||||
name = CardRanks[iRank] .. CardSuits[iSuit]
|
||||
}
|
||||
local i = math.random (#deck + 1)
|
||||
table.insert (deck, i, card)
|
||||
end
|
||||
end
|
||||
|
||||
-- new deal
|
||||
Players = {
|
||||
{index = 1, cards = {}},
|
||||
{index = 2, cards = {}},
|
||||
}
|
||||
for i = 1, #deck/#Players do
|
||||
for iPlayer = 1, #Players do
|
||||
table.insert (Players[iPlayer].cards, table.remove(deck))
|
||||
end
|
||||
end
|
||||
WarCards = {}
|
||||
Turn = 1
|
||||
Statistics = {}
|
||||
end
|
||||
|
||||
function getHigherCard (cardA, cardB)
|
||||
if cardA.rank > cardB.rank then
|
||||
return cardA, 1
|
||||
elseif cardA.rank < cardB.rank then
|
||||
return cardB, 2
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
function love.load()
|
||||
-- there is no card suits in the standard font
|
||||
CardSuits = {"@", "#", "$", "%"}
|
||||
CardRanks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "V", "Q", "K", "A"}
|
||||
|
||||
newGame ()
|
||||
end
|
||||
|
||||
function love.draw()
|
||||
for iPlayer = 1, #Players do
|
||||
local player = Players[iPlayer]
|
||||
love.graphics.print ('Player '..player.index, 50*(iPlayer-1), 0)
|
||||
for iCard, card in ipairs (player.cards) do
|
||||
love.graphics.print (card.name, 50*(iPlayer-1), 14*iCard)
|
||||
end
|
||||
end
|
||||
for i = 1, math.min(40, #Statistics) do
|
||||
local str = Statistics[i]
|
||||
love.graphics.print (str, 150, 20+(i-1)*14)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function makeTurn ()
|
||||
local card1 = table.remove (Players[1].cards)
|
||||
local card2 = table.remove (Players[2].cards)
|
||||
if card1 and card2 then
|
||||
table.insert (WarCards, 1, card1)
|
||||
table.insert (WarCards, math.random (1, 2), card2)
|
||||
local winCard, index = getHigherCard (card1, card2)
|
||||
if winCard then
|
||||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' get ' .. #WarCards .. ' cards: ' .. card1.name .. ' vs ' .. card2.name)
|
||||
|
||||
for iCard = #WarCards, 1, -1 do
|
||||
table.insert (Players[index].cards, 1, table.remove (WarCards))
|
||||
end
|
||||
elseif (#Players[1].cards > 0) and (#Players[2].cards > 0) then
|
||||
-- start war
|
||||
table.insert (Statistics, 1, Turn .. ' War: ' .. card1.name .. ' vs ' .. card2.name)
|
||||
table.insert (WarCards, table.remove (Players[1].cards))
|
||||
table.insert (WarCards, table.remove (Players[2].cards))
|
||||
else
|
||||
local index = 2
|
||||
if #Players[1].cards == 0 then index = 1 end
|
||||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' has no cards for this war.')
|
||||
-- GameOver = true
|
||||
end
|
||||
Turn = Turn + 1
|
||||
elseif GameOver then
|
||||
GameOver = false
|
||||
newGame ()
|
||||
else
|
||||
local index = 2
|
||||
if #Players[1].cards > #Players[2].cards then index = 1 end
|
||||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' wins the game!')
|
||||
GameOver = true
|
||||
end
|
||||
end
|
||||
|
||||
function love.keypressed(key, scancode, isrepeat)
|
||||
if false then
|
||||
elseif key == "space" then
|
||||
makeTurn ()
|
||||
elseif scancode == "n" then
|
||||
GameOver = false
|
||||
newGame ()
|
||||
elseif scancode == "q" then
|
||||
local lastTurn = Turn
|
||||
while not (GameOver or (Turn > lastTurn + 10000-1)) do
|
||||
makeTurn ()
|
||||
end
|
||||
elseif key == "escape" then
|
||||
love.event.quit()
|
||||
end
|
||||
if #Statistics > 40 then
|
||||
local i = #Statistics, 40, -1 do
|
||||
table.remove (Statistics, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function love.mousepressed( x, y, button, istouch, presses )
|
||||
if button == 1 then -- left mouse button
|
||||
makeTurn ()
|
||||
elseif button == 2 then -- right mouse button
|
||||
end
|
||||
end
|
||||
93
Task/War-card-game/Nim/war-card-game.nim
Normal file
93
Task/War-card-game/Nim/war-card-game.nim
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
import strformat
|
||||
import playing_cards
|
||||
|
||||
const
|
||||
None = -1
|
||||
Player1 = 0
|
||||
Player2 = 1
|
||||
|
||||
type Player = range[None..Player2]
|
||||
|
||||
const PlayerNames: array[Player1..Player2, string] = ["Player 1", "Player 2"]
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc `<`(a, b: Card): bool =
|
||||
## Compare two cards by their rank, Ace being the greatest.
|
||||
if a.rank == Ace: false
|
||||
elif b.rank == Ace: true
|
||||
else: a.rank < b.rank
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc displayRound(round: int; hands: openArray[Hand]; card1, card2: string; text: string) =
|
||||
## Display text for a round.
|
||||
stdout.write &"Round {round:<4} "
|
||||
stdout.write &"Cards: {hands[Player1].len:>2}/{hands[Player2].len:<2} "
|
||||
stdout.write &"{card1:>3} {card2:>3} "
|
||||
echo text
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc outOfCards(player: Player) =
|
||||
## Display a message when a player has run out of cards.
|
||||
echo &"{PlayerNames[player]} has run out of cards."
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
proc doRound(hands: var openArray[Hand]; num: Positive) =
|
||||
## Execute a round.
|
||||
|
||||
var stack1, stack2: seq[Card]
|
||||
var winner: Player = None
|
||||
|
||||
while winner == None:
|
||||
let card1 = hands[Player1].draw()
|
||||
let card2 = hands[Player2].draw()
|
||||
stack1.add card1
|
||||
stack2.add card2
|
||||
if card1.rank != card2.rank:
|
||||
winner = if card1 < card2: Player2 else: Player1
|
||||
displayRound(num, hands, $card1, $card2, &"{PlayerNames[winner]} takes the cards.")
|
||||
else:
|
||||
# There is a war.
|
||||
displayRound(num, hands, $card1, $card2, "This is a war.")
|
||||
if hands[Player1].len == 0:
|
||||
winner = Player2
|
||||
elif hands[Player2].len == 0:
|
||||
winner = Player1
|
||||
else:
|
||||
# Add a hidden card on stacks.
|
||||
stack1.add hands[Player1].draw()
|
||||
stack2.add hands[Player2].draw()
|
||||
displayRound(num, hands, " ?", " ?", "Cards are face down.")
|
||||
# Check if each player has enough cards to continue the war.
|
||||
if hands[Player1].len == 0:
|
||||
Player1.outOfCards()
|
||||
winner = Player2
|
||||
elif hands[Player2].len == 0:
|
||||
Player2.outOfCards()
|
||||
winner = Player1
|
||||
|
||||
# Update hands.
|
||||
var stack = stack1 & stack2
|
||||
stack.shuffle()
|
||||
hands[winner] = stack & hands[winner]
|
||||
|
||||
|
||||
#———————————————————————————————————————————————————————————————————————————————————————————————————
|
||||
|
||||
var deck = initDeck()
|
||||
deck.shuffle()
|
||||
|
||||
var hands = deck.deal(2, 26)
|
||||
var num = 0
|
||||
while true:
|
||||
inc num
|
||||
hands.doRound(num)
|
||||
if hands[Player1].len == 0:
|
||||
echo "Player 2 wins this game."
|
||||
break
|
||||
if hands[Player2].len == 0:
|
||||
echo "Player 1 wins this game."
|
||||
break
|
||||
20
Task/War-card-game/Perl/war-card-game.pl
Normal file
20
Task/War-card-game/Perl/war-card-game.pl
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use strict; # https://rosettacode.org/wiki/War_Card_Game
|
||||
use warnings;
|
||||
use List::Util qw( shuffle );
|
||||
|
||||
my %rank;
|
||||
@rank{ 2 .. 9, qw(t j q k a) } = 1 .. 13; # for winner
|
||||
local $_ = join '', shuffle
|
||||
map { my $f = $_; map $f.$_, qw( S H C D ) } 2 .. 9, qw( a t j q k );
|
||||
substr $_, 52, 0, "\n"; # split deck into two parts
|
||||
my $war = '';
|
||||
my $cnt = 0;
|
||||
$cnt++ while print( /(.*)\n(.*)/ && "one: $1\ntwo: $2\n\n" ),
|
||||
s/^((.).)(.*)\n((?!\2)(.).)(.*)$/ my $win = $war; $war = ''; # capture
|
||||
$rank{$2} > $rank{$5} ? "$3$1$4$win\n$6" : "$3\n$6$4$1$win" /e
|
||||
||
|
||||
s/^(.{4})(.*)\n(.{4})(.*)$/ print "WAR!!!\n\n"; $war .= "$1$3";
|
||||
"$2\n$4" /e; # tie means war
|
||||
print "player '", /^.{10}/ ? 'one' : 'two', "' wins in $cnt moves\n";
|
||||
59
Task/War-card-game/Phix/war-card-game.phix
Normal file
59
Task/War-card-game/Phix/war-card-game.phix
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #004080;">sequence</span> <span style="color: #000000;">deck</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">52</span><span style="color: #0000FF;">)),</span>
|
||||
<span style="color: #000000;">hand1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">26</span><span style="color: #0000FF;">],</span>
|
||||
<span style="color: #000000;">hand2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">deck</span><span style="color: #0000FF;">[</span><span style="color: #000000;">27</span><span style="color: #0000FF;">..</span><span style="color: #000000;">52</span><span style="color: #0000FF;">],</span>
|
||||
<span style="color: #000000;">pending</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">pop1</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hand1</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">hand1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">hand1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]}</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">pop2</span><span style="color: #0000FF;">()</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span>
|
||||
<span style="color: #0000FF;">{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hand2</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">hand2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #000000;">hand2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]}</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">r</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
|
||||
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">c</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">13</span><span style="color: #0000FF;">)+</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s "</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"23456789TJQKA"</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">]&</span><span style="color: #008000;">"SHDC"</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">]})</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">r</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hand1</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hand2</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Game ends as a tie.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">exit</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player 2 wins the game.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">exit</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hand2</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player 1 wins the game.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">exit</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">c1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pop1</span><span style="color: #0000FF;">(),</span>
|
||||
<span style="color: #000000;">c2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pop2</span><span style="color: #0000FF;">(),</span>
|
||||
<span style="color: #000000;">r1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">r2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">r1</span><span style="color: #0000FF;">></span><span style="color: #000000;">r2</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player 1 takes the cards.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">hand1</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">&</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">&</span><span style="color: #000000;">pending</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">pending</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #008080;">elsif</span> <span style="color: #000000;">r1</span><span style="color: #0000FF;"><</span><span style="color: #000000;">r2</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Player 2 takes the cards.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">hand2</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">&</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">&</span><span style="color: #000000;">pending</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #000000;">pending</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
|
||||
<span style="color: #008080;">else</span> <span style="color: #000080;font-style:italic;">-- r1==r2</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Tie!\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hand1</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">hand2</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #000000;">pending</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">&</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">&</span><span style="color: #000000;">pop1</span><span style="color: #0000FF;">()&</span><span style="color: #000000;">pop2</span><span style="color: #0000FF;">())</span>
|
||||
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"?? ?? Cards are face down.\n"</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
|
||||
<!--
|
||||
65
Task/War-card-game/Python/war-card-game.py
Normal file
65
Task/War-card-game/Python/war-card-game.py
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
""" https://bicyclecards.com/how-to-play/war/ """
|
||||
|
||||
from numpy.random import shuffle
|
||||
|
||||
SUITS = ['♣', '♦', '♥', '♠']
|
||||
FACES = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
|
||||
DECK = [f + s for f in FACES for s in SUITS]
|
||||
CARD_TO_RANK = dict((DECK[i], (i + 3) // 4) for i in range(len(DECK)))
|
||||
|
||||
|
||||
class WarCardGame:
|
||||
""" card game War """
|
||||
def __init__(self):
|
||||
deck = DECK.copy()
|
||||
shuffle(deck)
|
||||
self.deck1, self.deck2 = deck[:26], deck[26:]
|
||||
self.pending = []
|
||||
|
||||
def turn(self):
|
||||
""" one turn, may recurse on tie """
|
||||
if len(self.deck1) == 0 or len(self.deck2) == 0:
|
||||
return self.gameover()
|
||||
|
||||
card1, card2 = self.deck1.pop(0), self.deck2.pop(0)
|
||||
rank1, rank2 = CARD_TO_RANK[card1], CARD_TO_RANK[card2]
|
||||
print("{:10}{:10}".format(card1, card2), end='')
|
||||
if rank1 > rank2:
|
||||
print('Player 1 takes the cards.')
|
||||
self.deck1.extend([card1, card2])
|
||||
self.deck1.extend(self.pending)
|
||||
self.pending = []
|
||||
elif rank1 < rank2:
|
||||
print('Player 2 takes the cards.')
|
||||
self.deck2.extend([card2, card1])
|
||||
self.deck2.extend(self.pending)
|
||||
self.pending = []
|
||||
else: # rank1 == rank2
|
||||
print('Tie!')
|
||||
if len(self.deck1) == 0 or len(self.deck2) == 0:
|
||||
return self.gameover()
|
||||
|
||||
card3, card4 = self.deck1.pop(0), self.deck2.pop(0)
|
||||
self.pending.extend([card1, card2, card3, card4])
|
||||
print("{:10}{:10}".format("?", "?"), 'Cards are face down.', sep='')
|
||||
return self.turn()
|
||||
|
||||
return True
|
||||
|
||||
def gameover(self):
|
||||
""" game over who won message """
|
||||
if len(self.deck2) == 0:
|
||||
if len(self.deck1) == 0:
|
||||
print('\nGame ends as a tie.')
|
||||
else:
|
||||
print('\nPlayer 1 wins the game.')
|
||||
else:
|
||||
print('\nPlayer 2 wins the game.')
|
||||
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
WG = WarCardGame()
|
||||
while WG.turn():
|
||||
continue
|
||||
39
Task/War-card-game/Racket/war-card-game.rkt
Normal file
39
Task/War-card-game/Racket/war-card-game.rkt
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
#lang racket
|
||||
|
||||
(define current-battle-length (make-parameter 3))
|
||||
|
||||
(define cards (string->list (string-append "🂢🂣🂤🂥🂦🂧🂨🂩🂪🂫🂭🂮🂡" "🂲🂳🂴🂵🂶🂷🂸🂹🂺🂻🂽🂾🂱"
|
||||
"🃂🃃🃄🃅🃆🃇🃈🃉🃊🃋🃍🃎🃁" "🃒🃓🃔🃕🃖🃗🃘🃙🃚🃛🃝🃞🃑")))
|
||||
|
||||
(define face (curry hash-ref (for/hash ((c cards) (i (in-naturals))) (values c (+ 2 (modulo i 13))))))
|
||||
|
||||
(define (print-draw-result turn-number d1 c1 d2 c2 → (pending null))
|
||||
(printf "#~a\t~a ~a ~a\t~a|~a|~a~%" turn-number c1 → c2 (length d1) (length pending)(length d2)))
|
||||
|
||||
(define (turn d1 d2 (n 1) (pending null) (battle 0))
|
||||
(match* (d1 d2)
|
||||
[('() '()) "Game ends in a tie!"]
|
||||
[(_ '()) "Player 1 wins."]
|
||||
[('() _) "Player 2 wins."]
|
||||
[((list c3 d1- ...) (list c4 d2- ...))
|
||||
#:when (positive? battle)
|
||||
(define pending+ (list* c3 c4 pending))
|
||||
(print-draw-result n d1- "🂠" d2- "🂠" "?" pending+)
|
||||
(turn d1- d2- (add1 n) pending+ (sub1 battle))]
|
||||
[((list (and c1 (app face r)) d1- ...) (list (and c2 (app face r)) d2- ...))
|
||||
(define pending+ (list* c1 c2 pending))
|
||||
(print-draw-result n d1- c1 d2- c2 #\= pending+)
|
||||
(turn d1- d2- (add1 n) pending+ (current-battle-length))]
|
||||
[((list (and c1 (app face r1)) d1- ...) (list (and c2 (app face r2)) d2- ...))
|
||||
(define spoils (shuffle (list* c1 c2 pending)))
|
||||
(define p1-win? (> r1 r2))
|
||||
(define d1+ (if p1-win? (append d1- spoils) d1-))
|
||||
(define d2+ (if p1-win? d2- (append d2- spoils)))
|
||||
(print-draw-result n d1+ c1 d2+ c2 (if p1-win? "←" "→"))
|
||||
(turn d1+ d2+ (add1 n))]))
|
||||
|
||||
(define (war-card-game)
|
||||
(call-with-values (λ () (split-at (shuffle cards) (quotient (length cards) 2)))
|
||||
turn))
|
||||
|
||||
(displayln (war-card-game))
|
||||
114
Task/War-card-game/Raku/war-card-game.raku
Normal file
114
Task/War-card-game/Raku/war-card-game.raku
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
unit sub MAIN (:$war where 2..4 = 4, :$sleep = .1);
|
||||
|
||||
my %c = ( # convenience hash of ANSI colors
|
||||
red => "\e[38;2;255;10;0m",
|
||||
blue => "\e[38;2;05;10;200m",
|
||||
black => "\e[38;2;0;0;0m"
|
||||
);
|
||||
|
||||
my @cards = flat (flat
|
||||
<🂢 🂣 🂤 🂥 🂦 🂧 🂨 🂩 🂪 🂫 🂭 🂮 🂡
|
||||
🃒 🃓 🃔 🃕 🃖 🃗 🃘 🃙 🃚 🃛 🃝 🃞 🃑>.map({ "{%c<black>}$_" }),
|
||||
<🂲 🂳 🂴 🂵 🂶 🂷 🂸 🂹 🂺 🂻 🂽 🂾 🂱
|
||||
🃂 🃃 🃄 🃅 🃆 🃇 🃈 🃉 🃊 🃋 🃍 🃎 🃁>.map({ "{%c<red>}$_" })
|
||||
).batch(13).map({ .flat Z 2..14 })».map: { .[1] but .[0] };
|
||||
|
||||
my $back = "{%c<blue>}🂠";
|
||||
my @won = <👈 👉>;
|
||||
|
||||
sub shuffle (@cards) { @cards.pick: * }
|
||||
sub deal (@cards) { [@cards[0,*+2 … *], @cards[1,*+2 … *]] }
|
||||
|
||||
my ($rows, $cols) = qx/stty size/.words».Int; # get the terminal size
|
||||
note "Terminal is only $cols characters wide, needs to be at least 80, 120 or more recommended."
|
||||
and exit if $cols < 80;
|
||||
|
||||
sub clean-up {
|
||||
reset-scroll-region;
|
||||
show-cursor;
|
||||
print-at $rows, 1, '';
|
||||
print "\e[0m";
|
||||
exit(0)
|
||||
}
|
||||
|
||||
signal(SIGINT).tap: { clean-up() }
|
||||
|
||||
my @index = ($cols div 2 - 5, $cols div 2 + 4);
|
||||
my @player = (deal shuffle @cards)».Array;
|
||||
my $lose = False;
|
||||
|
||||
sub take (@player, Int $cards) {
|
||||
if +@player >= $cards {
|
||||
return @player.splice(0, $cards);
|
||||
}
|
||||
else {
|
||||
$lose = True;
|
||||
return @player.splice(0, +@player);
|
||||
}
|
||||
}
|
||||
|
||||
use Terminal::ANSI;
|
||||
|
||||
clear-screen;
|
||||
hide-cursor;
|
||||
# Set background color
|
||||
print "\e[H\e[J\e[48;2;245;245;245m", ' ' xx $rows * $cols + 1;
|
||||
|
||||
# Add header
|
||||
print-at 1, $cols div 2 - 1, "{%c<red>}WAR!";
|
||||
print-at 2, 1, '━' x $cols;
|
||||
|
||||
my $row = 3;
|
||||
my $height = $rows - $row - 2;
|
||||
set-scroll-region($row, $height);
|
||||
|
||||
# footer
|
||||
print-at $height + 1, 1, '━' x $cols;
|
||||
|
||||
my $round = 0;
|
||||
my @round;
|
||||
|
||||
loop {
|
||||
@round = [@player[0].&take(1)], [@player[1].&take(1)] unless +@round;
|
||||
print-at $row, $cols div 2, "{%c<red>}┃";
|
||||
print-at $row, @index[0], @round[0;0] // ' ';
|
||||
print-at $row, @index[1], @round[1;0] // ' ';
|
||||
if $lose {
|
||||
if @player[0] < @player[1] {
|
||||
print-at $row, $cols div 2 + 1, @won[1] unless +@round[1] == 1;
|
||||
print-at $height + 3, $cols div 2 - 10, "{%c<red>} Player 1 is out of cards "
|
||||
} else {
|
||||
print-at $row, $cols div 2 - 2, @won[0] unless +@round[0] == 1;
|
||||
print-at $height + 3, $cols div 2 - 10, "{%c<red>} Player 2 is out of cards "
|
||||
}
|
||||
|
||||
}
|
||||
if (@round[0].tail // 0) > (@round[1].tail // 0) {
|
||||
print-at $row, $cols div 2 - 2, @won[0];
|
||||
@player[0].append: flat (|@round[0],|@round[1]).pick: *;
|
||||
@round = ();
|
||||
}
|
||||
elsif (@round[0].tail // 0) < (@round[1].tail // 0) {
|
||||
print-at $row, $cols div 2 + 1, @won[1];
|
||||
@player[1].append: flat (|@round[0],|@round[1]).pick: *;
|
||||
@round = ();
|
||||
}
|
||||
else {
|
||||
@round[0].append: @player[0].&take($war);
|
||||
@round[1].append: @player[1].&take($war);
|
||||
print-at $row, @index[0] - $_ * 2, ($_ %% $war) ?? @round[0; $_] !! $back for ^@round[0];
|
||||
print-at $row, @index[1] + $_ * 2, ($_ %% $war) ?? @round[1; $_] !! $back for ^@round[1];
|
||||
next
|
||||
}
|
||||
last if $lose;
|
||||
print-at $height + 2, $cols div 2 - 4, "{%c<blue>} Round {++$round} ";
|
||||
print-at $height + 2, $cols div 2 - 40, "{%c<blue>} Player 1: {+@player[0]} cards ";
|
||||
print-at $height + 2, $cols div 2 + 21, "{%c<blue>} Player 2: {+@player[1]} cards ";
|
||||
sleep $sleep if +$sleep;
|
||||
if $row >= $height { scroll-up } else { ++$row }
|
||||
}
|
||||
|
||||
# game over
|
||||
print-at $height + 2, $cols div 2 - 40, "{%c<blue>} Player 1: {+@player[0] ?? '52' !! "{%c<red>}0"}{%c<blue>} cards ";
|
||||
print-at $height + 2, $cols div 2 + 20, "{%c<blue>} Player 2: {+@player[1] ?? '52' !! "{%c<red>}0"}{%c<blue>} cards ";
|
||||
clean-up;
|
||||
76
Task/War-card-game/Wren/war-card-game.wren
Normal file
76
Task/War-card-game/Wren/war-card-game.wren
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import "random" for Random
|
||||
import "/queue" for Deque
|
||||
|
||||
var rand = Random.new()
|
||||
var suits = ["♣", "♦", "♥", "♠"]
|
||||
var faces = ["2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A" ]
|
||||
var cards = List.filled(52, null)
|
||||
for (i in 0..51) cards[i] = "%(faces[i%13])%(suits[(i/13).floor])"
|
||||
var ranks = List.filled(52, 0)
|
||||
for (i in 0..51) ranks[i] = i % 13
|
||||
|
||||
var war = Fn.new {
|
||||
var deck = List.filled(52, 0)
|
||||
for (i in 0..51) deck[i] = i
|
||||
rand.shuffle(deck)
|
||||
var hand1 = Deque.new()
|
||||
var hand2 = Deque.new()
|
||||
for (i in 0..25) {
|
||||
hand1.pushFront(deck[2*i])
|
||||
hand2.pushFront(deck[2*i+1])
|
||||
}
|
||||
while (hand1.count > 0 && hand2.count > 0) {
|
||||
var card1 = hand1.popFront()
|
||||
var card2 = hand2.popFront()
|
||||
var played1 = [card1]
|
||||
var played2 = [card2]
|
||||
var numPlayed = 2
|
||||
while (true) {
|
||||
System.write("%(cards[card1])\t%(cards[card2])\t")
|
||||
if (ranks[card1] > ranks[card2]) {
|
||||
hand1.pushAllBack(played1)
|
||||
hand1.pushAllBack(played2)
|
||||
System.print("Player 1 takes the %(numPlayed) cards. Now has %(hand1.count).")
|
||||
break
|
||||
} else if (ranks[card1] < ranks[card2]) {
|
||||
hand2.pushAllBack(played2)
|
||||
hand2.pushAllBack(played1)
|
||||
System.print("Player 2 takes the %(numPlayed) cards. Now has %(hand2.count).")
|
||||
break
|
||||
} else {
|
||||
System.print("War!")
|
||||
if (hand1.count < 2) {
|
||||
System.print("Player 1 has insufficient cards left.")
|
||||
hand2.pushAllBack(played2)
|
||||
hand2.pushAllBack(played1)
|
||||
hand2.pushAllBack(hand1)
|
||||
hand1.clear()
|
||||
break
|
||||
}
|
||||
if (hand2.count < 2) {
|
||||
System.print("Player 2 has insufficient cards left.")
|
||||
hand1.pushAllBack(played1)
|
||||
hand1.pushAllBack(played2)
|
||||
hand1.pushAllBack(hand2)
|
||||
hand2.clear()
|
||||
break
|
||||
}
|
||||
played1.add(hand1.popFront()) // face down card
|
||||
card1 = hand1.popFront() // face up card
|
||||
played1.add(card1)
|
||||
played2.add(hand2.popFront()) // face down card
|
||||
card2 = hand2.popFront() // face up card
|
||||
played2.add(card2)
|
||||
numPlayed = numPlayed + 4
|
||||
System.print("? \t? \tFace down cards.")
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hand1.count == 52) {
|
||||
System.print("Player 1 wins the game!")
|
||||
} else {
|
||||
System.print("Player 2 wins the game!")
|
||||
}
|
||||
}
|
||||
|
||||
war.call()
|
||||
67
Task/War-card-game/XPL0/war-card-game.xpl0
Normal file
67
Task/War-card-game/XPL0/war-card-game.xpl0
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
char Deck(52), \initial card deck (low 2 bits = suit)
|
||||
Stack(2, 52); \each player's stack of cards (52 maximum)
|
||||
int Inx(2), \index to last card (+1) for each stack
|
||||
Top, \index to compared cards, = stack top if not war
|
||||
Card, N, I, J, P, T;
|
||||
char Suit, Rank;
|
||||
|
||||
proc MoveCard(To, From); \Move top card From Stack to bottom of To Stack
|
||||
int To, From;
|
||||
int Card, I;
|
||||
[Card:= Stack(From, 0); \take top Card from From Stack
|
||||
for I:= 0 to Inx(From)-2 do \shift remaining cards over
|
||||
Stack(From, I):= Stack(From, I+1);
|
||||
if Inx(From) > 0 then \remove From card from its Stack
|
||||
Inx(From):= Inx(From)-1;
|
||||
Stack(To, Inx(To)):= Card; \add Card to bottom of To Stack
|
||||
if Inx(To) < 52 then \remove From card from its Stack
|
||||
Inx(To):= Inx(To)+1;
|
||||
];
|
||||
|
||||
[\\Suit:= "^C^D^E^F "; \IBM OEM card symbols aren't displayable on RC
|
||||
Suit:= "HDCS ";
|
||||
Rank:= "23456789TJQKA "; \T = 10
|
||||
for Card:= 0 to 52-1 do \make a complete deck of cards
|
||||
Deck(Card):= Card;
|
||||
for N:= 0 to 10_000 do \shuffle the deck by swapping random locations
|
||||
[I:= Ran(52); J:= Ran(52);
|
||||
T:= Deck(I); Deck(I):= Deck(J); Deck(J):= T;
|
||||
];
|
||||
for N:= 0 to 52-1 do \deal deck into two stacks
|
||||
[Card:= Deck(N);
|
||||
I:= N/2;
|
||||
P:= rem(0);
|
||||
Stack(P, I):= Card;
|
||||
];
|
||||
Inx(0):= 52/2; Inx(1):= 52/2; \set indexes to last card +1
|
||||
|
||||
loop [for P:= 0 to 1 do \show both stacks of cards
|
||||
[for I:= 0 to Inx(P)-1 do
|
||||
[Card:= Stack(P, I); ChOut(0, Rank(Card>>2))];
|
||||
CrLf(0);
|
||||
for I:= 0 to Inx(P)-1 do
|
||||
[Card:= Stack(P, I); ChOut(0, Suit(Card&3))];
|
||||
CrLf(0);
|
||||
];
|
||||
if Inx(0)=0 or Inx(1)=0 then quit; \game over
|
||||
|
||||
Top:= 0; \compare card ranks (above 2-bit suits)
|
||||
loop [if Stack(0, Top)>>2 = Stack(1, Top)>>2 then
|
||||
[Text(0, "War!"); CrLf(0);
|
||||
Top:= Top+2; \play a card down and a card up
|
||||
]
|
||||
else if Stack(0, Top)>>2 > Stack(1, Top)>>2 then
|
||||
[for I:= 0 to Top do \move cards to Stack 0
|
||||
[MoveCard(0, 0); MoveCard(0, 1)];
|
||||
quit;
|
||||
]
|
||||
else [for I:= 0 to Top do \move cards to Stack 1
|
||||
[MoveCard(1, 1); MoveCard(1, 0)];
|
||||
quit;
|
||||
];
|
||||
];
|
||||
T:= ChIn(1); \wait for keystroke (no key echo)
|
||||
CrLf(0);
|
||||
];
|
||||
]
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue