In: Computer Science
Python
Objective
Develop an interface system using techniques and design patterns seen in class through a problem with realistic constraints.
Specs
Write an interactive program for a board game called Parcheesi.
put the program output
I need to make it work!!!
from graphics import Graphwin, Point, Line
from math import pi, cos, sin
def Koch(Turtle, lenghth, degree):
    if degree == 0:
        Turtle.draw(length)
    else:
        length1 = length/3
        degree1 = degree - 1
        Koch(Turtle, length1, degree1)
        Turtle.turn(-60)
        Koch(Turtle, length1, degree1)
        Turtle.turn(120)
        Koch(Turtle, length1, degree1)
        Turtle.turn(-60)
        Koch(Turtle, length1, degree1)
class Turtle:
    def __init__(self, point, direction, windows):
        self.location = point
        self.direction = direction * pi / 3
        self.win = window
    def moveTo(self, newpoint):
        self.location = newpoint
    def _moveTo(self, length):
        dx = length * cos(self.direction)
        dy = length * sin(self.direction)
        x = self.location.getX()
        y = self.location,getY()
        x += dx
        y += dy
        newpoint = Point(x, y)
        return self.moveTo(newpoint)
    def draw(self, length):
        oldLocation + self.location
        self._moveTo(length)
        path = Line(oldLocation, self.location)
        path.draw(self.win)
    def turn(self, direction):
        if direction == -60:
            self.direction -= (pi / 3)
        elif direction == 120:
            self.direction += (2 * pi / 3)
def main():
    length = 500
    degree = 5
    win = GraphWin("Koch SnowFlake", 800, 800)
    dir = 0
    turtle = Turtle(Point(150, 250), dir, win)
    for i in range(3):
        Koch(turtle, length, degree)
        turtle.turn(120)
    win. getMouse()
main()
#!/usr/bin/env python
import logging
import sys
import os
from src.core import game
from src.core import table
from src.core import player
from src.core import dice
import pygame
from src.gui.pygame_stuff import load_image
from pygame.locals import *
from pygame.sprite import Sprite
class ParcheeseUI(game.Game):
    """ Main class """
    def __init__(self):
        """ Initialize game
"""
        pygame.init()
       
pygame.display.set_caption('Parcheese')
        self.screen =
pygame.display.set_mode((640, 640))
        self.clock =
pygame.time.Clock()
        self.going = True
       
pygame.mouse.set_visible(1)
        self.buttons = []
        self.image_path =
os.getcwd()
        self.image_path =
os.path.join(self.image_path, 'data')
        #Create The
Background
        self.background =
self.loadBg(os.path.join(self.image_path,
                                                   
'board_640.png'))
       
self.addPlayer('neonigma', 'red')
       
self.addPlayer('piponazo', 'green')
       
self.addPlayer('darkesa', 'yellow')
        self.addPlayer('frawny',
'blue')
self.initGame()
        self.dice =
dice.Dice()
        self.counterDC = 0
        # turn of the game:
in sense of the hands of the clock
        self.players =
self.getPlayers()
       
self.players.reverse()
self.drawCheckers()
    def drawCheckers(self):
        """ Draw the checkers of
all players in screen """
        self.chkSprites = [] #
list of sprites drawing checkers
        coordinates = [] #
coordinates of square
        pyr_idx = 0 # player
index
        # iterate
players
        for player in
self.players:
           
checkers = player.getCheckers()
           
# add a group of sprites (four checker of a player)
           
# to the list of chkSprites
           
self.chkSprites.append(pygame.sprite.Group())
           
# iterate checkers for this player
           
for chk in checkers:
               
chkSprite = CheckerSprite(chk, self.image_path)
               
# add chkSprite with image checker to current group
               
self.chkSprites[pyr_idx].add(chkSprite)
           
# inc player index
           
pyr_idx += 1
        # iterate over
sprites GROUP
        for chkSprite in
self.chkSprites:
           
chkCheckers = []
           
zeros = 0
           
# iterate checker for current group
           
for checker in chkSprite:
               
chk = checker.getChk()
               
# don't process barriers if already did it in processBarrier
               
if chk not in chkCheckers:
                   
barrier = self._processBarrier(chk,
                                                  
checker.getImage(),
                                                  
chkCheckers,
                                                  
self.chkSprites)
               
# if chk wasn't processed in processBarrrier,
               
# draw it separately
               
if chk not in chkCheckers:
                   
square = chk.getSquare()
                   
# detect checkers at home, indexes changes for these,
                   
# so we fix index number for each one
                   
if chk.getPos() == 0:
                       
