13個(gè)Python代碼游戲,源碼已經(jīng)打包整理好了【免費(fèi)自取】


來源丨網(wǎng)絡(luò)
經(jīng)常聽到有朋友說,學(xué)習(xí)編程是一件非??菰餆o味的事情。其實(shí),大家有沒有認(rèn)真想過,可能是我們的學(xué)習(xí)方法不對(duì)?
比方說,你有沒有想過,可以通過打游戲來學(xué)編程?今天我想跟大家分享幾個(gè)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))
????????#?--倒計(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)
????????#?--按鍵檢測
????????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()
?
?
'''運(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)
????????#?--碰撞檢測
????????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)?<?500:
????????????background?=?bg_1
????????elif?(score_1?+?score_2)?<?1500:
????????????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?<?0:?break
????????count_down_text?=?font.render('Time:?'+str(time_remain),?True,?cfg.WHITE)
????????#?--按鍵檢測
????????for?event?in?pygame.event.get():
????????????if?event.type?==?pygame.QUIT:
????????????????pygame.quit()
????????????????sys.exit()
????????????elif?event.type?==?pygame.MOUSEMOTION:
????????????????hammer.setPosition(pygame.mouse.get_pos())
????????????elif?event.type?==?pygame.MOUSEBUTTONDOWN:
????????????????if?event.button?==?1:
????????????????????hammer.setHammering()
????????????elif?event.type?==?change_hole_event:
????????????????hole_pos?=?random.choice(cfg.HOLE_POSITIONS)
????????????????mole.reset()
????????????????mole.setPosition(hole_pos)
????????#?--碰撞檢測
????????if?hammer.is_hammering?and?not?mole.is_hammer:
????????????is_hammer?=?pygame.sprite.collide_mask(hammer,?mole)
????????????if?is_hammer:
????????????????audios['hammering'].play()
????????????????mole.setBeHammered()
????????????????your_score?+=?10
????????#?--分?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)?<?5?and?random.randrange(0,?300)?==?10:
????????????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
【以上游戲都是Python網(wǎng)頁格式的,都是可以直接打開的,已經(jīng)打包整理好啦分享給大家】提示:愛學(xué)習(xí)哦,不要沉迷游戲,平時(shí)打發(fā)一下無聊時(shí)間最好啦。
通通無償分享給你們!免費(fèi)自取!●:關(guān)十后臺(tái)call“打卡”●:評(píng)論:代碼游戲。