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)
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)
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)
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)