coordinates = square.getCoord(chk, zeros)
                       
zeros += 1
                   
else:
                       
coordinates = square.getCoord()
                   
self.screen.blit(checker.getImage(), coordinates)
                   
chk.setCoordPos(coordinates)
    def _processBarrier(self, searChk,
searchChkImg, chkCheckers, chkSprites):
        normalChks = []
        schSqu =
searChk.getPos()
        for chkSprite in
chkSprites:
           
for checker in chkSprite:
               
chk = checker.getChk()
               
squ = chk.getPos()
               
if searChk <> chk and schSqu == squ and schSqu <>
0:
                   
coordinates = chk.getSquare().getCoord(chk)
                   
# get coordinates for barrier
                   
coorDrawing = self._getIncDecCoord(squ, coordinates)
                   
# paint two checkers of the barrier
                   
self.screen.blit(checker.getImage(), coorDrawing[0])
                   
self.screen.blit(searchChkImg, coorDrawing[1])
                   
# update coordinates position for these checkers
                   
chk.setCoordPos(coorDrawing[0])
                   
searChk.setCoordPos(coorDrawing[1])
                   
# don't process this checkers again
                   
chkCheckers.append(chk)
                   
chkCheckers.append(searChk)
                   
# tell barrier detected!
                   
return True
return False
    def _getIncDecCoord(self, squPos,
coordinates):
        if ((squPos >= 1 and
squPos <= 8) or \
          
(squPos >= 26 and squPos <= 42) or \
          
(squPos >= 60 and squPos <= 76) or \
          
(squPos >= 85 and squPos <= 92)):
           
return [(coordinates[0], coordinates[1] - 15),
                   
(coordinates[0], coordinates[1] + 15)]
        elif ((squPos >= 9
and squPos <= 25) or \
          
(squPos >= 43 and squPos <= 59) or \
          
(squPos >= 77 and squPos <= 84) or \
          
(squPos >= 93 and squPos <= 100)):
           
return [(coordinates[0] - 15, coordinates[1]),
                   
(coordinates[0] + 15, coordinates[1])]
    def getScreen(self):
        return self.screen
    def addButton(self, button):
        self.buttons =
self.buttons + [button]
    def run(self):
       
self.loop()     # Run the event loop
       
pygame.quit()   # Close the Pygame window
    def loop(self):
        self.__draw() # first
time for background
        while self.going:
           
self.clock.tick(120)
           
for player in self.players:
               
#dVal = self.dice.throwDice()
               
dVal = self.throwDice()
               
logging.info("%s gets %s ", player.getName(), str(dVal))
               
self.manageTurn(player, dVal, None)
               
self.__draw()
    def throwDice(self):
        # return
self.dice.throwDice()
      
        # TEST: a checker enemy
in other checker's init pos was eated
        # dices = [5, 6, 6, 4,
1, 1, 1, 1, 1, 1, 5, 3, 3, 3, 3]
        # TEST: 2 checkers in
init pos, and player wants take another one out
        # dices = [5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
        # TEST: selecting a
checker enemy in other checker's init pos
        # dices = [5, 6, 6, 4,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        # TEST: selecting a
checker enemy in other checker's secure pos
        # dices = [6, 1, 6, 6,
4, 1, 1, 5, 6, 2, 1, 1, 1, 1]
        # TEST: selecting a
checker enemy in other checker's secure pos
        # dices = [1, 5, 1, 1,
1, 2, 2, 2, 1, 5, 1, 1, 1, 3, 1, 1, 2, 5, 1, 1, 1, 6, 1, 1, 1]
        # TEST: not breaking
a barrier with 5
        # dices = [1, 5, 1, 1,
1, 4, 1, 1, 1, 5, 1, 1, 1, 5, 1, 1, 1]
        # TEST: if player can
not move, pass turn
        # dices = [5, 5, 1,
1,
       
#         1, 6, 6, 4, 1,
1,
       
#         5, 6, 6, 4, 1,
1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         5, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1]
        # TEST: if player got
two barriers, take both in consideration
        # dices = [5, 5, 1,
1,
       
#         1, 6, 6, 4, 1,
1,
       
#         5, 6, 6, 4, 1,
1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         5, 6, 6, 4, 1,
1,
       
#         1, 6, 6, 4, 1,
1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1,
       
#         1, 5, 1, 1]
        # TEST: eat a simple
checker
        # dices = [1, 6, 6, 4,
1, 1, 1, 3, 1, 1, 1]
        # TEST: eat a checker
when you have more checkers in game
        # dices = [1, 5, 1, 1,
