Beispiel #1
0
 def _move_free_fox():
     for idx in range(N_FREE_FOXES):
         name = 'fox' + str(idx)
         x, y = canv.coords(name)
         MAX_ALLOWED_ANGLE = 60
         while True:
             yShift = (1 - 2 * random.random()) * MOVEMENT_STEP_SIZE
             xShift = (1 - 2 * random.random()) * MOVEMENT_STEP_SIZE
             angle = maths.get_angle(xShift, yShift,
                                     self._foxlastXvec[idx],
                                     self._foxlastYvec[idx])
             if abs(angle) < MAX_ALLOWED_ANGLE:
                 break
         x, y = x + xShift, y + yShift
         if not _check_clipping(
                 x, y, xSize=FOX_SIZE, ySize=FOX_SIZE, exclude=name):
             self._foxlastXvec[idx] = xShift
             self._foxlastYvec[idx] = yShift
             canv.move(name, xShift, yShift)
             _keep_in_box(name)
         else:
             self._foxlastXvec[idx] = -self._foxlastXvec[idx]
             self._foxlastYvec[idx] = -self._foxlastYvec[idx]
             canv.move(name, self._foxlastXvec[idx],
                       self._foxlastYvec[idx])
             _keep_in_box(name)
         if self._goldFox == name:
             self._goldFoxLife += 1
             if self._goldFoxLife > GOLD_FOX_LIFE_STEPS:
                 self._goldFox = None
                 self._goldFoxLife = 0
                 _delete_widget(name)
                 _draw_new_fox(x, y, name)
     self._job['move_free_fox'] = master.after(int(1 / START_SPEED),
                                               _move_free_fox)
Beispiel #2
0
 def move_free_fox():
     for idx in range(N_FREE_FOXES):
         name = 'fox' + str(idx)
         x, y = canv.coords(name)
         MAX_ALLOWED_ANGLE = 60
         while True:
             yShift = (1 - 2 * random.random()) * MOVEMENT_STEP_SIZE
             xShift = (1 - 2 * random.random()) * MOVEMENT_STEP_SIZE
             angle = maths.get_angle(xShift, yShift,
                                     self._foxlastXvec[idx],
                                     self._foxlastYvec[idx])
             if abs(angle) < MAX_ALLOWED_ANGLE:
                 break
         x, y = x + xShift, y + yShift
         if not check_clipping(
                 x, y, xSize=FOX_SIZE, ySize=FOX_SIZE, exclude=name):
             self._foxlastXvec[idx] = xShift
             self._foxlastYvec[idx] = yShift
             canv.move(name, xShift, yShift)
             keep_in_box(name)
         else:
             self._foxlastXvec[idx] = -self._foxlastXvec[idx]
             self._foxlastYvec[idx] = -self._foxlastYvec[idx]
             canv.move(name, self._foxlastXvec[idx],
                       self._foxlastYvec[idx])
             keep_in_box(name)
     self._job['move_free_fox'] = master.after(int(1 / START_SPEED),
                                               move_free_fox)
