Advertisement
Guest User

Astorek

a guest
Dec 6th, 2013
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.12 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from sys import exit
  5.  
  6. class Game():
  7.     ''' Verwaltet das Spielfeld und die Spieler '''
  8.    
  9.     constants = {
  10.         "EMPTY"           : " ",
  11.         "SYMBOL_PLAYER_1" : "X",
  12.         "SYMBOL_PLAYER_2" : "O",
  13.     }
  14.    
  15.     def __init__(self):
  16.         # Das Spielfeld generieren
  17.         self.gamefield = [
  18.             [
  19.                 Game.constants["EMPTY"]for i in range(3)
  20.             ]
  21.             for j in range(3)
  22.         ]
  23.        
  24.         # Die Spieler generieren
  25.         self.players = (Player(Game.constants["SYMBOL_PLAYER_1"], True),
  26.                         Player(Game.constants["SYMBOL_PLAYER_2"])
  27.         )
  28.        
  29.     def switchPlayersTurn(self):
  30.         ''' wechselt, welcher Spieler gerade dran ist '''
  31.         for player in self.players:
  32.             player.turn = not player.turn
  33.        
  34.     def place(self, (ypos, xpos)):
  35.         ''' Platziert das Spielerobjekt im angegebenen Feld '''
  36.         for player in self.players:
  37.             if player.turn is True:
  38.                 self.gamefield[ypos][xpos] = player.char
  39.                 break
  40.                
  41.     def isPlacePossible(self, (ypos, xpos)):
  42.         ''' Gibt zurück, ob eine Platzierung möglich ist '''
  43.         if self.gamefield[ypos][xpos] == Game.constants["EMPTY"]:
  44.             return True
  45.         else:
  46.             return False
  47.            
  48.     def isSomeoneWinner(self):
  49.         ''' Prüft, ob ein Spieler gewonnen hat '''
  50.         # Waagrechte Prüfung
  51.         for x in self.gamefield:
  52.             for player in self.players:
  53.                 if x.count(player.char) == 3:
  54.                     return True
  55.        
  56.         # Senkrechte Prüfung
  57.         for x in range(3):
  58.             for player in self.players:
  59.                 if self.gamefield[0][x] == player.char and \
  60.                    self.gamefield[1][x] == player.char and \
  61.                    self.gamefield[2][x] == player.char:
  62.                        return True
  63.        
  64.         # Diagonale Prüfung
  65.         for player in self.players:
  66.             if self.gamefield[0][0] == player.char and \
  67.                self.gamefield[1][1] == player.char and \
  68.                self.gamefield[2][2] == player.char:
  69.                    return True
  70.             elif self.gamefield[0][2] == player.char and \
  71.                  self.gamefield[1][1] == player.char and \
  72.                  self.gamefield[2][0] == player.char:
  73.                    return True
  74.         return False
  75.        
  76.     def isGamefieldFull(self):
  77.         ''' Prüft, ob das Spielfeld voll und keine Züge mehr möglich sind '''
  78.         for x in self.gamefield:
  79.             for y in x:
  80.                 if y == Game.constants["EMPTY"]:
  81.                     return False
  82.         return True
  83.        
  84.  
  85. class GUI():
  86.     ''' Stellt Funktionalität für eine grafische Ausgabe bereit '''
  87.     def __init__(self, game):
  88.         self.game = game
  89.        
  90.     def showPlayersTurn(self):
  91.         ''' Zeigt, welcher Spieler an der Reihe ist '''
  92.         if self.game.players[0].turn is True:
  93.             print "Spieler 1 ist an der Reihe!"
  94.         elif self.game.players[1].turn is True:
  95.             print "Spieler 2 ist an der Reihe!"
  96.        
  97.     def showGamefield(self):
  98.         ''' Stellt das Spielfeld in ASCII-Zeichen dar '''
  99.         # TODO: Komplizierter gings nicht, oder?
  100.         j = 0
  101.         for x in reversed(self.game.gamefield):
  102.             i = 0
  103.             for y in x:
  104.                 print y,
  105.                 if i != 2:
  106.                     print "|",
  107.                 i += 1
  108.             if j < 2:
  109.                 print "\n--+---+--"
  110.                 j += 1
  111.         print
  112.  
  113.     def showPlaceNotPossible(self):
  114.         print "An der Position kannst du nicht setzen!"
  115.        
  116.     def showOptions(self):
  117.         print "Tasten auf dem Nummernblock druecken, um die Position",
  118.         print "zu bestimmen:"
  119.        
  120.     def showGamefieldIsFull(self):
  121.         print "Das Spielfeld ist voll, und niemand hat gewonnen!"
  122.        
  123.     def showWinner(self):
  124.         print "Herzlichen Glueckwunsch, Spieler",
  125.         if self.game.players[0].turn is True:
  126.             print "1",
  127.         else:
  128.             print "2",
  129.         print "hat das Spiel gewonnen!"
  130.              
  131.     def waitForInput(self):
  132.         # TODO: Fehlerprüfung
  133.         return int(raw_input())
  134.            
  135.  
  136.  
  137. class Player():
  138.     ''' Stellt Spieler bereit '''
  139.     def __init__(self, char=" ", turn=False):
  140.         self.char = char  # "Symbol" des Spielers, entweder O oder X
  141.         self.turn = turn  # ob der Spieler gerade dran ist
  142.  
  143. class Program():
  144.     ''' Das Programm vermengt alles zu einem schönen Brei^^ '''
  145.     def convertInput(self, input):
  146.         '''
  147.        Diese Methode wandelt die Eingabe des Nummernblocks um.
  148.        
  149.        Da die Klasse Game() nur mit Y- und X-Koordinaten etwas an-
  150.        fangen kann, der Benutzer aber nur ein Zeichen beim
  151.        Nummernblock eintragen muss, muss eine Methode her, die dieses
  152.        Zeichen in Y- und X-Koordinaten umwandelt. Die Game()-Klasse
  153.        kann (soll?) ja nicht wissen, WIE der Input vonstatten kommt,
  154.        es soll nur mit den richtigen Daten gefüttert werden.
  155.        '''
  156.         input -= 1
  157.         xpos = input % 3
  158.         ypos = input // 3
  159.         return ypos, xpos
  160.        
  161.     def run(self):
  162.         game = Game()
  163.         gui = GUI(game)
  164.  
  165.         gui.showGamefield()
  166.         running = True
  167.  
  168.         while running:
  169.             gui.showPlayersTurn()
  170.             gui.showOptions()
  171.             key = gui.waitForInput()
  172.             y, x = self.convertInput(key)
  173.             if game.isPlacePossible((y, x)) is False:
  174.                 gui.showPlaceNotPossible()
  175.             else:
  176.                 game.place((y, x))
  177.                 if game.isSomeoneWinner():
  178.                     gui.showWinner()
  179.                     running = False
  180.                 elif game.isGamefieldFull():
  181.                     gui.showGamefieldIsFull()
  182.                     running = False
  183.                 else:
  184.                     game.switchPlayersTurn()
  185.             gui.showGamefield()
  186.    
  187. if __name__ == "__main__":
  188.     Program().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement