Skip to content

Commit

Permalink
Add Classic packs (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
aelmekeev authored Mar 5, 2024
1 parent e5782ea commit 5fa0fb8
Show file tree
Hide file tree
Showing 13 changed files with 343 additions and 40 deletions.
11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ The classic decks are a bit more tricky as stats values may vary significantly -

What if each player selects a stat at random during their turn? The playtime still averages `26-30 minutes`.

So, maybe the 3-10 minutes is just how much patience the average adult has to play the game with their children?

## Test conditions

* Games emulated - `10,000`
Expand All @@ -41,3 +39,12 @@ It appears that all the decks have unique cards in terms of stats, even the ones

Some decks contain cards that are identical in terms of stats, for example:
* McDonald's Minions: Rise of Gru - `Jean-Clawed` and `Svengeance`

### Unusual stats

* [Seattle 30 Top Things to See](https://ultimate-top-trumps.co.uk/usa/winning_moves/winning_moves/seattle_30_things_to_see.html) has some stats with `n/a`

## Resources

* [Ultimate Top Trumps](https://ultimate-top-trumps.co.uk/) - great online collection of Top Trump packs
* [APStats/Top-Trumps-data](https://github.com/APStats/Top-Trumps-data/tree/master) - some packs in CSV format
31 changes: 31 additions & 0 deletions packs/cats.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Individual;Size;Rarity;Good Temper;Cuteness;Top Trumps Mischief Rating # https://ultimate-top-trumps.co.uk/england/winning_moves/2015/cats2.html
Abyssinian;2;4;2;16;82
American Bobtail;4;6;4;23;77
American Curl;2;7;5;28;79
Balinese (aka Javanese);3;8;4;18;80
Bengal;4;1;3;16;75
Bombay;3;2;5;25;74
British Shorthair;4;1;4;26;81
Devon Rex;2;7;5;20;83
Egyptian Mau;3;7;2;24;88
Gumball;1;5;7;14;90
Japanese Bobtail;3;8;5;28;90
LOL Cats;3;1;3;29;97
Maine Coon;5;2;4;22;85
Manx;4;9;3;26;78
Norwegian Forest;5;3;5;20;89
Ocicat;3;7;4;15;74
Persian;4;2;5;26;70
Ragamuffin;5;6;4;27;84
Ragdoll;4;5;5;22;80
Russian Blue;2;8;3;18;78
Savannah;3;9;3;18;80
Scottish Fold;2;8;5;29;91
Selkirk Rex;3;6;4;25;87
Siamese;2;3;5;13;69
Siberian;4;6;3;23;81
Singapura;1;7;4;12;80
Sphynx;3;9;4;3;71
Stray Cat;3;1;5;19;99
Tiger;6;10;0;9;95
Turkish Van;4;8;2;20;83
31 changes: 31 additions & 0 deletions packs/elements.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Individual;Melting Point (degrees C);Density (kg/m cubed);Price (Pounds Sterling per 100g);Discovery Date;Size of Atom (pm) # https://ultimate-top-trumps.co.uk/england/winning_moves/2014/elements.html
Aluminium;660;2698;2.6;1825;368
Arsenic;817;5780;1100;1250;370
Boron;2077;2340;150;1808;384
Bromine;-7;3122;2.6;1826;370
Cadmium;321;8650;24;1817;436
Caesium;29;1873;3400;1860;686
Calcium;842;1550;20;1808;462
Carbon;4489;2260;1.2;-30000;340
Chlorine;-102;2.9;18;1774;350
Copper;1085;8960;4.7;-9000;392
Europium;822;5243;15000;1901;470
Fluorine;-220;1.6;99;1886;294
Gold;1064;19320;8600;-3000;428
Helium;-271;0.2;48;1895;280
Hydrogen;-259;0.1;68;1766;220
Iron;1538;7874;1.9;-2500;408
Lead;327;11350;2.6;-1000;404
Lithium;181;534;110;1817;364
Magnesium;650;1738;3.3;1755;346
Mercury;-39;13546;11;-1500;446
Neon;-249;0.8;140;1898;308
Nitrogen;-210;1.1;13;1772;310
Osmium;3033;22590;16000;1803;432
Oxygen;-219;1.3;7.6;1774;304
Phosphorus;579;2200;5.3;1669;360
Potassium;64;862;190;1807;550
Silicon;1414;2329;16;1824;420
Silver;962;10500;310;-3000;422
Sodium;98;971;7;1807;454
Sulfur;115;2070;1.3;-2000;360
33 changes: 33 additions & 0 deletions packs/famous-art-robberies.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Individual;Completed;Stolen;Longest side (cm);Est. value (million $);Popularity # https://ultimate-top-trumps.co.uk/england/miscellaneous/famous_art_robberies.html
A Cavalier (Self-Portrait);1659;2007;20;1.5;2
Bords de la Seine a Bougival;1871;1987;40;3.5;3
Chez Tortoni;1880;1990;33.7;32;3
Christ in the Storm on the Sea of Galilee;1633;1990;160;70;5
Congregation Leaving the Reformed Church in Nuenen;1884;2002;41.3;16.5;5
Count Lepic and his Daughters;1870;2008;81;12;4
Duke of Wellington;1814;1961;64.3;68;4
Impression Soleil Levant;1872;1985;63;15;4
Jacob de Gheyn lll;1632;1966;29.9;18;5
Kitchen Maid with the Supper at Emmaus;1618;1974;118;18;3
Landscape with an Obelisk;1638;1990;71;25;2
Le Chemin de Sevres. View de Paris.;1865;1998;49;2;2
Madonna with the Yarnwinder (one of two copies);1510;2003;48.3;65;5
Mona Lisa (La Gioconda);1506;1911;77;760;5
Nativity with St Francis and St Lawrence;1609;1969;268;30;4
Poppy Flowers (Vase and Flowers);1887;2010;65;55;5
Portrait of Dona Antonia Zarate;1806;1986;103.5;86;4
Portrait of Lady Georgiana Cavendish;1787;1876;127;1.5;1
Self-Portrait;1630;2000;15;12;5
Shade and Darkness;1843;1994;78.7;18;4
The Boy in the Red Vest;1890;2008;80;92;5
The Concert;1664;1990;72.5;200;4
The Gardener (Young Peasant);1889;1998;61;42;5
The Just Judges (Ghent Altarpiece);1427;1934;145;227;2
The Love Letter;1846;1989;24;2;3
The Poor Poet (one of four versions);1839;1989;44.7;1.5;3
The Three Graces;1635;1966;220.5;80;4
The White Duck;1753;1992;95.3;8;3
View of the Sea at Scheveningen;1882;2002;51;15;5
Waft of Mist;1820;1994;42.5;23.5;4
Woman Writing a Letter, with her Maid;1671;1986;72.2;160;4
Young Girl at a Window;1645;1966;81.8;38;5
30 changes: 30 additions & 0 deletions packs/harry-potter-and-the-deathly-hallows-part-2.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Individual;Magic;Cunning;Courage;Wisdom;Temper # https://ultimate-top-trumps.co.uk/england/winning_moves/2011/hp_deathly_hallows_pt_2.html
Aberforth Dumbledore;40;32;45;50;10
Alecto Carrow;60;30;20;44;18
Amycus Carrow;59;31;20;44;19
Argus Filch;0;17;10;40;10
Bellatrix Lestrange;112;36;4;55;25
Cho Chang;50;12;55;40;3
Dean Thomas;45;20;50;26;6
Draco Malfoy;60;35;30;28;21
Feurir Greyback;65;30;9;40;18
Ginny Weasley;50;22;65;45;11
Gregory Goyle;18;20;7;1;16
Griphook;40;30;30;40;10
Harry Potter;95;40;80;100;8
Hermione Granger;88;32;70;100;5
James Potter;75;14;43;40;8
Lord Voldemort;120;42;0;60;25
Luna Lovegood;50;18;65;48;2
Minerva McGonagall;107;36;45;85;20
Mr Ollivander;65;20;40;72;3
Nagini;0;40;1;10;25
Narcissa Malfoy;65;28;10;29;8
Neville Longbottom;68;36;75;48;9
Nigel;45;16;30;35;9
Percy Weasley;65;15;40;42;10
Ron Weasley;80;25;70;60;10
Rubeus Hagrid;12;13;45;15;12
Seamus Finnegan;45;20;50;21;3
Severus Snape;120;45;80;76;9
Sybill Trelawney;50;11;40;45;3
File renamed without changes.
File renamed without changes.
31 changes: 31 additions & 0 deletions packs/star-wars-rise-of-the-bounty-hunters.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Individual;Honor;Wisdom;Deception;Fighting Skill;Jedi Power # https://ultimate-top-trumps.co.uk/england/winning_moves/2010/star_wars_rise.html
Aayla Secura;8;20;20;91;4
Ahsoka Tano;8;17;24;89;3
Anakin Skywalker;7;18;21;96;4
Arf Trooper;7;20;39;79;0
Aurra Sing;2;20;48;87;0
Barriss Offee;9;16;19;82;3
Bora Fett;7;14;38;50;0
Bossk;3;17;47;90;0
Cad Bane;2;16;50;80;2
Cammando Droid;1;17;39;79;0
Captain Rex;1;20;20;95;2
Castas;1;16;38;76;0
Cato Parasitti;0;16;44;68;1
Clone Commander Cody;8;17;20;77;1
Commander Bly;8;19;21;84;2
Commander Gree;7;20;23;76;1
Darth Sidious;0;24;50;86;5
Duchess Satine Kryze;10;25;12;30;0
Embo;8;15;24;70;1
General Grievous;4;23;40;94;2
IG-86 Sentinel Droid;5;10;20;80;0
Karina the Great;0;14;47;23;0
Ki-Adi-Mundi;9;23;16;90;4
Mace Windu;10;25;2;97;5
Mandalorian Warrior;10;17;24;90;0
Obi-Wan Kenobi;9;22;17;97;5
Pre Vizsla;5;21;49;85;1
Sugi;9;20;34;77;2
Undead Geonosian;0;0;15;80;0
Yoda;10;25;4;98;5
31 changes: 31 additions & 0 deletions packs/star-wars-starships.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Individual;Size;Speed;Fire Power;Maneuvering;Force Factor # https://ultimate-top-trumps.co.uk/england/winning_moves/2006/star_wars_starships.html
ARC-170;4;77;6;17;1
AT-AT;6;64;8;9;2
AT-ST;4;69;5;11;2
AT-TE;5;58;7;10;2
B-Wing Starfighter;5;73;6;15;1
Clone Turbo Tank;6;62;5;13;1
Death Star;10;50;12;2;4
Droid Starfighter;3;67;5;14;2
Droid Tri-Fighter;4;74;7;16;1
Imperial Shuttle;4;44;1;9;2
Jedi Starfighter;4;70;6;16;1
Landspeeder;2;52;0;8;1
Millenium Falcon;6;100;7;20;3
N-1 Starfighter;4;70;5;15;2
Podracer;2;70;0;19;1
Republic Gunship;5;58;8;13;2
Royal Starship;6;71;0;10;1
Sail Barge;6;41;3;1;1
Sandcrawler;4;40;0;1;2
Slave l;4;93;7;17;2
Snowspeeder;3;68;2;15;1
Speeder Bike;1;75;1;19;2
Star Destroyer;8;90;9;5;3
Tantive IV;6;60;4;11;2
Tie Fighter Advanced;4;77;6;17;1
Tie Fighter;4;68;2;18;3
Trade Federation Battleship;8;49;8;5;3
Wheel Bike;2;68;4;19;1
X-Wing Starfighter;5;80;6;18;3
Y-Wing Starfighter;5;4;6;15;3
33 changes: 33 additions & 0 deletions packs/the-art-game.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
Individual;Influence;Shock of the new effect;Versatility;Top auction price (million $);Critical Reception;The beautiful factor # https://ultimate-top-trumps.co.uk/england/miscellaneous/the%20art_game.html
Ai Weiwei;56;60;67;0.782;75;58
Aleksandr Rodchenko;87;96;85;0.515;69;58
Andreas Gursky;42;45;29;4.3;56;65
Andy Warhol;94;72;81;71.7;77;56
Banksy;18;55;13;1.9;33;4
Bruce Nauman;76;69;83;9.9;85;44
Christo and Jeanne-Claude;38;74;40;0.564;65;62
Cindy Sherman;54;69;65;3.9;60;59
Damien Hirst;69;78;70;19.2;52;66
David Hockney;42;35;28;7.9;56;79
Edward Hopper;28;21;20;24;62;70
Francis Bacon;76;77;31;86.3;90;25
Frida Kahlo;22;26;35;5;44;50
Gerhard Richter;83;70;75;37.1;89;71
Henri Matisse;76;69;61;44.8;77;80
Jackson Pollock;55;86;57;58.4;76;63
Jean-Michel Basquiat;54;77;31;48.8;69;40
Jeff Koons;70;74;63;33.7;71;47
Joseph Beuys;73;74;66;0.939;68;41
Louise Bourgeois;78;60;76;10.7;70;73
Lucian Freud;36;18;16;33.6;84;46
Marc Chagall;65;68;32;13;49;90
Marcel Duchamp;98;99;80;11.4;91;29
Marina Abramovic;54;86;70;0.362;83;27
Mark Rothko;50;64;25;86.9;79;91
Maurizio Cattelan;48;56;38;7.9;47;12
Pablo Picasso;88;91;82;106.5;79;40
Piet Mondrian;24;78;23;27.5;55;57
Rene Magritte;50;63;18;11.5;64;52
Robert Rauschenberg;85;70;72;14.6;83;24
Salvador Dali;61;69;47;21.6;44;63
Takashi Murakami;50;60;58;15.1;47;39
31 changes: 31 additions & 0 deletions packs/the-big-bang-theory.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Top Moment;Humor;Nerd Factor;Friendship;Intelligence;Bazinga # https://ultimate-top-trumps.co.uk/england/winning_moves/2014/the_big_bang_theory.html
Oh, It's a Tiara!;8;11;27;38;41
Sheldon Cooper Presents: Fun with Flags;7;20;11;43;70
Sheldon Cooper's Council of Ladies;9;18;26;32;97
The Allergic Reaction Gamble;7;13;30;21;55
The Artificial Shelbot Proxy Beta Test;8;19;23;46;89
The Awkward Hug Gesture;9;16;30;32;48
The Bazinga Equation;9;19;22;46;100
The Behaviour Modification Process;9;11;23;31;100
The Besties Painting Dilemma;6;14;28;21;17
The Cooper Identity Reappropriation Scheme;10;19;28;30;90
The Efficiency Machine;4;5;29;45;20
The Facial Pi Implantation;9;13;17;33;91
The Hairy Complex;9;12;25;32;88
The Infectious Ward Romantic Gesture;8;18;30;45;58
The Itchy Sweater Revenge;7;15;10;33;91
The Koothrappali Conversation Nexus;9;16;28;39;86
The Miniature Wolowitz/Koothrappali Replication;7;20;15;13;77
The Mystery Letter Conundrum;3;16;28;17;34
The Revenge Prank Implementation;9;20;15;47;100
The Satellite Nuptial Observation;8;16;30;45;64
The Shamy Kiss;6;20;11;43;89
The Soft Kitty Pacification Ritual;4;8;11;19;64
The Spontaneous Proposal Verification;7;12;27;48;44
The Thanksgiving Nuptial Revelations;8;2;24;6;89
The Three Word Admission;3;7;25;43;17
The Ultimate Geology Sacrifice;10;18;30;35;16
The Vehicular Space Altercation;9;14;20;12;100
The Virtual Osculation Device;6;18;25;44;79
The Wheaton Prevarication Ploy;7;19;12;44;78
The Wolowitz Manoeuver;5;16;22;33;84
55 changes: 41 additions & 14 deletions test_top_trumps.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import unittest
from top_trumps import *

def get_default_pack_stats():
pack_stats = PackStats(4)
pack_stats.update([1, 1, 1, 1])
pack_stats.update([100, 100, 100, 100])
return pack_stats

class TestTopTrumps(unittest.TestCase):
def test_card_get_stat(self):
card = Card([1, 2, 3])
Expand All @@ -12,10 +18,31 @@ def test_card_get_highest_stat_index(self):
card1 = Card([1, 2, 3, 4])
card2 = Card([4, 3, 2, 1])
card3 = Card([1, 2, 2, 0])
self.assertEqual(card1.get_highest_stat_index(), 3)
self.assertEqual(card2.get_highest_stat_index(), 0)
self.assertIn(card3.get_highest_stat_index(), [1, 2])
self.assertNotIn(card3.get_highest_stat_index(), [0, 3])
default_pack_stats = get_default_pack_stats()
self.assertEqual(card1.get_highest_stat_index(default_pack_stats), 3)
self.assertEqual(card2.get_highest_stat_index(default_pack_stats), 0)
self.assertIn(card3.get_highest_stat_index(default_pack_stats), [1, 2])
self.assertNotIn(card3.get_highest_stat_index(default_pack_stats), [0, 3])

def test_card_get_highest_stat_index_unbalanced(self):
card1 = Card([1, 2, 3, 4])
card2 = Card([4, 3, 2, 1])

pack_stats = PackStats(4)
pack_stats.update([1, 1, 1, 1])
pack_stats.update([100, 3, 100, 4])

self.assertEqual(card1.get_highest_stat_index(pack_stats), 3)
self.assertEqual(card2.get_highest_stat_index(pack_stats), 1)

def test_pack_stats_update(self):
pack_stats = PackStats(4)
pack_stats.update([1, 2, 3, 4])
self.assertEqual(pack_stats.min, [1, 2, 3, 4])
self.assertEqual(pack_stats.max, [1, 2, 3, 4])
pack_stats.update([5, 6, 7, 8])
self.assertEqual(pack_stats.min, [1, 2, 3, 4])
self.assertEqual(pack_stats.max, [5, 6, 7, 8])

def test_hand_next(self):
hand = Hand([Card([1, 2, 3, 4]), Card([5, 6, 7, 8])])
Expand Down Expand Up @@ -44,23 +71,23 @@ def test_compare_cards(self):
self.assertIsNone(compare_cards([card1, card2, card3], 3))

def test_deal_2(self):
deck = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16])]
hands = deal(deck, 2)
pack = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16])]
hands = deal(pack, 2)
self.assertEqual(len(hands), 2)
self.assertEqual(len(hands[0].cards), 2)
self.assertEqual(len(hands[1].cards), 2)

