Skip to content

Instantly share code, notes, and snippets.

@404d
Last active December 14, 2015 12:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 404d/5088526 to your computer and use it in GitHub Desktop.
Save 404d/5088526 to your computer and use it in GitHub Desktop.
A Python script playing the cardgame "War"
# -*- 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
@404d
Copy link
Author

404d commented Mar 5, 2013

This was moved from a private Gist to a public one at 5th of March 2013.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment