1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        13個Python小游戲(含源碼),開始敲起來,玩吧!

        共 37228字,需瀏覽 75分鐘

         ·

        2022-02-22 07:38


        來源丨網(wǎng)絡(luò)

        經(jīng)常聽到有朋友說,學(xué)習(xí)編程是一件非??菰餆o味的事情。其實,大家有沒有認(rèn)真想過,可能是我們的學(xué)習(xí)方法不對?
        比方說,你有沒有想過,可以通過打游戲來學(xué)編程?
        今天我想跟大家分享幾個Python小游戲,教你如何通過邊打游戲邊學(xué)編程

        1、吃金幣

        源碼分享:

        import?os
        import?cfg
        import?sys
        import?pygame
        import?random
        from?modules?import?*
        ?
        ?
        '''游戲初始化'''
        def?initGame():
        ????#?初始化pygame,?設(shè)置展示窗口
        ????pygame.init()
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('catch?coins?——?九歌')
        ????#?加載必要的游戲素材
        ????game_images?=?{}
        ????for?key,?value?in?cfg.IMAGE_PATHS.items():
        ????????if?isinstance(value,?list):
        ????????????images?=?[]
        ????????????for?item?in?value:?images.append(pygame.image.load(item))
        ????????????game_images[key]?=?images
        ????????else:
        ????????????game_images[key]?=?pygame.image.load(value)
        ????game_sounds?=?{}
        ????for?key,?value?in?cfg.AUDIO_PATHS.items():
        ????????if?key?==?'bgm':?continue
        ????????game_sounds[key]?=?pygame.mixer.Sound(value)
        ????#?返回初始化數(shù)據(jù)
        ????return?screen,?game_images,?game_sounds
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????#?初始化
        ????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?=?Hero(game_images['hero'],?position=(375,?520))
        ????#?定義食物組
        ????food_sprites_group?=?pygame.sprite.Group()
        ????generate_food_freq?=?random.randint(10,?20)
        ????generate_food_count?=?0
        ????#?當(dāng)前分?jǐn)?shù)/歷史最高分
        ????score?=?0
        ????highest_score?=?0?if?not?os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH)?else?int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
        ????#?游戲主循環(huán)
        ????clock?=?pygame.time.Clock()
        ????while?True:
        ????????#?--填充背景
        ????????screen.fill(0)
        ????????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')
        ????????#?--隨機(jī)生成食物
        ????????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
        ????????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)
        ????????#?--判斷游戲是否結(jié)束
        ????????if?pygame.time.get_ticks()?>=?90000:
        ????????????break
        ????????#?--更新屏幕
        ????????pygame.display.flip()
        ????????clock.tick(cfg.FPS)
        ????#?游戲結(jié)束,?記錄最高分并顯示游戲結(jié)束畫面
        ????fp?=?open(cfg.HIGHEST_SCORE_RECORD_FILEPATH,?'w')
        ????fp.write(str(highest_score))
        ????fp.close()
        ????return?showEndGameInterface(screen,?cfg,?score,?highest_score)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????while?main():
        ????????pass

        2、打乒乓

        源碼分享:

        ?
        import?sys
        import?cfg
        import?pygame
        from?modules?import?*
        ?
        ?
        '''定義按鈕'''
        def?Button(screen,?position,?text,?button_size=(200,?50)):
        ????left,?top?=?position
        ????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))
        ?
        ?
        '''
        Function:
        ????開始界面
        Input:
        ????--screen:?游戲界面
        Return:
        ????--game_mode:?1(單人模式)/2(雙人模式)
        '
        ''
        def?startInterface(screen):
        ????clock?=?pygame.time.Clock()
        ????while?True:
        ????????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
        ????????clock.tick(10)
        ????????pygame.display.update()
        ?
        ?
        '''結(jié)束界面'''
        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]]
        ????while?True:
        ????????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)
        ????????clock.tick(10)
        ????????pygame.display.update()
        ?
        ?
        '''運行游戲Demo'''
        def?runDemo(screen):
        ????#?加載游戲素材
        ????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)
        ????#?游戲主循環(huán)
        ????#?--左邊球拍(ws控制,?僅雙人模式時可控制)
        ????score_left?=?0
        ????racket_left?=?Racket(cfg.RACKETPICPATH,?'LEFT',?cfg)
        ????#?--右邊球拍(↑↓控制)
        ????score_right?=?0
        ????racket_right?=?Racket(cfg.RACKETPICPATH,?'RIGHT',?cfg)
        ????#?--球
        ????ball?=?Ball(cfg.BALLPICPATH,?cfg)
        ????clock?=?pygame.time.Clock()
        ????while?True:
        ????????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')
        ????????else:
        ????????????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
        ????????clock.tick(100)
        ????????pygame.display.update()
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????#?初始化
        ????pygame.init()
        ????pygame.mixer.init()
        ????screen?=?pygame.display.set_mode((cfg.WIDTH,?cfg.HEIGHT))
        ????pygame.display.set_caption('pingpong?——?九歌')
        ????#?開始游戲
        ????while?True:
        ????????score_left,?score_right?=?runDemo(screen)
        ????????endInterface(screen,?score_left,?score_right)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????main()

        3、滑雪

        源碼分享:

        ?
        import?sys
        import?cfg
        import?pygame
        import?random
        ?
        ?
        '''滑雪者類'''
        class?SkierClass(pygame.sprite.Sprite):
        ????def?__init__(self):
        ????????pygame.sprite.Sprite.__init__(self)
        ????????#?滑雪者的朝向(-2到2)
        ????????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]
        ????'''改變滑雪者的朝向.?負(fù)數(shù)為向左,正數(shù)為向右,0為向前'''
        ????def?turn(self,?num):
        ????????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
        ????'''移動滑雪者'''
        ????def?move(self):
        ????????self.rect.centerx?+=?self.speed[0]
        ????????self.rect.centerx?=?max(20,?self.rect.centerx)
        ????????self.rect.centerx?=?min(620,?self.rect.centerx)
        ????'''設(shè)置為摔倒?fàn)顟B(tài)'''
        ????def?setFall(self):
        ????????self.image?=?pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
        ????'''設(shè)置為站立狀態(tài)'''
        ????def?setForward(self):
        ????????self.direction?=?0
        ????????self.image?=?pygame.image.load(self.imagepaths[self.direction])
        ?
        ?
        '''
        Function:
        ????障礙物類
        Input:
        ????img_path:?障礙物圖片路徑
        ????location:?障礙物位置
        ????attribute:?障礙物類別屬性
        '
        ''
        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
        ????'''移動'''
        ????def?move(self,?num):
        ????????self.rect.centery?=?self.location[1]?-?num
        ?
        ?
        '''創(chuàng)建障礙物'''
        def?createObstacles(s,?e,?num=10):
        ????obstacles?=?pygame.sprite.Group()
        ????locations?=?[]
        ????for?i?in?range(num):
        ????????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)
        ????return?obstacles
        ?
        ?
        '''合并障礙物'''
        def?AddObstacles(obstacles0,?obstacles1):
        ????obstacles?=?pygame.sprite.Group()
        ????for?obstacle?in?obstacles0:
        ????????obstacles.add(obstacle)
        ????for?obstacle?in?obstacles1:
        ????????obstacles.add(obstacle)
        ????return?obstacles
        ?
        ?
        '''顯示游戲開始界面'''
        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)
        ????while?True:
        ????????for?event?in?pygame.event.get():
        ????????????if?event.type?==?pygame.QUIT:
        ????????????????pygame.quit()
        ????????????????sys.exit()
        ????????????elif?event.type?==?pygame.KEYDOWN:
        ????????????????return
        ????????pygame.display.update()
        ?
        ?
        '''顯示分?jǐn)?shù)'''
        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)
        ?
        ?
        '''更新當(dāng)前幀的游戲畫面'''
        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()
        ?
        ?
        '''主程序'''
        def?main():
        ????#?游戲初始化
        ????pygame.init()
        ????pygame.mixer.init()
        ????pygame.mixer.music.load(cfg.BGMPATH)
        ????pygame.mixer.music.set_volume(0.4)
        ????pygame.mixer.music.play(-1)
        ????#?設(shè)置屏幕
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('滑雪游戲?——?九歌')
        ????#?游戲開始界面
        ????ShowStartInterface(screen,?cfg.SCREENSIZE)
        ????#?實例化游戲精靈
        ????#?--滑雪者
        ????skier?=?SkierClass()
        ????#?--創(chuàng)建障礙物
        ????obstacles0?=?createObstacles(20,?29)
        ????obstacles1?=?createObstacles(10,?19)
        ????obstaclesflag?=?0
        ????obstacles?=?AddObstacles(obstacles0,?obstacles1)
        ????#?游戲clock
        ????clock?=?pygame.time.Clock()
        ????#?記錄滑雪的距離
        ????distance?=?0
        ????#?記錄當(dāng)前的分?jǐn)?shù)
        ????score?=?0
        ????#?記錄當(dāng)前的速度
        ????speed?=?[0,?6]
        ????#?游戲主循環(huán)
        ????while?True:
        ????????#?--事件捕獲
        ????????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)
        ????????#?--更新當(dāng)前游戲幀的數(shù)據(jù)
        ????????skier.move()
        ????????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)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ??? main();

        4、并夕夕版飛機(jī)大戰(zhàn)

        源碼分享:

        ?
        import?sys
        import?cfg
        import?pygame
        from?modules?import?*
        ?
        ?
        '''游戲界面'''
        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_move_dis?=?0
        ????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()
        ????#?產(chǎn)生小行星的時間間隔
        ????asteroid_ticks?=?90
        ????for?i?in?range(num_player):
        ????????player_group.add(Ship(i+1,?cfg))
        ????clock?=?pygame.time.Clock()
        ????#?分?jǐn)?shù)
        ????score_1,?score_2?=?0,?0
        ????#?游戲主循環(huán)
        ????while?True:
        ????????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?idx?==?0:
        ????????????????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)?????????????background?=?bg_1
        ????????elif?(score_1?+?score_2)?????????????background?=?bg_2
        ????????else:
        ????????????background?=?bg_3
        ????????#?--向下移動背景圖實現(xiàn)飛船向上移動的效果
        ????????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))
        ????????else:
        ????????????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
        ????????????????else:
        ????????????????????player.explode(screen)
        ????????????else:
        ????????????????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
        ????????????????else:
        ????????????????????score_2?+=?1
        ????????????else:
        ????????????????bullet.draw(screen)
        ????????#?--畫小行星
        ????????for?asteroid?in?asteroid_group:
        ????????????asteroid.move()
        ????????????asteroid.rotate()
        ????????????asteroid.draw(screen)
        ????????#?--顯示分?jǐn)?shù)
        ????????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()
        ????????clock.tick(60)
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????pygame.init()
        ????pygame.font.init()
        ????pygame.mixer.init()
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('飛機(jī)大戰(zhàn)?——?九歌')
        ????num_player?=?StartInterface(screen,?cfg)
        ????if?num_player?==?1:
        ????????while?True:
        ????????????GamingInterface(num_player=1,?screen=screen)
        ????????????EndInterface(screen,?cfg)
        ????else:
        ????????while?True:
        ????????????GamingInterface(num_player=2,?screen=screen)
        ????????????EndInterface(screen,?cfg)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????main()

        5、打地鼠


        源碼分享:

        ?
        import?cfg
        import?sys
        import?pygame
        import?random
        from?modules?import?*
        ?
        ?
        '''游戲初始化'''
        def?initGame():
        ????pygame.init()
        ????pygame.mixer.init()
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('打地鼠?——?九歌')
        ????return?screen
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????#?初始化
        ????screen?=?initGame()
        ????#?加載背景音樂和其他音效
        ????pygame.mixer.music.load(cfg.BGM_PATH)
        ????pygame.mixer.music.play(-1)
        ????audios?=?{
        ????????'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()
        ????#?分?jǐn)?shù)
        ????your_score?=?0
        ????flag?=?False
        ????#?初始時間
        ????init_time?=?pygame.time.get_ticks()
        ????#?游戲主循環(huán)
        ????while?True:
        ????????#?--游戲時間為60s
        ????????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.reset()
        ????????????mole.setPosition(hole_pos)
        ????????????pygame.time.set_timer(change_hole_event,?650)
        ????????????flag?=?True
        ????????elif?time_remain?==?20?and?flag:
        ????????????hole_pos?=?random.choice(cfg.HOLE_POSITIONS)
        ????????????mole.reset()
        ????????????mole.setPosition(hole_pos)
        ????????????pygame.time.set_timer(change_hole_event,?500)
        ????????????flag?=?False
        ????????#?--倒計時音效
        ????????if?time_remain?==?10:
        ????????????audios['count_down'].play()
        ????????#?--游戲結(jié)束
        ????????if?time_remain?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
        ????????#?--分?jǐn)?shù)
        ????????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()
        ????????clock.tick(60)
        ????#?讀取最佳分?jǐn)?shù)(try塊避免第一次游戲無.rec文件)
        ????try:
        ????????best_score?=?int(open(cfg.RECORD_PATH).read())
        ????except:
        ????????best_score?=?0
        ????#?若當(dāng)前分?jǐn)?shù)大于最佳分?jǐn)?shù)則更新最佳分?jǐn)?shù)
        ????if?your_score?>?best_score:
        ????????f?=?open(cfg.RECORD_PATH,?'w')
        ????????f.write(str(your_score))
        ????????f.close()
        ????#?結(jié)束界面
        ????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)
        ????return?is_restart
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????while?True:
        ????????is_restart?=?main()
        ????????if?not?is_restart:
        ????????????break

        6、小恐龍

        玩法:上下控制起跳躲避

        源碼分享:

        ?
        import?cfg
        import?sys
        import?random
        import?pygame
        from?modules?import?*
        ?
        ?
        '''main'''
        def?main(highest_score):
        ????#?游戲初始化
        ????pygame.init()
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('九歌')
        ????#?導(dǎo)入所有聲音文件
        ????sounds?=?{}
        ????for?key,?value?in?cfg.AUDIO_PATHS.items():
        ????????sounds[key]?=?pygame.mixer.Sound(value)
        ????#?游戲開始界面
        ????GameStartInterface(screen,?sounds,?cfg)
        ????#?定義一些游戲中必要的元素和變量
        ????score?=?0
        ????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
        ????score_timer?=?0
        ????#?游戲主循環(huán)
        ????clock?=?pygame.time.Clock()
        ????while?True:
        ????????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)
        ????????#?--隨機(jī)添加云
        ????????if?len(cloud_sprites_group)?????????????cloud_sprites_group.add(Cloud(cfg.IMAGE_PATHS['cloud'],?position=(cfg.SCREENSIZE[0],?random.randrange(30,?75))))
        ????????#?--隨機(jī)添加仙人掌/飛龍
        ????????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']))
        ????????????else:
        ????????????????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))))
        ????????#?--更新游戲元素
        ????????dino.update()
        ????????ground.update()
        ????????cloud_sprites_group.update()
        ????????cactus_sprites_group.update()
        ????????ptera_sprites_group.update()
        ????????score_timer?+=?1
        ????????if?score_timer?>?(cfg.FPS//12):
        ????????????score_timer?=?0
        ????????????score?+=?1
        ????????????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)
        ????????#?--游戲是否結(jié)束
        ????????if?dino.is_dead:
        ????????????break
        ????#?游戲結(jié)束界面
        ????return?GameEndInterface(screen,?cfg),?highest_score
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????highest_score?=?0
        ????while?True:
        ????????flag,?highest_score?=?main(highest_score)
        ????????if?not?flag:?break

        7、消消樂

        玩法:三個相連就能消除

        源碼分享:

        ?
        import?os
        import?sys
        import?cfg
        import?pygame
        from?modules?import?*
        ?
        ?
        '''游戲主程序'''
        def?main():
        ????pygame.init()
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.display.set_caption('Gemgem?——?九歌')
        ????#?加載背景音樂
        ????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)
        ????#?加載音效
        ????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,?'resources/audios/match%s.wav'?%?i)))
        ????#?加載字體
        ????font?=?pygame.font.Font(os.path.join(cfg.ROOTDIR,?'resources/font/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))
        ????#?主循環(huán)
        ????game?=?gemGame(screen,?sounds,?font,?gem_imgs,?cfg)
        ????while?True:
        ????????score?=?game.start()
        ????????flag?=?False
        ????????#?一輪游戲結(jié)束后玩家選擇重玩或者退出
        ????????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.KEYUP?and?event.key?==?pygame.K_r:
        ????????????????????flag?=?True
        ????????????if?flag:
        ????????????????break
        ????????????screen.fill((135,?206,?235))
        ????????????text0?=?'Final?score:?%s'?%?score
        ????????????text1?=?'Press??to?restart?the?game.'
        ????????????text2?=?'Press??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()

        8、俄羅斯方塊

        玩法:童年經(jīng)典,普通模式?jīng)]啥意思,小時候我們都是玩加速的。

        源碼分享:

        ?
        import?os
        import?sys
        import?random
        from?modules?import?*
        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)
        ????????#?是否暫停ing
        ????????self.is_paused?=?False
        ????????#?是否開始ing
        ????????self.is_started?=?False
        ????????self.initUI()
        ????'''界面初始化'''
        ????def?initUI(self):
        ????????#?icon
        ????????self.setWindowIcon(QIcon(os.path.join(os.getcwd(),?'resources/icon.jpg')))
        ????????#?塊大小
        ????????self.grid_size?=?22
        ????????#?游戲幀率
        ????????self.fps?=?200
        ????????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.start()
        ????????self.center()
        ????????self.setWindowTitle('Tetris?——?九歌')
        ????????self.show()
        ????????self.setFixedSize(self.external_board.width()?+?self.side_panel.width(),?self.side_panel.height()?+?self.status_bar.height())
        ????'''游戲界面移動到屏幕中間'''
        ????def?center(self):
        ????????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()
        ????????self.update()
        ????'''開始'''
        ????def?start(self):
        ????????if?self.is_started:
        ????????????return
        ????????self.is_started?=?True
        ????????self.inner_board.createNewTetris()
        ????????self.timer.start(self.fps,?self)
        ????'''暫停/不暫停'''
        ????def?pause(self):
        ????????if?not?self.is_started:
        ????????????return
        ????????self.is_paused?=?not?self.is_paused
        ????????if?self.is_paused:
        ????????????self.timer.stop()
        ????????????self.external_board.score_signal.emit('Paused')
        ????????else:
        ????????????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()
        ????????else:
        ????????????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)
        ????????????return
        ????????key?=?event.key()
        ????????#?P鍵暫停
        ????????if?key?==?Qt.Key_P:
        ????????????self.pause()
        ????????????return
        ????????if?self.is_paused:
        ????????????return
        ????????#?向左
        ????????elif?key?==?Qt.Key_Left:
        ????????????self.inner_board.moveLeft()
        ????????#?向右
        ????????elif?key?==?Qt.Key_Right:
        ????????????self.inner_board.moveRight()
        ????????#?旋轉(zhuǎn)
        ????????elif?key?==?Qt.Key_Up:
        ????????????self.inner_board.rotateAnticlockwise()
        ????????#?快速墜落
        ????????elif?key?==?Qt.Key_Space:
        ????????????self.external_board.score?+=?self.inner_board.dropDown()
        ????????else:
        ????????????super(TetrisGame,?self).keyPressEvent(event)
        ????????self.updateWindow()
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????app?=?QApplication([])
        ????tetris?=?TetrisGame()
        ????sys.exit(app.exec_())

        9、貪吃蛇

        玩法:童年經(jīng)典,普通魔術(shù)也沒啥意思,小時候玩的也是加速的。

        源碼分享:

        ?
        import?cfg
        import?sys
        import?pygame
        from?modules?import?*
        ?
        ?
        '''主函數(shù)'''
        def?main(cfg):
        ????#?游戲初始化
        ????pygame.init()
        ????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)
        ????#?游戲主循環(huán)
        ????snake?=?Snake(cfg)
        ????apple?=?Apple(cfg,?snake.coords)
        ????score?=?0
        ????while?True:
        ????????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)
        ????????????score?+=?1
        ????????#?--判斷游戲是否結(jié)束
        ????????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)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????while?True:
        ????????if?not?main(cfg):
        ????????????break

        10、24點小游戲

        玩法:通過加減乘除操作,小學(xué)生都沒問題的。

        源碼分享:

        ?
        import?os
        import?sys
        import?pygame
        from?cfg?import?*
        from?modules?import?*
        from?fractions?import?Fraction
        ?
        ?
        '''檢查控件是否被點擊'''
        def?checkClicked(group,?mouse_pos,?group_type='NUMBER'):
        ????selected?=?[]
        ????#?數(shù)字卡片/運算符卡片
        ????if?group_type?==?GROUPTYPES[0]?or?group_type?==?GROUPTYPES[1]:
        ????????max_selected?=?2?if?group_type?==?GROUPTYPES[0]?else?1
        ????????num_selected?=?0
        ????????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
        ????????????????else:
        ????????????????????if?num_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)
        ????#?拋出異常
        ????else:
        ????????raise?ValueError('checkClicked.group_type?unsupport?%s,?expect?%s,?%s?or?%s...'?%?(group_type,?*GROUPTYPES))
        ????return?selected
        ?
        ?
        '''獲取數(shù)字精靈組'''
        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?=?{'+':?'+',?'-':?'-',?'×':?'*',?'÷':?'/'}
        ????try:
        ????????result?=?str(eval(number1+operator_map[operator]+number2))
        ????????return?result?if?'.'?not?in?result?else?str(Fraction(number1+operator_map[operator]+number2))
        ????except:
        ????????return?None
        ?
        ?
        '''在屏幕上顯示信息'''
        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))
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????#?初始化,?導(dǎo)入必要的游戲素材
        ????pygame.init()
        ????pygame.mixer.init()
        ????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)
        ????#?24點游戲生成器
        ????game24_gen?=?game24Generator()
        ????game24_gen.generate()
        ????#?精靈組
        ????#?--數(shù)字
        ????number_sprites_group?=?getNumberSpritesGroup(game24_gen.numbers_now)
        ????#?--運算符
        ????operator_sprites_group?=?getOperatorSpritesGroup(OPREATORS)
        ????#?--按鈕
        ????button_sprites_group?=?getButtonSpritesGroup(BUTTONS)
        ????#?游戲主循環(huán)
        ????clock?=?pygame.time.Clock()
        ????selected_numbers?=?[]
        ????selected_operators?=?[]
        ????selected_buttons?=?[]
        ????is_win?=?False
        ????while?True:
        ????????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)
        ????????#?更新數(shù)字
        ????????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)
        ????????????????else:
        ????????????????????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()
        ????????????else:
        ????????????????warn_sound.play()
        ????????????selected_numbers?=?[]
        ????????????selected_operators?=?[]
        ????????????number_sprites_group?=?getNumberSpritesGroup(game24_gen.numbers_now)
        ????????#?精靈都畫到screen上
        ????????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())
        ????????#?游戲勝利
        ????????if?is_win:
        ????????????showInfo('Congratulations',?screen)
        ????????#?游戲失敗
        ????????if?not?is_win?and?len(game24_gen.numbers_now)?==?1:
        ????????????showInfo('Game?Over',?screen)
        ????????pygame.display.flip()
        ????????clock.tick(30)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????main()

        11、平衡木

        玩法:也是小時候的經(jīng)典游戲,控制左右就行,到后面才有一點點難度。

        源碼分享:

        ?
        import?cfg
        from?modules?import?breakoutClone
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????game?=?breakoutClone(cfg)
        ????game.run()
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????main()

        12、外星人入侵

        玩法:這讓我想起了魂斗羅那第幾關(guān)的boss,有點類似,不過魂斗羅那個難度肯定高點。

        源碼分享:

        ?
        import?os
        import?sys
        import?cfg
        import?random
        import?pygame
        from?modules?import?*
        ?
        ?
        '''開始游戲'''
        def?startGame(screen):
        ????clock?=?pygame.time.Clock()
        ????#?加載字體
        ????font?=?pygame.font.SysFont('arial',?18)
        ????if?not?os.path.isfile('score'):
        ????????f?=?open('score',?'w')
        ????????f.write('0')
        ????????f.close()
        ????with?open('score',?'r')?as?f:
        ????????highest_score?=?int(f.read().strip())
        ????#?敵方
        ????enemies_group?=?pygame.sprite.Group()
        ????for?i?in?range(55):
        ????????if?i?????????????enemy?=?enemySprite('small',?i,?cfg.WHITE,?cfg.WHITE)
        ????????elif?i?????????????enemy?=?enemySprite('medium',?i,?cfg.WHITE,?cfg.WHITE)
        ????????else:
        ????????????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_max_row?=?5
        ????#?用于控制敵方發(fā)射子彈
        ????enemy_shot_interval?=?100
        ????enemy_shot_count?=?0
        ????enemy_shot_flag?=?False
        ????#?游戲進(jìn)行中
        ????running?=?True
        ????is_win?=?False
        ????#?主循環(huán)
        ????while?running:
        ????????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])
        ????????????else:
        ????????????????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?????????????????????running?=?False
        ????????????????????is_win?=?False
        ????????else:
        ????????????#?----更新飛船
        ????????????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
        ????????else:
        ????????????#?----更新UFO
        ????????????ufo.update(cfg.SCREENSIZE[0])
        ????????????#?----畫UFO
        ????????????ufo.draw(screen)
        ????????#?--畫我方飛船子彈
        ????????for?bullet?in?my_bullets_group:
        ????????????if?bullet.update():
        ????????????????my_bullets_group.remove(bullet)
        ????????????????del?bullet
        ????????????else:
        ????????????????bullet.draw(screen)
        ????????#?--畫敵方子彈
        ????????for?bullet?in?en_bullets_group:
        ????????????if?bullet.update(cfg.SCREENSIZE[1]):
        ????????????????en_bullets_group.remove(bullet)
        ????????????????del?bullet
        ????????????else:
        ????????????????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)?????????????is_win?=?True
        ????????????running?=?False
        ????????#?--顯示文字
        ????????#?----當(dāng)前得分
        ????????showText(screen,?'SCORE:?',?cfg.WHITE,?font,?200,?8)
        ????????showText(screen,?str(myaircraft.score),?cfg.WHITE,?font,?200,?24)
        ????????#?----敵人數(shù)量
        ????????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)
        ????????#?----FPS
        ????????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))
        ????return?is_win
        ?
        ?
        '''主函數(shù)'''
        def?main():
        ????#?初始化
        ????pygame.init()
        ????pygame.display.set_caption('外星人入侵?——?九歌')
        ????screen?=?pygame.display.set_mode(cfg.SCREENSIZE)
        ????pygame.mixer.init()
        ????pygame.mixer.music.load(cfg.BGMPATH)
        ????pygame.mixer.music.set_volume(0.4)
        ????pygame.mixer.music.play(-1)
        ????while?True:
        ????????is_win?=?startGame(screen)
        ????????endInterface(screen,?cfg.BLACK,?is_win)
        ?
        ?
        '''run'''
        if?__name__?==?'__main__':
        ????main()

        13、井字棋888

        玩法:我打賭大家在課堂上肯定玩過這個,想想當(dāng)年和同桌玩這個廢了好幾本本子。

        源碼分享

        from?tkinter?import?*
        import?tkinter.messagebox?as?msg
        ?
        root?=?Tk()
        root.title('TIC-TAC-TOE---Project?Gurukul')
        #?labels
        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
        mark?=?''
        ?
        #?counting?the?no.?of?click
        count?=?0
        ?
        panels?=?["panel"]?*?10
        ?
        ?
        def?win(panels,?sign):
        ????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))
        ?
        ?
        def?checker(digit):
        ????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button1.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button2.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button3.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button4.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button5.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button6.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button7.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button8.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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:
        ????????????mark?=?'X'
        ????????????panels[digit]?=?mark
        ????????elif?count?%?2?!=?0:
        ????????????mark?=?'O'
        ????????????panels[digit]?=?mark
        ?
        ????????button9.config(text=mark)
        ????????count?=?count?+?1
        ????????sign?=?mark
        ?
        ????????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")
        ????????root.destroy()
        ?
        ?
        ####define?buttons
        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)
        ?
        root.mainloop()

        (完)

        瀏覽 32
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            韩漫无遮韩漫免费网址肉 | 国产一区二区三区免费播放 | 成人三级AV在线 | 人人操人人插 | 91短视频在线观看视频 | 免费crm一区二区 | 涩涩视频在线 | 无码欧美日韩二区三区蜜桃 | 精品成人Av一区二区三区 | 亚洲狼人综合干视频 |