Introduction:
Game of the Day update series – today to unlock the game!
Late one night, as I was happily navigating the Internet as usual, I received a phone call that caught me off guard.
On the screen was a big, scary word: Mom.
I slowly pressed the call button, and quickly reflected on whether I had just sent friends to forget to shield, she found that I was staying up late.
The other end of the phone as expected came her voice of fire, but I guess the beginning, but can not guess the end.
My mom said, “You’re still up. Unlock my new level of fun.”
I was still trying to determine whether this was a test or a false shot when she began to worry: “Hurry up, I just need the last person, I am waiting for you!”
Every sleepless night is similar for those who don’t want to sleep, but my mother and I, who are equally awake, have different sources of happiness!
The body of the
In fact, the theme material can be a little random, moon cakes Mid-Autumn festival version, animation version and so on……. Everything.
Here we prepare two groups of elimination music themes: 1. Emoji elimination music; 2. Chinese Zodiac.
Set jigsaw puzzle sprites:
class gemSprite(pygame.sprite.Sprite):
def __init__(self, img_path, size, position, downlen, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(img_path)
self.image = pygame.transform.smoothscale(self.image, size)
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.downlen = downlen
self.target_x = position[0]
self.target_y = position[1] + downlen
self.type = img_path.split('/')[-1].split('.')[0]
self.fixed = False
self.speed_x = 10
self.speed_y = 10
self.direction = 'down'
Copy the code
The puzzle moves up and down, left and right:
def move(self):
if self.direction == 'down':
self.rect.top = min(self.target_y, self.rect.top+self.speed_y)
if self.target_y == self.rect.top:
self.fixed = True
elif self.direction == 'up':
self.rect.top = max(self.target_y, self.rect.top-self.speed_y)
if self.target_y == self.rect.top:
self.fixed = True
elif self.direction == 'left':
self.rect.left = max(self.target_x, self.rect.left-self.speed_x)
if self.target_x == self.rect.left:
self.fixed = True
elif self.direction == 'right':
self.rect.left = min(self.target_x, self.rect.left+self.speed_x)
if self.target_x == self.rect.left:
self.fixed = True
Copy the code
Define the game class to start the main game loop:
class gemGame(): def __init__(self, screen, sounds, font, gem_imgs, cfg, **kwargs): self.info = 'Gemgem' self.screen = screen self.sounds = sounds self.font = font self.gem_imgs = gem_imgs self.cfg = cfg self.reset() def start(self): Clock = pygame.time.clock () # traverses the entire game interface update location Overall_moving = True # specifies the update location of some individual objects individual_moving = False # defines some necessary variables gem_selected_xy = None gem_selected_xy2 = None swap_again = False add_score = 0 add_score_showtimes = 10 time_pre = int(time.time()) while True: for event in pygame.event.get(): if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONUP: if (not overall_moving) and (not individual_moving) and (not add_score): position = pygame.mouse.get_pos() if gem_selected_xy is None: gem_selected_xy = self.checkSelected(position) else: gem_selected_xy2 = self.checkSelected(position) if gem_selected_xy2: if self.swapGem(gem_selected_xy, gem_selected_xy2): individual_moving = True swap_again = False else: gem_selected_xy = None if overall_moving: Overall_moving = not self.dropGems(0, 0) # If not overall_moving: res_match = self.isMatch() add_score = self.removeMatched(res_match) if add_score > 0: overall_moving = True if individual_moving: gem1 = self.getGemByPos(*gem_selected_xy) gem2 = self.getGemByPos(*gem_selected_xy2) gem1.move() gem2.move() if gem1.fixed and gem2.fixed: res_match = self.isMatch() if res_match[0] == 0 and not swap_again: swap_again = True self.swapGem(gem_selected_xy, gem_selected_xy2) self.sounds['mismatch'].play() else: add_score = self.removeMatched(res_match) overall_moving = True individual_moving = False gem_selected_xy = None gem_selected_xy2 = None self.screen.fill((135, 206, 235)) self.drawGrids() self.gems_group.draw(self.screen) if gem_selected_xy: self.drawBlock(self.getGemByPos(*gem_selected_xy).rect) if add_score: if add_score_showtimes == 10: random.choice(self.sounds['match']).play() self.drawAddScore(add_score) add_score_showtimes -= 1 if add_score_showtimes < 1: add_score_showtimes = 10 add_score = 0 self.remaining_time -= (int(time.time()) - time_pre) time_pre = int(time.time()) self.showRemainingTime() self.drawScore() if self.remaining_time <= 0: return self.score pygame.display.update() clock.tick(self.cfg.FPS)Copy the code
Since it’s a game, it’s more fun to set a time limit.
def showRemainingTime(self):
remaining_time_render = self.font.render('CountDown: %ss' % str(self.remaining_time), 1, (85, 65, 0))
rect = remaining_time_render.get_rect()
rect.left, rect.top = (self.cfg.SCREENSIZE[0]-201, 6)
self.screen.blit(remaining_time_render, rect)
def drawScore(self):
score_render = self.font.render('SCORE:'+str(self.score), 1, (85, 65, 0))
rect = score_render.get_rect()
rect.left, rect.top = (10, 6)
self.screen.blit(score_render, rect)
def drawAddScore(self, add_score):
score_render = self.font.render('+'+str(add_score), 1, (255, 100, 100))
rect = score_render.get_rect()
rect.left, rect.top = (250, 250)
self.screen.blit(score_render, rect)
Copy the code
The same three pictures can be eliminated:
def removeMatched(self, res_match):
if res_match[0] > 0:
self.generateNewGems(res_match)
self.score += self.reward
return self.reward
return 0
Copy the code
Defined image effects:
def dropGems(self, x, y):
if not self.getGemByPos(x, y).fixed:
self.getGemByPos(x, y).move()
if x < self.cfg.NUMGRID - 1:
x += 1
return self.dropGems(x, y)
elif y < self.cfg.NUMGRID - 1:
x = 0
y += 1
return self.dropGems(x, y)
else:
return self.isFull()
Copy the code
Jigsaw position swap:
def swapGem(self, gem1_pos, gem2_pos): margin = gem1_pos[0] - gem2_pos[0] + gem1_pos[1] - gem2_pos[1] if abs(margin) ! = 1: return False gem1 = self.getGemByPos(*gem1_pos) gem2 = self.getGemByPos(*gem2_pos) if gem1_pos[0] - gem2_pos[0] == 1: gem1.direction = 'left' gem2.direction = 'right' elif gem1_pos[0] - gem2_pos[0] == -1: gem2.direction = 'left' gem1.direction = 'right' elif gem1_pos[1] - gem2_pos[1] == 1: gem1.direction = 'up' gem2.direction = 'down' elif gem1_pos[1] - gem2_pos[1] == -1: gem2.direction = 'up' gem1.direction = 'down' gem1.target_x = gem2.rect.left gem1.target_y = gem2.rect.top gem1.fixed = False gem2.target_x = gem1.rect.left gem2.target_y = gem1.rect.top gem2.fixed = False self.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1 self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2 return TrueCopy the code
Attached with the main program interface of the game:
import os import sys import cfg import pygame from modules import * def main(): Pygame.init () Screen = Pygame.display. Set_mode (cfg.screensize) PyGame.display pygame.mixer.init() pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "Resources/Audios /bg.mp3")) Pygame.mixer.music.set_volume (0.6) Pygame.mixer.music.play (-1) # Loading sounds = {} sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav')) sounds['match'] = [] for i in range(6): sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, Font = pygame.font.Font(os.path.join(CFG.ROOTDIR, 'resources/font/ TTF'), 25) # gem_imgs = [] for I in range(1, 8): Gem_imgs.append (os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % I)) # Gem_imgs, CFG) while True: score = game.start() flag = False for event in pygame.event.get(): if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() elif event.type == pygame.KEYUP and event.key == pygame.K_r: flag = True if flag: break screen.fill((135, 206, 235)) text0 = 'Final score: %s' % score text1 = 'Press <R> to restart the game.' text2 = 'Press <Esc> to quit the game.' y = 150 for idx, text in enumerate([text0, text1, text2]): text_render = font.render(text, 1, (85, 65, 0)) rect = text_render.get_rect() if idx == 0: Rect. left, rect.top = (212, y) elif idx == 1: rect.left, rect.top = (122.5, y) else: Rect. left, rect.top = (126.5, y) y += 100 screen.blit(text_render, rect) pygame.display.update() game.reset() '''run''' if __name__ == '__main__': main()Copy the code
Effect:
To be honest, this version of the emoji found wow! Hahaha a lot of similar find can not find out ~
This is a real kawaii ha ha ha for the family of children to play ~
conclusion
All right! The daily Game Update series comes to an end today! Need to find me to package good project old rules, source base see: [959755565] you can get free oh! Your support is my biggest motivation! Remember sanlian oh ~ Aligardo!!