1, 6, 6, 4, 1, 1, 1, 4, 1, 1, 1, 1]
        # TEST: checking
stairs and nirvana
        #dices = [1, 5, 1, 1, 1,
6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1,
1, 1, 6, 5,
       
#              
1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6,
6, 4, 1, 1, 6, 6, 4,
       
#              
1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 5,
1, 1, 1, 1, 1, 1, 1,
       
#              
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        # TEST: checking
stairs and nirvana
        dices = [1, 5, 1, 1, 1,
6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1,
1, 1, 6, 5,
                      
1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6,
6, 4, 1, 1, 1, 6, 6, 4,
                      
1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 6, 6, 4, 1, 1, 1, 5,
1, 1, 1, 6, 6, 4,
                      
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        dVal =
dices[self.counterDC]
        self.counterDC +=
1
        return dVal
    def __blockUntilSelect(self, player, dVal,
breakBarrier = True):
        chk = None
        if dVal == 5 and
breakBarrier == True:
           
for chkSprite in self.chkSprites:
               
for checker in chkSprite:
                   
chkSearch = checker.getChk()
                   
if chkSearch.getPlayer().getName() == player.getName():
                       
if chkSearch.getPos() == 0:
                           
chk = chkSearch
        if chk == None:
           
chk = self.__handleEvents()
        else:
           
return chk # move without select (get out from home)
        while chk == False or
chk.getPlayer() <> player:
           
chk = self.__handleEvents()
        return chk
    def breakFiveBarrier(self, processTurn,
player, chkID, dVal):
        breakBarrier = True
        if processTurn ==
-1:
           
# recall for processing break barrier at
           
# initial position with dVal = 5, sending -1
           
# for advice
           
checkers = player.getCheckers()
           
for chk in checkers:
               
chkToMove = player.checkIfHasBarrier(chk, dVal,
                                           
self.getNormalSquares(),
                                           
self.getStairSquares(player))
               
if chk == chkToMove:
                   
# this chk is not in a barrier
                   
movement = player.checkIfChkCanMove(chk, dVal,
                                            
self.getNormalSquares(),
                                            
self.getStairSquares(player))
                   
# this chk can move, it is not necessary break barrier
                   
if movement <> False:
                       
breakBarrier = False
logging.info("break barrier: %s", breakBarrier)
           
if breakBarrier == True:
               
processTurn = self.nextTurn(player, -1, chkID, False)
           
else:
               
chk = self.__blockUntilSelect(player, dVal, breakBarrier)
               
chkID = chk.getID()
               
logging.info("barrier in dVal: %s and chkID: %s", dVal,
chkID)
               
processTurn = self.nextTurn(player, -1, chkID, True)
        if processTurn
<> False:
           
return processTurn
        else:
           
return dVal
    def breakSixBarrier(self, player, dVal,
chkID):
        chkSelected = None
        if
player.checkersAtHome() == False:
           
if dVal == 6 or dVal == 12:
               
chkSelected = player.checkIfHasBarrier(None, dVal,
                                       
self.getNormalSquares(),
                                       
self.getStairSquares(player))
        if chkSelected ==
None:
           
# wait until player select one checker
           
chk = self.__blockUntilSelect(player, dVal)
        else:
           
chk = chkSelected
return chk.getID()
    def playerCanMove(self, dVal, player):
        # if player can not
move, pass turn
        playerCanMove =
player.checkIfPlayerCanMove(dVal,
                                           
self.getNormalSquares(),
                                           
self.getStairSquares(player))
        if playerCanMove ==
False:
           
return False
        else:
           
return True
    def manageTurn(self, player, dVal,
chkID):
        # if player has all
checkers at home, pass turn
        if dVal <> 5 and
player.getNumChksAtHome() == 4:
           
return
        if
self.playerCanMove(dVal, player) == False:
           
return
        chkID =
self.breakSixBarrier(player, dVal, chkID)
      
        processTurn =
self.nextTurn(player, dVal, chkID)
result = self.breakFiveBarrier(processTurn, player, chkID, dVal)
        # manual select
succedeed
        if result == True:
           
return
        while
isinstance(processTurn, int) or processTurn == False:
           
if isinstance(processTurn, int):
               
self.__draw()
           
if processTurn == 6 or processTurn == 12:
               
#processTurn = self.dice.throwDice()
               
processTurn = self.throwDice()
               
logging.info("%s gets %s ", player.getName(), str(processTurn))
           
if processTurn == -6:
               
# checker can not be moved in last turn, retry
               
processTurn = 6
           
if isinstance(processTurn, int):
               
result = processTurn
           
# if player has all checkers at home, pass turn
           
if dVal <> 5 and player.getNumChksAtHome() == 4:
               
return
  
           
if self.playerCanMove(processTurn, player) == False:
               
logging.info("%s can move with %s ", player.getName(),
str(dVal))
               
return
chkID = self.breakSixBarrier(player, processTurn, chkID)
processTurn = self.nextTurn(player, result, chkID)
result = self.breakFiveBarrier(processTurn, player, chkID, dVal)
           
# manual select succedeed
           
if result == True:
               
return
    def __handleEvents(self):
        """ Handle all events
"""
        for event in
pygame.event.get():
           
if event.type == QUIT:
               
self.going = False
           
elif event.type == KEYDOWN and event.key == K_ESCAPE:
               
self.going = False
           
elif event.type == MOUSEBUTTONDOWN:
               
self.__handleMouseDown(pygame.mouse.get_pos())
               
if event.button == 1:
                   
return self.__selectChecker(event)
return False
    def __selectChecker(self, event):
        for chkSprite in
self.chkSprites:
           
for checker in chkSprite:
               
chk = checker.getChk()
               
square = chk.getSquare()
               
#coord = square.getCoord(chk, chk.getID())
               
coord = chk.getCoordPos()
               
imgDim = checker.getImgDim()
               
#coordSrc = (coord[0], coord[1])
               
#coordTgt = (coord[0] + imgDim[0], coord[1] + imgDim[1])
               
#pygame.draw.line(self.screen, (0, 0, 255), coordSrc,
coordTgt)
               