def test_deal_3(self):
deck = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16]), Card([17, 18, 19, 20]), Card([21, 22, 23, 24])]
hands = deal(deck, 3)
pack = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16]), Card([17, 18, 19, 20]), Card([21, 22, 23, 24])]
hands = deal(pack, 3)
self.assertEqual(len(hands), 3)
self.assertEqual(len(hands[0].cards), 2)
self.assertEqual(len(hands[1].cards), 2)
self.assertEqual(len(hands[2].cards), 2)

def test_deal_uneven(self):
deck = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16]), Card([17, 18, 19, 20])]
hands = deal(deck, 2)
pack = [Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([9, 10, 11, 12]), Card([13, 14, 15, 16]), Card([17, 18, 19, 20])]
hands = deal(pack, 2)
self.assertEqual(len(hands), 2)
self.assertEqual(len(hands[0].cards), 2)
self.assertEqual(len(hands[1].cards), 2)
Expand All @@ -78,7 +105,7 @@ def test_play_game_2(self):
# >2 2
# 1 >3
# 0 4
self.assertEqual(play_game([hand1, hand2], MAX_EXCHANGES, 'get_highest_stat_index'), 2)
self.assertEqual(play_game(get_default_pack_stats(), [hand1, hand2], MAX_EXCHANGES, 'get_highest_stat_index'), 2)

