Hallo allerseits, heute werde ich Ihnen 30 Python-Minispiele bringen. Wenn es Ihnen gefällt, denken Sie daran, es zu mögen, und sammeln Sie es unbedingt. Die vollständige Version des Codes ist am Ende des Artikels verfügbar.
Artikelverzeichnis
Einfach mal Hand anlegen
1. Goldmünzen essen
Quellcode-Sharing:
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('catch coins —— 九歌')
for key, value in cfg.IMAGE_PATHS.items():
if isinstance(value, list):
for item in value: images.append(pygame.image.load(item))
game_images[key] = images
game_images[key] = pygame.image.load(value)
for key, value in cfg.AUDIO_PATHS.items():
if key == 'bgm': continue
game_sounds[key] = pygame.mixer.Sound(value)
return screen, game_images, game_sounds
screen, game_images, game_sounds = initGame()
pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONT_PATH, 40)
hero = Hero(game_images['hero'], position=(375, 520))
food_sprites_group = pygame.sprite.Group()
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
clock = pygame.time.Clock()
screen.blit(game_images['background'], (0, 0))
countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
countdown_text = font.render(countdown_text, True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
screen.blit(countdown_text, countdown_rect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
hero.move(cfg.SCREENSIZE, 'left')
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
hero.move(cfg.SCREENSIZE, 'right')
generate_food_count += 1
if generate_food_count > generate_food_freq:
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)
food_sprites_group.add(food)
for food in food_sprites_group:
if food.update(): food_sprites_group.remove(food)
for food in food_sprites_group:
if pygame.sprite.collide_mask(food, hero):
game_sounds['get'].play()
food_sprites_group.remove(food)
score += food.score
if score > highest_score: highest_score = score
hero.draw(screen)
food_sprites_group.draw(screen)
score_text = f'Score: {
score}, Highest: {
highest_score}'
score_text = font.render(score_text, True, (0, 0, 0))
score_rect = score_text.get_rect()
score_rect.topleft = [5, 5]
screen.blit(score_text, score_rect)
if pygame.time.get_ticks() >= 90000:
pygame.display.flip()
clock.tick(cfg.FPS)
# 游戏结束, 记录最高分并显示游戏结束画面
fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')
fp.write(str(highest_score))
return showEndGameInterface(screen, cfg, score, highest_score)
if __name__ == '__main__':
2. Tischtennis spielen
Quellcode-Sharing:
def Button(screen, position, text, button_size=(200, 50)):
bwidth, bheight = button_size
pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
font = pygame.font.Font(cfg.FONTPATH, 30)
text_render = font.render(text, 1, (255, 235, 205))
return screen.blit(text_render, (left+50, top+10))
--game_mode: 1(单人模式)/2(双人模式)
def startInterface(screen):
clock = pygame.time.Clock()
screen.fill((41, 36, 33))
button_1 = Button(screen, (150, 175), '1 Player')
button_2 = Button(screen, (150, 275), '2 Player')
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if button_1.collidepoint(pygame.mouse.get_pos()):
return 1
elif button_2.collidepoint(pygame.mouse.get_pos()):
return 2
pygame.display.update()
def endInterface(screen, score_left, score_right):
clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = 'Player on left won!' if score_left > score_right else 'Player on right won!'
texts = [font1.render(msg, True, cfg.WHITE),
font2.render('Press ESCAPE to quit.', True, cfg.WHITE),
font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
screen.fill((41, 36, 33))
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
return
elif event.key == pygame.K_ESCAPE:
sys.exit()
pygame.quit()
for text, pos in zip(texts, positions):
screen.blit(text, pos)
pygame.display.update()
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
game_mode = startInterface(screen)
# --左边球拍(ws控制, 仅双人模式时可控制)
racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)
racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
screen.fill((41, 36, 33))
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
racket_right.move('UP')
elif pressed_keys[pygame.K_DOWN]:
racket_right.move('DOWN')
if game_mode == 2:
if pressed_keys[pygame.K_w]:
racket_left.move('UP')
elif pressed_keys[pygame.K_s]:
racket_left.move('DOWN')
racket_left.automove(ball)
scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
score_left += scores[0]
score_right += scores[1]
pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
ball.draw(screen)
racket_left.draw(screen)
racket_right.draw(screen)
screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
if score_left == 11 or score_right == 11:
return score_left, score_right
pygame.display.update()
screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
pygame.display.set_caption('pingpong —— 九歌')
score_left, score_right = runDemo(screen)
endInterface(screen, score_left, score_right)
if __name__ == '__main__':
3. Skifahren
Quellcode-Sharing:
class SkierClass(pygame.sprite.Sprite):
pygame.sprite.Sprite.__init__(self)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
'''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self, img_path, location, attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
self.rect.centery = self.location[1] - num
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col*64+20, row*64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u'滑雪游戏', True, (255, 0, 0))
content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
pygame.display.update()
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render("Score: %s" % score, True, (0, 0, 0))
screen.blit(score_text, pos)
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('滑雪游戏 —— 九歌')
ShowStartInterface(screen, cfg.SCREENSIZE)
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
clock = pygame.time.Clock()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
if __name__ == '__main__':
4 und die Vorabendversion des Flugzeugkriegs
Quellcode-Sharing:
def GamingInterface(num_player, screen):
pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])
fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])
font = pygame.font.Font(cfg.FONTPATH, 20)
bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']]
bg_1 = pygame.image.load(bg_imgs[0]).convert()
bg_2 = pygame.image.load(bg_imgs[1]).convert()
bg_3 = pygame.image.load(bg_imgs[2]).convert()
player_group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
asteroid_group = pygame.sprite.Group()
for i in range(num_player):
player_group.add(Ship(i+1, cfg))
clock = pygame.time.Clock()
score_1, score_2 = 0, 0
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# --玩家一: ↑↓←→控制, j射击; 玩家二: wsad控制, 空格射击
pressed_keys = pygame.key.get_pressed()
for idx, player in enumerate(player_group):
direction = None
if pressed_keys[pygame.K_UP]:
direction = 'up'
elif pressed_keys[pygame.K_DOWN]:
direction = 'down'
elif pressed_keys[pygame.K_LEFT]:
direction = 'left'
elif pressed_keys[pygame.K_RIGHT]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_j]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
elif idx == 1:
if pressed_keys[pygame.K_w]:
direction = 'up'
elif pressed_keys[pygame.K_s]:
direction = 'down'
elif pressed_keys[pygame.K_a]:
direction = 'left'
elif pressed_keys[pygame.K_d]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_SPACE]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
if player.cooling_time > 0:
player.cooling_time -= 1
if (score_1 + score_2) < 500:
background = bg_1
elif (score_1 + score_2) < 1500:
background = bg_2
background = bg_3
# --向下移动背景图实现飞船向上移动的效果
screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
screen.blit(background, (0, bg_move_dis))
bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
if asteroid_ticks == 0:
asteroid_ticks = 90
asteroid_group.add(Asteroid(cfg))
asteroid_ticks -= 1
for player in player_group:
if pygame.sprite.spritecollide(player, asteroid_group, True, None):
player.explode_step = 1
explosion_sound.play()
elif player.explode_step > 0:
if player.explode_step > 3:
player_group.remove(player)
if len(player_group) == 0:
return
player.explode(screen)
player.draw(screen)
for bullet in bullet_group:
bullet.move()
if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
bullet_group.remove(bullet)
if bullet.player_idx == 1:
score_1 += 1
score_2 += 1
bullet.draw(screen)
for asteroid in asteroid_group:
asteroid.move()
asteroid.rotate()
asteroid.draw(screen)
score_1_text = '玩家一得分: %s' % score_1
score_2_text = '玩家二得分: %s' % score_2
text_1 = font.render(score_1_text, True, (0, 0, 255))
text_2 = font.render(score_2_text, True, (255, 0, 0))
screen.blit(text_1, (2, 5))
screen.blit(text_2, (2, 35))
pygame.display.update()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('飞机大战 —— 九歌')
num_player = StartInterface(screen, cfg)
GamingInterface(num_player=1, screen=screen)
EndInterface(screen, cfg)
GamingInterface(num_player=2, screen=screen)
EndInterface(screen, cfg)
if __name__ == '__main__':
5. Den Hamster schlagen
Quellcode-Sharing:
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('打地鼠 —— 九歌')
pygame.mixer.music.load(cfg.BGM_PATH)
pygame.mixer.music.play(-1)
'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
font = pygame.font.Font(cfg.FONT_PATH, 40)
bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
hole_pos = random.choice(cfg.HOLE_POSITIONS)
change_hole_event = pygame.USEREVENT
pygame.time.set_timer(change_hole_event, 800)
mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
clock = pygame.time.Clock()
init_time = pygame.time.get_ticks()
time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
# --游戏时间减少, 地鼠变位置速度变快
if time_remain == 40 and not flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 650)
elif time_remain == 20 and flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 500)
if time_remain == 10:
audios['count_down'].play()
if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEMOTION:
hammer.setPosition(pygame.mouse.get_pos())
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
hammer.setHammering()
elif event.type == change_hole_event:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
if hammer.is_hammering and not mole.is_hammer:
is_hammer = pygame.sprite.collide_mask(hammer, mole)
if is_hammer:
audios['hammering'].play()
mole.setBeHammered()
your_score += 10
your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
# --绑定必要的游戏元素到屏幕(注意顺序)
screen.blit(bg_img, (0, 0))
screen.blit(count_down_text, (875, 8))
screen.blit(your_score_text, (800, 430))
mole.draw(screen)
hammer.draw(screen)
pygame.display.flip()
# 读取最佳分数(try块避免第一次游戏无.rec文件)
best_score = int(open(cfg.RECORD_PATH).read())
if your_score > best_score:
f = open(cfg.RECORD_PATH, 'w')
f.write(str(your_score))
score_info = {
'your_score': your_score, 'best_score': best_score}
is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
if __name__ == '__main__':
is_restart = main()
if not is_restart:
einfach
6. Kleine Dinosaurier
Wie man spielt: Steuern Sie nach oben und unten, um ein Springen zu vermeiden
Quellcode-Sharing:
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('九歌')
for key, value in cfg.AUDIO_PATHS.items():
sounds[key] = pygame.mixer.Sound(value)
GameStartInterface(screen, sounds, cfg)
score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)
highest_score = highest_score
highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)
dino = Dinosaur(cfg.IMAGE_PATHS['dino'])
ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))
cloud_sprites_group = pygame.sprite.Group()
cactus_sprites_group = pygame.sprite.Group()
ptera_sprites_group = pygame.sprite.Group()
add_obstacle_timer = 0
clock = pygame.time.Clock()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
dino.jump(sounds)
elif event.key == pygame.K_DOWN:
dino.duck()
elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:
dino.unduck()
screen.fill(cfg.BACKGROUND_COLOR)
if len(cloud_sprites_group) < 5 and random.randrange(0, 300) == 10:
cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'], position=(cfg.SCREENSIZE[0], random.randrange(30, 75))))
add_obstacle_timer += 1
if add_obstacle_timer > random.randrange(50, 150):
add_obstacle_timer = 0
random_value = random.randrange(0, 10)
if random_value >= 5 and random_value <= 7:
cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))
position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]
ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))
cloud_sprites_group.update()
cactus_sprites_group.update()
ptera_sprites_group.update()
if score_timer > (cfg.FPS//12):
score_timer = 0
score = min(score, 99999)
if score > highest_score:
highest_score = score
if score % 100 == 0:
sounds['point'].play()
if score % 1000 == 0:
ground.speed -= 1
for item in cloud_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
item.speed -= 1
for item in ptera_sprites_group:
item.speed -= 1
for item in cactus_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
for item in ptera_sprites_group:
if pygame.sprite.collide_mask(dino, item):
dino.die(sounds)
dino.draw(screen)
ground.draw(screen)
cloud_sprites_group.draw(screen)
cactus_sprites_group.draw(screen)
ptera_sprites_group.draw(screen)
score_board.set(score)
highest_score_board.set(highest_score)
score_board.draw(screen)
highest_score_board.draw(screen)
pygame.display.update()
clock.tick(cfg.FPS)
return GameEndInterface(screen, cfg), highest_score
if __name__ == '__main__':
flag, highest_score = main(highest_score)
if not flag: break
7. Xiao Xiaole
Spielanleitung: Drei verbunden, um zu eliminieren
Quellcode-Sharing:
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Gemgem —— 九歌')
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)
sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
for i in range(1, 8):
gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
game = gemGame(screen, sounds, font, gem_imgs, cfg)
score = game.start()
# 一轮游戏结束后玩家选择重玩或者退出
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
screen.fill((135, 206, 235))
text0 = 'Final score: %s' % score
text1 = 'Press <R> to restart the game.'
text2 = 'Press <Esc> to quit the game.'
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)
rect.left, rect.top = (126.5, y)
screen.blit(text_render, rect)
pygame.display.update()
if __name__ == '__main__':
8. Tetris
Wie man spielt: Der Kindheitsklassiker, der normale Modus ist langweilig, wir haben alle beschleunigt gespielt, als wir jung waren.
Quellcode-Sharing:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class TetrisGame(QMainWindow):
def __init__(self, parent=None):
super(TetrisGame, self).__init__(parent)
self.is_paused = False
self.is_started = False
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
self.grid_size = 22
self.timer = QBasicTimer()
self.setFocusPolicy(Qt.StrongFocus)
layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
self.status_bar = self.statusBar()
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
self.setWindowTitle('Tetris —— 九歌')
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
def updateWindow(self):
self.external_board.updateData()
self.side_panel.updateData()
if self.is_started:
self.is_started = True
self.inner_board.createNewTetris()
self.timer.start(self.fps, self)
if not self.is_started:
self.is_paused = not self.is_paused
if self.is_paused:
self.timer.stop()
self.external_board.score_signal.emit('Paused')
self.timer.start(self.fps, self)
self.updateWindow()
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
removed_lines = self.inner_board.moveDown()
self.external_board.score += removed_lines
self.updateWindow()
super(TetrisGame, self).timerEvent(event)
def keyPressEvent(self, event):
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
super(TetrisGame, self).keyPressEvent(event)
key = event.key()
if key == Qt.Key_P:
if self.is_paused:
elif key == Qt.Key_Left:
self.inner_board.moveLeft()
elif key == Qt.Key_Right:
self.inner_board.moveRight()
elif key == Qt.Key_Up:
self.inner_board.rotateAnticlockwise()
elif key == Qt.Key_Space:
self.external_board.score += self.inner_board.dropDown()
super(TetrisGame, self).keyPressEvent(event)
self.updateWindow()
if __name__ == '__main__':
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())
9. Schlange
Wie man spielt: Es ist ein Klassiker in der Kindheit, gewöhnliche Magie ist nicht interessant und wird auch beim Spielen in der Kindheit beschleunigt.
Quellcode-Sharing:
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('Greedy Snake —— 九歌')
clock = pygame.time.Clock()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1)
apple = Apple(cfg, snake.coords)
screen.fill(cfg.BLACK)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
snake.setDirection({
pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
if snake.update(apple):
apple = Apple(cfg, snake.coords)
if snake.isgameover: break
drawGameGrid(cfg, screen)
snake.draw(screen)
apple.draw(screen)
showScore(cfg, score, screen)
pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)
if __name__ == '__main__':
if not main(cfg):
gewöhnliche
10. 24 Uhr Minispiele
Spielanleitung: Durch Addition, Subtraktion, Multiplikation und Division kommen Grundschüler gut zurecht.
Quellcode-Sharing:
from fractions import Fraction
def checkClicked(group, mouse_pos, group_type='NUMBER'):
if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
max_selected = 2 if group_type == GROUPTYPES[0] else 1
for each in group:
num_selected += int(each.is_selected)
for each in group:
if each.rect.collidepoint(mouse_pos):
if each.is_selected:
each.is_selected = not each.is_selected
num_selected -= 1
each.select_order = None
if num_selected < max_selected:
each.is_selected = not each.is_selected
num_selected += 1
each.select_order = str(num_selected)
if each.is_selected:
selected.append(each.attribute)
elif group_type == GROUPTYPES[2]:
for each in group:
if each.rect.collidepoint(mouse_pos):
each.is_selected = True
selected.append(each.attribute)
raise ValueError('checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
def getNumberSpritesGroup(numbers):
number_sprites_group = pygame.sprite.Group()
for idx, number in enumerate(numbers):
args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
number_sprites_group.add(Card(*args))
return number_sprites_group
def getOperatorSpritesGroup(operators):
operator_sprites_group = pygame.sprite.Group()
for idx, operator in enumerate(operators):
args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
operator_sprites_group.add(Card(*args))
return operator_sprites_group
def getButtonSpritesGroup(buttons):
button_sprites_group = pygame.sprite.Group()
for idx, button in enumerate(buttons):
args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
button_sprites_group.add(Button(*args))
return button_sprites_group
def calculate(number1, number2, operator):
operator_map = {
'+': '+', '-': '-', '×': '*', '÷': '/'}
result = str(eval(number1+operator_map[operator]+number2))
return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2))
def showInfo(text, screen):
rect = pygame.Rect(200, 180, 400, 200)
pygame.draw.rect(screen, PAPAYAWHIP, rect)
font = pygame.font.Font(FONTPATH, 40)
text_render = font.render(text, True, BLACK)
font_size = font.size(text)
screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption('24 point —— 九歌')
win_sound = pygame.mixer.Sound(AUDIOWINPATH)
lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
pygame.mixer.music.load(BGMPATH)
pygame.mixer.music.play(-1, 0.0)
game24_gen = game24Generator()
game24_gen.generate()
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
button_sprites_group = getButtonSpritesGroup(BUTTONS)
clock = pygame.time.Clock()
selected_numbers = []
selected_operators = []
selected_buttons = []
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
elif event.type == pygame.MOUSEBUTTONUP:
mouse_pos = pygame.mouse.get_pos()
selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
screen.fill(AZURE)
if len(selected_numbers) == 2 and len(selected_operators) == 1:
noselected_numbers = []
for each in number_sprites_group:
if each.is_selected:
if each.select_order == '1':
selected_number1 = each.attribute
elif each.select_order == '2':
selected_number2 = each.attribute
else:
raise ValueError('Unknow select_order %s, expect 1 or 2...' % each.select_order)
noselected_numbers.append(each.attribute)
each.is_selected = False
for each in operator_sprites_group:
each.is_selected = False
result = calculate(selected_number1, selected_number2, *selected_operators)
if result is not None:
game24_gen.numbers_now = noselected_numbers + [result]
is_win = game24_gen.check()
if is_win:
win_sound.play()
if not is_win and len(game24_gen.numbers_now) == 1:
lose_sound.play()
warn_sound.play()
selected_numbers = []
selected_operators = []
number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
for each in number_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in operator_sprites_group:
each.draw(screen, pygame.mouse.get_pos())
for each in button_sprites_group:
if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
is_win = False
if selected_buttons and each.attribute == selected_buttons[0]:
each.is_selected = False
number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
selected_buttons = []
each.draw(screen, pygame.mouse.get_pos())
showInfo('Congratulations', screen)
if not is_win and len(game24_gen.numbers_now) == 1:
showInfo('Game Over', screen)
pygame.display.flip()
if __name__ == '__main__':
11. Schwebebalken
Spielanleitung: Auch aus meiner Kindheit ein klassisches Spiel, man kann es links und rechts steuern, später wird es etwas schwieriger.
Quellcode-Sharing:
from modules import breakoutClone
game = breakoutClone(cfg)
if __name__ == '__main__':
[ Es gibt auch Konfigurationsdateien ]
12. Alien-Invasion
Spielweise: Das erinnert mich an den Boss des ersten Levels von Contra, der etwas ähnlich ist, aber der Schwierigkeitsgrad von Contra ist definitiv höher.
Quellcode-Sharing:
clock = pygame.time.Clock()
font = pygame.font.SysFont('arial', 18)
if not os.path.isfile('score'):
f = open('score', 'w')
with open('score', 'r') as f:
highest_score = int(f.read().strip())
enemies_group = pygame.sprite.Group()
enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
enemy.rect.x = 85 + (i % 11) * 50
enemy.rect.y = 120 + (i // 11) * 45
enemies_group.add(enemy)
boomed_enemies_group = pygame.sprite.Group()
en_bullets_group = pygame.sprite.Group()
ufo = ufoSprite(color=cfg.RED)
myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
my_bullets_group = pygame.sprite.Group()
enemy_move_count = 24
enemy_move_interval = 24
enemy_move_flag = False
# --改变移动方向(改变方向的同时集体下降一次)
enemy_change_direction_count = 0
enemy_change_direction_interval = 60
enemy_need_down = False
enemy_move_right = True
enemy_need_move_row = 6
enemy_shot_interval = 100
enemy_shot_flag = False
screen.fill(cfg.BLACK)
for event in pygame.event.get():
# --点右上角的X或者按Esc键退出游戏
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
my_bullet = myaircraft.shot()
if my_bullet:
my_bullets_group.add(my_bullet)
# --我方子弹与敌方/UFO碰撞检测
for enemy in enemies_group:
if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):
boomed_enemies_group.add(enemy)
enemies_group.remove(enemy)
myaircraft.score += enemy.reward
if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):
ufo.is_dead = True
myaircraft.score += ufo.reward
enemy_shot_count += 1
if enemy_shot_count > enemy_shot_interval:
enemy_shot_flag = True
enemies_survive_list = [enemy.number for enemy in enemies_group]
shot_number = random.choice(enemies_survive_list)
enemy_shot_count = 0
enemy_move_count += 1
if enemy_move_count > enemy_move_interval:
enemy_move_count = 0
enemy_move_flag = True
enemy_need_move_row -= 1
if enemy_need_move_row == 0:
enemy_need_move_row = enemy_max_row
enemy_change_direction_count += 1
if enemy_change_direction_count > enemy_change_direction_interval:
enemy_change_direction_count = 1
enemy_move_right = not enemy_move_right
enemy_need_down = True
# ----每次下降提高移动和射击速度
enemy_move_interval = max(15, enemy_move_interval-3)
enemy_shot_interval = max(50, enemy_move_interval-10)
for enemy in enemies_group:
if enemy_shot_flag:
if enemy.number == shot_number:
en_bullet = enemy.shot()
en_bullets_group.add(en_bullet)
if enemy_move_flag:
if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):
if enemy_move_right:
enemy.update('right', cfg.SCREENSIZE[1])
else:
enemy.update('left', cfg.SCREENSIZE[1])
enemy.update(None, cfg.SCREENSIZE[1])
if enemy_need_down:
if enemy.update('down', cfg.SCREENSIZE[1]):
running = False
is_win = False
enemy.change_count -= 1
enemy.draw(screen)
enemy_move_flag = False
enemy_need_down = False
enemy_shot_flag = False
for boomed_enemy in boomed_enemies_group:
if boomed_enemy.boom(screen):
boomed_enemies_group.remove(boomed_enemy)
del boomed_enemy
# --敌方子弹与我方飞船碰撞检测
if not myaircraft.one_dead:
if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):
myaircraft.one_dead = True
if myaircraft.one_dead:
if myaircraft.boom(screen):
myaircraft.resetBoom()
myaircraft.num_life -= 1
if myaircraft.num_life < 1:
running = False
is_win = False
myaircraft.update(cfg.SCREENSIZE[0])
myaircraft.draw(screen)
if (not ufo.has_boomed) and (ufo.is_dead):
if ufo.boom(screen):
ufo.has_boomed = True
ufo.update(cfg.SCREENSIZE[0])
ufo.draw(screen)
for bullet in my_bullets_group:
if bullet.update():
my_bullets_group.remove(bullet)
del bullet
bullet.draw(screen)
for bullet in en_bullets_group:
if bullet.update(cfg.SCREENSIZE[1]):
en_bullets_group.remove(bullet)
del bullet
bullet.draw(screen)
if myaircraft.score > highest_score:
highest_score = myaircraft.score
# --得分每增加2000我方飞船增加一条生命
if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):
myaircraft.old_score = myaircraft.score
myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)
if len(enemies_group) < 1:
is_win = True
running = False
showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)
showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)
showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)
showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)
showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)
showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)
showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)
showLife(screen, myaircraft.num_life, cfg.GREEN)
pygame.display.update()
clock.tick(cfg.FPS)
with open('score', 'w') as f:
f.write(str(highest_score))
pygame.display.set_caption('外星人入侵 —— 九歌')
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
is_win = startGame(screen)
endInterface(screen, cfg.BLACK, is_win)
if __name__ == '__main__':
13. Gieriger Vogel
Spielweise: Es ist diesem Bomber ein bisschen ähnlich und es ist kein großes Problem, die Position zu kontrollieren.
14. Tic-Tac-Toe 888
Wie man spielt: Ich wette, jeder muss das im Unterricht gespielt haben. Als ich damals daran dachte, es mit demselben Tisch zu spielen, habe ich mehrere Bücher verschwendet.
Quellcode-Sharing
import tkinter.messagebox as msg
root.title('TIC-TAC-TOE---Project Gurukul')
Label(root, text="player1 : X", font="times 15").grid(row=0, column=1)
Label(root, text="player2 : O", font="times 15").grid(row=0, column=2)
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# for player1 sign = X and for player2 sign= Y
# counting the no. of click
return ((panels[1] == panels[2] == panels[3] == sign)
or (panels[1] == panels[4] == panels[7] == sign)
or (panels[1] == panels[5] == panels[9] == sign)
or (panels[2] == panels[5] == panels[8] == sign)
or (panels[3] == panels[6] == panels[9] == sign)
or (panels[3] == panels[5] == panels[7] == sign)
or (panels[4] == panels[5] == panels[6] == sign)
or (panels[7] == panels[8] == panels[9] == sign))
global count, mark, digits
# Check which button clicked
if digit == 1 and digit in digits:
digits.remove(digit)
##player1 will play if the value of count is even and for odd player2 will play
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button1.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 2 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button2.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 3 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button3.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 4 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button4.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 5 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button5.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 6 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button6.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 7 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button7.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 8 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button8.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
if digit == 9 and digit in digits:
digits.remove(digit)
if count % 2 == 0:
panels[digit] = mark
elif count % 2 != 0:
panels[digit] = mark
button9.config(text=mark)
count = count + 1
if (win(panels, sign) and sign == 'X'):
msg.showinfo("Result", "Player1 wins")
root.destroy()
elif (win(panels, sign) and sign == 'O'):
msg.showinfo("Result", "Player2 wins")
root.destroy()
###if count is greater then 8 then the match has been tied
if (count > 8 and win(panels, 'X') == False and win(panels, 'O') == False):
msg.showinfo("Result", "Match Tied")
button1 = Button(root, width=15, font=('Times 16 bold'), height=7, command=lambda: checker(1))
button1.grid(row=1, column=1)
button2 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(2))
button2.grid(row=1, column=2)
button3 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(3))
button3.grid(row=1, column=3)
button4 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(4))
button4.grid(row=2, column=1)
button5 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(5))
button5.grid(row=2, column=2)
button6 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(6))
button6.grid(row=2, column=3)
button7 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(7))
button7.grid(row=3, column=1)
button8 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(8))
button8.grid(row=3, column=2)
button9 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(9))
button9.grid(row=3, column=3)
Etwas schwierig
15. Bombermann
Wie man spielt: Ein weiteres klassisches Spiel in meiner Kindheit, ich wurde als Kind viele Male von mir selbst zu Tode bombardiert.
16. Verteidige den Wald
Wie man spielt: Ähnlich wie beim Verteidigen von Karotten und Tower-Defense-Spielen muss das Layout unter Berücksichtigung des Reichweitenattributs usw. angemessen sein.
17. Backgammon
Ausführliche Erklärung, wie man spielt: Ich habe es geliebt, als ich ein Kind war. Es gibt einen Weg, um zu gewinnen, wenn man zuerst spielt. Später wissen Sie, dass es eine Regel zum Sperren von Händen geben wird, die komplizierter ist. Sie können es lernen über die Eröffnung, die zuerst gewinnt. Mond, Wanderstern, Komet usw.
18. Iss Erbsen
Ausführliche Erklärung zum Spielablauf: Testen Sie die Handgeschwindigkeit und -bedienung und das Gehen. Ich spiele diese Art des Herumrennens nicht gern.
19. Panzerschlacht
Ausführliche Erklärung zur Spielweise: Dies ist ein Klassiker unter den Klassikern. Ich spiele gerne den Zwei-Spieler-Modus. Es gibt einige überarbeitete Modi im Hintergrund. Dies ist eines der wenigen Spiele, die ich für veraltet halte.
20. Super-Mario
Ausführliche Erklärung zum Spielen: Die Klassiker in den Klassikern, es war schwierig zu spielen, als ich ein Kind war, und die Bedienung muss nicht eingeführt werden.
21. Obst-Ninja
Wie man spielt: Das Spiel Obst schneiden ist der letzte Schrei. Ich weiß nicht, warum es immer mit einem Messer explodiert. Es ist ein sehr dekomprimierendes Spiel.
extrem schwierig
22. Flugzeugkriege
Raiders Daquan: Die Spiele, die hier beginnen, sind wirklich schwierig, dieser Flugzeugkrieg ist immer noch etwas schlimmer als die Kinderspiele.
23. 2048
Raiders Daquan: Es war einmal der letzte Schrei. Je weiter man nach hinten geht, desto schwieriger wird es. Beim Synthetisieren muss man eine große Zahl in die Ecke stellen.
24. Sokoban
Raiders Daquan: Das Spiel, das früher auf dem Handy verfügbar war, ist umso schwieriger, auf die hintere Ebene zu drängen, ich scheine nach mehr als 20 Leveln nicht mehr spielen zu können.
25. Turmverteidigung
Raiders Daquan: Eine andere Art von Tower-Defense-Spiel, ein bisschen interessant, das heißt, die Geschwindigkeit ist zu schnell, um zu reagieren.
26. Pflanzen gegen Zombies
Raiders Daquan: Der Klassiker von Plants vs. Zombies, die Bedienung muss nicht vorgestellt werden, aber Sie können es selbst spielen und sehen.
27. Minensuchboot
Detaillierte Erklärung, wie man spielt: Minesweeper ist ziemlich interessant, spielt Fähigkeiten und testet Argumentation
ultimative Herausforderung
28. Rätsel
Spielerlebnis: Drei ultimative Herausforderungen, auch wenn man eine meistern kann, das Rätsel nervt mich am meisten, zu schwer.
29. Gehen Sie durch das Labyrinth
Spielerfahrung: Ich bin sowieso nicht ausgegangen, könnt ihr alle ausgehen?
30. Das stärkste Spiel
Spielerlebnis: zu schwer zu kontrollieren. .