#pygame.display.flip()
               
if coord[0] < event.pos[0] < (coord[0] + imgDim[0]):
                   
if coord[1] < event.pos[1] < (coord[1] + imgDim[1]):
                       
return chk
        return False
    def __handleMouseDown(self, (x, y)):
        for button in
self.buttons:
           
button.handleMouseDown(x, y)
    def __draw(self):
        """ Draw graphics
"""
       
self.screen.blit(self.background, (0, 0))
        #for button in
self.buttons:
           
#button.draw(self.screen)
        self.drawCheckers()
        # update if we want
to repaint known areas
       
pygame.display.flip()
    def initGame(self):
        """ Initialize the game
"""
        self.start()
        self.buttons = []
    def loadBg(self, filename,
transparent=False):
        fullname =
os.path.join('data', filename)
        try:
           
image = pygame.image.load(fullname)
        except pygame.error,
message:
           
raise SystemExit, message
        image =
image.convert()
        if transparent:
           
color = image.get_at((0, 0))
           
image.set_colorkey(color, RLEACCEL)
        return image
class CheckerSprite(Sprite):
    def __init__(self, checker,
image_path):
        """ Constructor.
        Keyword
arguments:
        player : The player that
have this checker.
        """
       
Sprite.__init__(self)
        self.checker =
checker
        self.image_path =
image_path
        #box_list =
Box(3)
        #self.start =
box_list.get_box_pos()
        chkColor =
self.checker.getPlayer().getColor()
        self.image, self.rect =
self.loadImgame(os.path.join(self.image_path,
                                               
chkColor + "_checker.png"),
                                               
True)
        self.image, self.rect =
pygame.transform.scale(self.image, (30, 30)),\
                                                       
self.rect
        self.rect =
self.image.get_rect()
        #self.pos_x =
self.start[0]
        #self.pos_y =
self.start[1]
        #self.checker_pos =
(self.pos_x, self.pos_y)
        self.image_w,
self.image_h = self.image.get_size()
        self.rect.centerx = 800
/ 2
        self.rect.centery = 800
/ 2
    def loadImgame(self, name, get_alpha):
        """ Load image and
return image object"""
        try:
           
image = pygame.image.load(name)
           
if image.get_alpha is None:
               
image = image.convert()
           
else:
               
image = image.convert_alpha()
        except pygame.error,
message:
           
print 'Cannot load image:', name
        else:
           
return image, image.get_rect()
    def getImage(self):
        return self.image
    def getChk(self):
        return self.checker
    def getImgDim(self):
        return (self.image_w,
self.image_h)
class AddPlayerC:
    """ Command for add players """
    def __init__(self, app, name, color):
        self.app = app
        self.name = name
        self.color = color
    def do(self):
       
self.app.addPlayer(self.name, self.color)
class StartGameC:
    """ Command for starting game """
    def __init__(self, app):
        self.app = app
    def do(self):
        self.app.initGame()
def main():
    ''' Main function '''
   
logging.basicConfig(level=logging.DEBUG)
    ParcheeseUI().run()
if __name__ == '__main__':
    main()