Last active
December 14, 2015 12:48
-
-
Save 404d/5088526 to your computer and use it in GitHub Desktop.
A Python script playing the cardgame "War"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- encoding: utf-8 -*- | |
# ^ Give me invincibility, give me hope, | |
# give me the ability to use my fucking Å | |
from random import shuffle, randrange | |
import re | |
import sys | |
import os | |
""" | |
Krig, det gode, gamle kortspillet. Nå i slangeform! | |
""" | |
# Globale variabler for spillerobjekter | |
spiller1 = None | |
spiller2 = None | |
isWindows = None | |
clearWindow = True # Tømmer vinduet etter hver runde | |
class Spiller(): | |
""" | |
Objekt som holder spillerens kortstokk og kan ta seg av navn av kort etc. | |
""" | |
def __init__(self, kortstokk, navn = "En Spiller"): | |
""" | |
Setter spillerens kortstokk til de angitte kortene | |
""" | |
self.kortstokk = kortstokk | |
self.navn = navn | |
def nyttKort(self): | |
""" | |
Henter kort fra kortstokken | |
""" | |
if not self.kortstokk: # Sjekk at kortstokken ikke er tom | |
return None | |
kort = self.kortstokk.pop(0) # Hent nytt kort fra kortstokken | |
# Returnerer kortet som en "tuple", du bruker det med: | |
# (kortNr, kortNavn, kortType) = Spiller.nyttKort() | |
# Hvilket lager tallet kortNr og teksten kortNavn | |
return self.faaKortnavn(kort) | |
def giKort(self, kort): | |
""" | |
Legger et kort i kortstokken til en spiller | |
""" | |
# Sjekk at det er et gyldig kort | |
match = re.match("[hkrs][0-9][0-3]?", kort) | |
if match: | |
# Kortet er gyldig, legg det til i stokken | |
self.kortstokk.append(kort) | |
else: | |
raise Exception("Fikk ugyldig kort '%s'" % kort) | |
def faaKortnavn(self, kort): | |
kortNavn = "ukjent" # Placeholder, fordi hvem liker None? | |
# Gjør om teksten "r13" til ( "r13", "r", "13" ) | |
match = re.match("([hkrs])([0-9]([0-3])?)", kort) | |
# Se til at vi fikk tak i noen resultater | |
if not match: | |
return "shuffle" | |
kortType = match.group(1) | |
kortNr = int( match.group(2) ) | |
# Finn ut navnen på korttypen | |
if kortType == "h": | |
kortTypeNavn = "hjerter" | |
elif kortType == "k": | |
kortTypeNavn = u"kløver" | |
elif kortType == "r": | |
kortTypeNavn = "ruter" | |
elif kortType == "s": | |
kortTypeNavn = "spar" | |
# Er kortet en konge, et ess eller noe? | |
if kortNr in [1,11,12,13]: | |
if kortNr == 1: | |
kortNavn = "ess" | |
elif kortNr == 11: | |
kortNavn = "knekt" | |
elif kortNr == 12: | |
kortNavn = "dronning" | |
elif kortNr == 13: | |
kortNavn = "konge" | |
else: | |
# Nope, la oss bruke tall i stedet | |
kortNavn = kortNr | |
# Sett sammen kortnavnet og korttypen til "ruter 13" | |
kortNavn = u"%s %s" % ( kortTypeNavn, kortNavn ) | |
# Send tilbake kortnummeret, kortnavnet som ble lagd og korttypen | |
return ( kortNr, kortNavn, kortType ) | |
def checkForShuffleMarker(spiller, kort): | |
if kort == "shuffle" or kort[0] <= 0: | |
print "Stokker %ss kort..." % spiller.navn | |
# Stokk | |
shuffle(spiller.kortstokk) | |
# Legg til shuffle marker | |
spiller.kortstokk.append("shuffle") | |
# Trekk et nytt kort | |
kort = spiller.nyttKort() | |
return kort | |
def gameLoop(): | |
""" | |
Her er selve spillkoden, som trekker kort, sammenligner og skriver til skjermen. | |
Dette er et mindfuck av en stor klynge med if-blokker | |
""" | |
# La oss ha en enkel måte å lukke programmet på uten krasj | |
running = True | |
while running: | |
# Tøm vindu om dette er på | |
if clearWindow: | |
if isWindows: | |
os.system("cls") | |
else: | |
os.system("clear") | |
# Skill bitene fra hverandre. Tekstvegger er vanskelige å lese | |
print " * * * " | |
# Trekk kort for begge spillere | |
kort1 = spiller1.nyttKort() | |
kort2 = spiller2.nyttKort() | |
# Se til at det ikke er på tide å stokke kortene til Spiller 1 | |
kort1 = checkForShuffleMarker(spiller1, kort1) | |
# Se til at det ikke er på tide å stokke kortene til CPU | |
kort2 = checkForShuffleMarker(spiller2, kort2) | |
# La oss gå igjennom utfallene | |
# (Denne blokken kan bli en ny funksjon) | |
if kort1[0] == kort2[0]: | |
print "Det ble uavgjort!\nSpiller 1 trakk %s, og CPU trakk %s.\nBegge spillere legger kortene tilbake i bunken." % (kort1[1], kort2[1]) | |
# Ingen vinner! Spillerne får kortene tilbake | |
spiller1.giKort("%s%s" % ( kort1[2], kort1[0] ) ) | |
spiller2.giKort("%s%s" % ( kort2[2], kort2[0] ) ) | |
elif kort1[0] > kort2[0]: | |
print "Spiller 1 vant!\nSpiller 1 trakk %s, og CPU trakk %s.\nSpiller 1 legger kortene i bunken sin." % (kort1[1], kort2[1]) | |
# Spiller 1 vant! Vedkomne har krav på kortene | |
spiller1.giKort("%s%s" % ( kort1[2], kort1[0] ) ) | |
spiller1.giKort("%s%s" % ( kort2[2], kort2[0] ) ) | |
elif kort1[0] < kort2[0]: | |
print "CPU vant!\nSpiller 1 trakk %s, og CPU trakk %s.\nCPU legger kortene i bunken sin." % (kort1[1], kort2[1]) | |
# CPU vant! Gi kortene til den metallbrikka | |
spiller2.giKort("%s%s" % ( kort1[2], kort1[0] ) ) | |
spiller2.giKort("%s%s" % ( kort2[2], kort2[0] ) ) | |
# Disse If-blokkene kan se skumle ut, men de er egentlig ikke det | |
# (Denne blokken kan bli en ny funksjon) | |
if len(spiller1.kortstokk)-1 <= 0 and len(spiller2.kortstokk)-1 > 0: | |
# CPU vant. Buuuuu! | |
print u"Du tapte! CPU har alle %i kortene!\nOm du vil spille igjen, start spillet på nytt." % ( len(spiller2.kortstokk)-1 ) | |
running = False # Lukk spillet | |
elif len(spiller1.kortstokk)-1 > 0 and len(spiller2.kortstokk)-1 <= 0: | |
# Spilleren vant! Yay! | |
print u"Med alle %i kortene vant du over CPU, gratulerer!\nOm du vil spille igjen, start spillet på nytt." % ( len(spiller2.kortstokk)-1 ) | |
running = False # Lukk spillet | |
elif len(spiller1.kortstokk)-1 > 0 and len(spiller2.kortstokk)-1 > 0: | |
# Spør brukeren om den vil fortsette | |
print u"Du har nå %i kort i stokken din, og CPU har %i kort. Trykk [Enter] for å fortsette, eller [Q] [Enter] for å avslutte." % ( len(spiller1.kortstokk)-1, len(spiller2.kortstokk)-1 ) | |
# Sett vindustittel | |
if isWindows: | |
os.system("title Krig, %s med %s poeng vs. %s med %s poeng." | |
% ( spiller1.navn, len(spiller1.kortstokk)-1, spiller2.navn, len(spiller2.kortstokk)-1 ) ) | |
else: | |
sys.stdout.write("\x1b]2;Krig, %s med %s poeng vs. %s med %s poeng.\x07" | |
% ( spiller1.navn, len(spiller1.kortstokk)-1, spiller2.navn, len(spiller2.kortstokk)-1 ) ) | |
# Sjekk om spilleren vil fortsette eller lukke spillet | |
if raw_input() in ['q', 'Q']: | |
running = False | |
if __name__ == "__main__": | |
# Windows er spesiell. Spesielle behov for spesielle barn | |
isWindows = re.match("windows", sys.platform, re.IGNORECASE) | |
kort = [] | |
# Lag kortstokken programmatisk | |
# Jeg putter på r, k, etc. for å symbolisere ruter, kløver og slik | |
# %i er en måte å dytte et tall inn i en tekst på | |
i = 1 | |
while i <= 13: | |
kort.append("r%i" % i) # Legger til en ruter | |
kort.append("k%i" % i) # Legger til en kløver | |
kort.append("s%i" % i) # Legger til en spar | |
kort.append("h%i" % i) # Legger til en hjerter | |
i += 1 | |
# Stokk om kortene | |
shuffle(kort) | |
# Gi Spiller 1 den første halvdelen av bunken | |
spiller1 = Spiller(kort[:26], navn = "Spiller 1") | |
# Gi CPU den andre halvdelen av bunken | |
spiller2 = Spiller(kort[26:], navn = "CPU") | |
# Legg til en "shuffle marker" for at Spiller.nyttKort() skal stokke ved... | |
spiller1.kortstokk.append("shuffle") # ...slutten av en bunke | |
spiller2.kortstokk.append("shuffle") | |
gameLoop() # Start funksjonen gameLoop() som tar seg av logikk og spillet |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This was moved from a private Gist to a public one at 5th of March 2013.