def test_play_game_3(self):
hand1 = Hand([Card([1, 2, 3, 4]), Card([5, 6, 7, 8])])
Expand All @@ -87,17 +114,17 @@ def test_play_game_3(self):
# >2 2 2
# 1 >1 3
# 0 0 4
self.assertEqual(play_game([hand1, hand2, hand3], MAX_EXCHANGES, 'get_highest_stat_index'), 2)
self.assertEqual(play_game(get_default_pack_stats(), [hand1, hand2, hand3], MAX_EXCHANGES, 'get_highest_stat_index'), 2)

def test_play_game_endless(self):
hand1 = Hand([Card([1, 2, 3, 4]), Card([13, 14, 15, 16])])
hand2 = Hand([Card([9, 10, 11, 12]), Card([5, 6, 7, 8])])
self.assertEqual(play_game([hand1, hand2], 5, 'get_highest_stat_index'), 5)
self.assertEqual(play_game(get_default_pack_stats(), [hand1, hand2], 5, 'get_highest_stat_index'), 5)

def test_play_game_bank(self):
hand1 = Hand([Card([1, 2, 3, 4]), Card([13, 14, 15, 16]), Card([13, 14, 15, 16])])
hand2 = Hand([Card([1, 2, 3, 4]), Card([5, 6, 7, 8]), Card([5, 6, 7, 8])])
self.assertEqual(play_game([hand1, hand2], MAX_EXCHANGES, 'get_highest_stat_index'), 3)
self.assertEqual(play_game(get_default_pack_stats(), [hand1, hand2], MAX_EXCHANGES, 'get_highest_stat_index'), 3)

if __name__ == '__main__':
unittest.main()
Loading

0 comments on commit 5fa0fb8

Please sign in to comment.