<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一口氣用Python寫了13個(gè)小游戲(附源碼)

          共 37291字,需瀏覽 75分鐘

           ·

          2022-03-04 01:22

          今天給大家分享13個(gè)游戲源碼,可以自己復(fù)現(xiàn)玩玩,研究下里面的編程邏輯,對(duì)學(xué)習(xí)編程(特別是初學(xué)者)應(yīng)該會(huì)有很大幫助。


          由于文章較長(zhǎng),大家記得滑到文末點(diǎn)個(gè)贊哈~

          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)

          ????

          ????#?加載必要的游戲素材
          ????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))
          ????????#?--倒計(jì)時(shí)信息
          ????????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)
          ????????#?--按鍵檢測(cè)
          ????????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)
          ????????#?--碰撞檢測(cè)
          ????????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()
          ?
          ?
          '''運(yùn)行游戲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控制,?僅雙人模式時(shí)可控制)
          ????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)
          ????????#?球運(yùn)動(dòng)
          ????????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
          ????'''移動(dòng)滑雪者'''
          ????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
          ????'''移動(dòng)'''
          ????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)
          ????#?實(shí)例化游戲精靈
          ????#?--滑雪者
          ????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)
          ????????#?--碰撞檢測(cè)
          ????????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)生小行星的時(shí)間間隔
          ????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
          ????????#?--向下移動(dòng)背景圖實(shí)現(xiàn)飛船向上移動(dòng)的效果
          ????????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)
          ????#?地鼠改變位置的計(jì)時(shí)
          ????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))
          ????#?時(shí)鐘
          ????clock?=?pygame.time.Clock()
          ????#?分?jǐn)?shù)
          ????your_score?=?0
          ????flag?=?False
          ????#?初始時(shí)間
          ????init_time?=?pygame.time.get_ticks()
          ????#?游戲主循環(huán)
          ????while?True:
          ????????#?--游戲時(shí)間為60s
          ????????time_remain?=?round((61000?-?(pygame.time.get_ticks()?-?init_time))?/?1000.)
          ????????#?--游戲時(shí)間減少,?地鼠變位置速度變快
          ????????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
          ????????#?--倒計(jì)時(shí)音效
          ????????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)
          ????????#?--按鍵檢測(cè)
          ????????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)
          ????????#?--碰撞檢測(cè)
          ????????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塊避免第一次游戲無(wú).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
          ????????#?--碰撞檢測(cè)
          ????????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、消消樂

          玩法:三個(gè)相連就能消除

          源碼分享:

          ?
          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)]啥意思,小時(shí)候我們都是玩加速的。

          源碼分享:

          ?
          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()
          ????????#?焦點(diǎn)
          ????????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())
          ????'''游戲界面移動(dòng)到屏幕中間'''
          ????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()
          ????'''計(jì)時(shí)器事件'''
          ????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ù)也沒啥意思,小時(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)
          ????????#?--按鍵檢測(cè)
          ????????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點(diǎn)小游戲

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

          源碼分享:

          ?
          import?os
          import?sys
          import?pygame
          from?cfg?import?*
          from?modules?import?*
          from?fractions?import?Fraction
          ?
          ?
          '''檢查控件是否被點(diǎn)擊'''
          def?checkClicked(group,?mouse_pos,?group_type='NUMBER'):
          ????selected?=?[]
          ????#?數(shù)字卡片/運(yùn)算符卡片
          ????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
          ?
          ?
          '''獲取運(yùn)算符精靈組'''
          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
          ?
          ?
          '''計(jì)算'''
          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點(diǎn)游戲生成器
          ????game24_gen?=?game24Generator()
          ????game24_gen.generate()
          ????#?精靈組
          ????#?--數(shù)字
          ????number_sprites_group?=?getNumberSpritesGroup(game24_gen.numbers_now)
          ????#?--運(yùn)算符
          ????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、平衡木

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

          源碼分享:

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

          12、外星人入侵

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

          源碼分享:

          ?
          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()
          ????#?用于控制敵方位置更新
          ????#?--移動(dòng)一行
          ????enemy_move_count?=?24
          ????enemy_move_interval?=?24
          ????enemy_move_flag?=?False
          ????#?--改變移動(dòng)方向(改變方向的同時(shí)集體下降一次)
          ????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():
          ????????????#?--點(diǎn)右上角的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碰撞檢測(cè)
          ????????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
          ????????#?----敵方移動(dòng)
          ????????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
          ????????????????#?----每次下降提高移動(dòng)和射擊速度
          ????????????????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
          ????????#?--敵方子彈與我方飛船碰撞檢測(cè)
          ????????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

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

          源碼分享

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

          如果本文對(duì)你有幫助的話,請(qǐng)不要吝嗇你的贊,謝謝!

          - EOF -

          回復(fù)關(guān)鍵字“簡(jiǎn)明python ”,立即獲取入門必備書籍簡(jiǎn)明python教程》電子版

          回復(fù)關(guān)鍵字爬蟲”,立即獲取爬蟲學(xué)習(xí)資料

          點(diǎn)擊關(guān)注【python入門與進(jìn)階】,閱讀更多精彩內(nèi)容
          ??????

          推薦

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产做爱A片 | 日本黄色电影免费在线播放 | 翔田千里无码中文字幕 | 日韩一级在线视频 | 日韩黄色小视频 |