Beispiel #3
0
        def _move():
            if self._direction is not None:
                canv.move('major', self._xVelTumble, self._yVelTumble)
                itemX, itemY = canv.coords('major')
                self._xPath.appendleft(itemX)
                self._yPath.appendleft(itemY)
                _keep_in_box('major')
                _move_fox_tail()
                beerList = list(map(lambda x: 'beer' + str(x), range(N_BEERS)))
                freeFoxList = list(
                    map(lambda x: 'fox' + str(x), range(N_FREE_FOXES)))
                # catch foxes
                foxCollision = _check_clipping(itemX,
                                               itemY,
                                               include=freeFoxList)
                if foxCollision:
                    sound.play_sound(files.BLOP_WAV_PATH)
                    self._nFoxes += 1
                    canv.itemconfig('foxText', text=': ' + str(self._nFoxes))
                    goldFoxTail = False
                    if foxCollision == self._goldFox:
                        goldFoxTail = True
                        self._goldFox = None
                        self._goldFoxLife = 0
                    newX, newY = _get_new_tail_pos()
                    _draw_new_fox(newX=newX,
                                  newY=newY,
                                  name='tail' + str(self._nFoxes - 1),
                                  gold=goldFoxTail)
                    for item in reversed(itemRegister):
                        canv.tag_raise(item)
                    goldFox = False
                    if self._goldFox is None and random.random(
                    ) < GOLD_FOX_CHANCE:
                        goldFox = True
                        self._goldFox = foxCollision
                    _draw_new_fox(name=foxCollision, gold=goldFox)
                    foxIdx = int(foxCollision.lstrip('fox'))
                    self._foxlastXvec[foxIdx] = random.random()
                    self._foxlastYvec[foxIdx] = random.random()
                    if not any(i in itemRegister for i in beerList):
                        for beerName in beerList:
                            if random.random() < BEER_RESPAWN_CHANCE:
                                _draw_new_beer(name=beerName)
                    if self._nJaegers == 0 and random.random() < JAEGER_CHANCE:
                        _draw_new_jaeger(name='jaeger')
                        self._nJaegers += 1
                    if self._nBeers > 0:
                        foxValue = self._nBeers
                        starScale = min(0.3 + self._nBeers / MAX_BEER * 0.3,
                                        0.7)
                        if goldFoxTail:
                            for _ in range(GOLD_FOX_MULTIPLIER):
                                starName = 'scoreStar_' + str(
                                    self._nScoreStars) + '_value_' + str(
                                        foxValue)
                                _draw_new_star(itemX, itemY, starName,
                                               starScale)
                                _move_score_star(starName, itemX, itemY)
                                self._nScoreStars += 1
                        else:
                            starName = 'scoreStar_' + str(
                                self._nScoreStars) + '_value_' + str(foxValue)
                            _draw_new_star(itemX, itemY, starName, starScale)
                            _move_score_star(starName, itemX, itemY)
                            self._nScoreStars += 1

                def set_alc_effect(weight=1):
                    for _ in range(weight):
                        step = (MAX_SPEED - START_SPEED) / N_SPEED_STEPS
                        self._speed = min(self._speed + step, MAX_SPEED)
                        if self._nBeers == MAX_BEER or (
                                self._rotationSpeed == 0
                                and self._nBeers > MAX_BEER):
                            self._rotationSpeed = START_ROTATION_SPEED
                        elif self._nBeers > MAX_BEER:
                            step = (MAX_ROTATION_SPEED - START_ROTATION_SPEED
                                    ) / N_ROTATION_SPEED_STEPS
                            self._rotationSpeed = min(
                                self._rotationSpeed + step, MAX_ROTATION_SPEED)
                            step = (MAX_TUMBLE_ANGLE -
                                    START_TUMBLE_ANGLE) / N_TUMBLE_STEPS
                            self._tumbleAngle = min(self._tumbleAngle + step,
                                                    MAX_TUMBLE_ANGLE)

                # drink beer
                beerCollision = _check_clipping(itemX, itemY, include=beerList)
                if beerCollision:
                    sound.play_sound(files.SLURP_WAV_PATH)
                    self._nBeers += 1
                    set_alc_effect()
                    canv.itemconfig('beerText',
                                    text=': ' + str(self._nBeers) + ' / ' +
                                    str(MAX_BEER - 1))
                    if self._nBeers >= MAX_BEER + 5 and self._nBucket == 0:
                        _draw_new_bucket(name='bucket')
                        self._nBucket += 1
                    if random.random() < BEER_RESPAWN_CHANCE:
                        _draw_new_beer(name=beerCollision)
                    else:
                        _delete_widget(beerCollision)
                    if self._nJaegers == 0 and random.random() < JAEGER_CHANCE:
                        _draw_new_jaeger(name='jaeger')
                        self._nJaegers += 1

                # drink jaeger
                if _check_clipping(itemX, itemY, include='jaeger'):
                    sound.play_sound(files.SLURP_WAV_PATH)
                    self._nBeers += JAEGER_MULTIPLIER
                    set_alc_effect(JAEGER_MULTIPLIER)
                    canv.itemconfig('beerText',
                                    text=': ' + str(self._nBeers) + ' / ' +
                                    str(MAX_BEER - 1))
                    if self._nBeers >= MAX_BEER + 5 and self._nBucket == 0:
                        _draw_new_bucket(name='bucket')
                        self._nBucket += 1
                    _delete_widget('jaeger')
                    self._nJaegers -= 1

                # hit bucket
                if _check_clipping(itemX, itemY, include='bucket'):
                    sound.play_sound(files.HICCUP_WAV_PATH)
                    self._nBeers = MAX_BEER - 1
                    canv.itemconfig('beerText',
                                    text=': ' + str(self._nBeers) + ' / ' +
                                    str(MAX_BEER - 1))
                    _delete_widget('bucket')
                    self._nBucket -= 1
                    self._currentRotation = 0
                    self._rotationSpeed = 0
                    self._tumbleAngle = START_TUMBLE_ANGLE

                # rotate major and its direction
                # print('speed', self._speed, 'rotationSpeed', self._rotationSpeed, 'tumbleDegree', self._tumbleAngle)
                self._currentRotation += self._rotationSpeed
                canv.majorImg = ImageTk.PhotoImage(
                    majorImgObj.rotate(self._tumbleAngle * 2 *
                                       math.sin(self._currentRotation)))
                canv.itemconfig('major', image=canv.majorImg)
                angle = maths.get_angle(1, 0, self._xVel, self._yVel)
                angle += self._tumbleAngle * math.sin(-self._currentRotation)
                angle = math.radians(angle)
                self._xVelTumble = MOVEMENT_STEP_SIZE * math.cos(angle)
                self._yVelTumble = MOVEMENT_STEP_SIZE * math.sin(angle)
                # check tail overlap
                noTailFoxes = [
                    item for item in itemRegister if 'tail' not in item
                ]
                noTailFoxes.extend(['tail' + str(idx) for idx in range(2)])
                noTailFoxes.extend([
                    'tail' + str(idx) for idx in range(self._nFoxes)
                    if idx not in self._activeFoxes
                ])
                crashFox = _check_clipping(itemX,
                                           itemY,
                                           exclude=noTailFoxes,
                                           xSize=MAJOR_SIZE * 0.1,
                                           ySize=MAJOR_SIZE * 0.1)

                if crashFox:
                    sound.play_sound(files.BLAST_WAV_PATH)
                    print('Overlapping with tail', crashFox)
                    _end_game()
                    return
            self._job['move'] = master.after(int(1 / self._speed), _move)
Beispiel #4
0
        def move():
            if self._direction is not None:
                canv.move('major', self._xVelTumble, self._yVelTumble)
                itemX, itemY = canv.coords('major')
                self._xPath.appendleft(itemX)
                self._yPath.appendleft(itemY)
                keep_in_box('major')
                move_fox_tail()
                beerList = list(map(lambda x: 'beer' + str(x), range(N_BEERS)))
                freeFoxList = list(
                    map(lambda x: 'fox' + str(x), range(N_FREE_FOXES)))
                # catch foxes
                foxCollision = check_clipping(itemX,
                                              itemY,
                                              include=freeFoxList)
                if foxCollision:
                    sound.play_sound(files.BLOP_WAV_PATH)
                    self._score += self._nBeers
                    self._nFoxes += 1
                    canv.itemconfig('foxText', text=': ' + str(self._nFoxes))
                    canv.itemconfig('starText', text=': ' + str(self._score))
                    newX, newY = get_new_tail_pos()
                    _draw_new_fox(newX=newX,
                                  newY=newY,
                                  name='tail' + str(self._nFoxes - 1))
                    for item in reversed(itemRegister):
                        canv.tag_raise(item)
                    _draw_new_fox(name=foxCollision)
                    foxIdx = int(foxCollision.lstrip('fox'))
                    self._foxlastXvec[foxIdx] = random.random()
                    self._foxlastYvec[foxIdx] = random.random()
                    if not any(i in itemRegister for i in beerList):
                        for beerName in beerList:
                            if random.random() < BEER_RESPAWN_CHANCE:
                                _draw_new_beer(name=beerName)
                # drink beer
                beerCollision = check_clipping(itemX, itemY, include=beerList)
                if beerCollision:
                    sound.play_sound(files.SLURP_WAV_PATH)
                    self._nBeers += 1
                    canv.itemconfig('beerText',
                                    text=': ' + str(self._nBeers) + ' / ' +
                                    str(MAX_BEER - 1))
                    canv.itemconfig('starText', text=': ' + str(self._score))
                    step = (MAX_SPEED - START_SPEED) / N_SPEED_STEPS
                    self._speed = min(self._speed + step, MAX_SPEED)
                    if self._nBeers == MAX_BEER:
                        self._rotationSpeed = START_ROTATION_SPEED
                    elif self._nBeers > MAX_BEER:
                        step = (MAX_ROTATION_SPEED -
                                START_ROTATION_SPEED) / N_ROTATION_SPEED_STEPS
                        self._rotationSpeed = min(self._rotationSpeed + step,
                                                  MAX_ROTATION_SPEED)
                        step = (MAX_TUMBLE_ANGLE -
                                START_TUMBLE_ANGLE) / N_TUMBLE_STEPS
                        self._tumbleAngle = min(self._tumbleAngle + step,
                                                MAX_TUMBLE_ANGLE)
                    if self._nBeers == MAX_BEER + 5:
                        _draw_new_bucket()
                    if random.random() < BEER_RESPAWN_CHANCE:
                        _draw_new_beer(name=beerCollision)
                    else:
                        delete_widget(beerCollision)
                # hit bucket
                if check_clipping(itemX, itemY, include='bucket'):
                    sound.play_sound(files.HICCUP_WAV_PATH)
                    self._nBeers = MAX_BEER - 1
                    canv.itemconfig('beerText',
                                    text=': ' + str(self._nBeers) + ' / ' +
                                    str(MAX_BEER - 1))
                    delete_widget('bucket')
                    self._currentRotation = 0
                    self._rotationSpeed = 0
                    self._tumbleAngle = START_TUMBLE_ANGLE
                # rotate major and its direction
                # print('speed', self._speed, 'rotationSpeed', self._rotationSpeed, 'tumbleDegree', self._tumbleAngle)
                self._currentRotation += self._rotationSpeed
                canv.majorImg = ImageTk.PhotoImage(
                    majorImgObj.rotate(self._tumbleAngle * 2 *
                                       math.sin(self._currentRotation)))
                canv.itemconfig('major', image=canv.majorImg)
                angle = maths.get_angle(1, 0, self._xVel, self._yVel)
                angle += self._tumbleAngle * math.sin(-self._currentRotation)
                angle = math.radians(angle)
                self._xVelTumble = MOVEMENT_STEP_SIZE * math.cos(angle)
                self._yVelTumble = MOVEMENT_STEP_SIZE * math.sin(angle)
                # check tail overlap
                noTailFoxes = [
                    item for item in itemRegister if 'tail' not in item
                ]
                noTailFoxes.extend(['tail' + str(idx) for idx in range(2)])
                crashFox = check_clipping(itemX,
                                          itemY,
                                          exclude=noTailFoxes,
                                          xSize=MAJOR_SIZE * 0.1,
                                          ySize=MAJOR_SIZE * 0.1)

                if crashFox:
                    sound.play_sound(files.BLAST_WAV_PATH)
                    print('Overlapping with tail', crashFox)
                    _end_game()
                    return
            self._job['move'] = master.after(int(1 / self._speed), move)