14个py小游戏

简介: 14个py小游戏 源代码分享今天给大家带来14个py小游戏如:吃金币、打乒乓、滑雪、并夕夕版飞机大战、打地鼠、小恐龙、消消乐、俄罗斯方块、贪吃蛇、24点小游戏、平衡木、外星人入侵、贪心鸟、井字棋888‘’,文章都带了源码,感兴趣的小伙伴感快收藏起来吧

14个py小游戏 源代码分享

今天给大家带来14个py小游戏如:吃金币、打乒乓、滑雪、并夕夕版飞机大战、打地鼠、小恐龙、消消乐、俄罗斯方块、贪吃蛇、24点小游戏、平衡木、外星人入侵、贪心鸟、井字棋888‘’,文章都带了源码,感兴趣的小伙伴感快收藏起来吧

1吃金币

源代码如下:

import os
import cfg
import sys
import pygame
import random
from modules import *

'''游戏初始化'''
def initGame():

# 初始化pygame, 设置展示窗口
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)
# 返回初始化数据
return screen, game_images, game_sounds

'''主函数'''
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
# 当前分数/历史最高分
score = 0
highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
# 游戏主循环
clock = pygame.time.Clock()
while True:
    # --填充背景
    screen.fill(0)
    screen.blit(game_images['background'], (0, 0))
    # --倒计时信息
    countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
    countdown_text = font.render(countdown_text, True, (0, 0, 0))
    countdown_rect = countdown_text.get_rect()
    countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
    screen.blit(countdown_text, countdown_rect)
    # --按键检测
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    key_pressed = pygame.key.get_pressed()
    if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
        hero.move(cfg.SCREENSIZE, 'left')
    if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
        hero.move(cfg.SCREENSIZE, 'right')
    # --随机生成食物
    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)
    # --判断游戏是否结束
    if pygame.time.get_ticks() >= 90000:
        break
    # --更新屏幕
    pygame.display.flip()
    clock.tick(cfg.FPS)
# 游戏结束, 记录最高分并显示游戏结束画面
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()

'''结束界面'''
def endInterface(screen, score_left, score_right):

clock = pygame.time.Clock()
font1 = pygame.font.Font(cfg.FONTPATH, 30)
font2 = pygame.font.Font(cfg.FONTPATH, 20)
msg = 'Player on left won!' if score_left > score_right else 'Player on right won!'
texts = [font1.render(msg, True, cfg.WHITE),
        font2.render('Press ESCAPE to quit.', True, cfg.WHITE),
        font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)]
positions = [[120, 200], [155, 270], [80, 300]]
while True:
    screen.fill((41, 36, 33))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                return
            elif event.key == pygame.K_ESCAPE:
                sys.exit()
                pygame.quit()
    for text, pos in zip(texts, positions):
        screen.blit(text, pos)
    clock.tick(10)
    pygame.display.update()

'''运行游戏Demo'''
def runDemo(screen):

# 加载游戏素材
hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
font = pygame.font.Font(cfg.FONTPATH, 50)
# 开始界面
game_mode = startInterface(screen)
# 游戏主循环
# --左边球拍(ws控制, 仅双人模式时可控制)
score_left = 0
racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)
# --右边球拍(↑↓控制)
score_right = 0
racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)
# --球
ball = Ball(cfg.BALLPICPATH, cfg)
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit(-1)
    screen.fill((41, 36, 33))
    # 玩家操作
    pressed_keys = pygame.key.get_pressed()
    if pressed_keys[pygame.K_UP]:
        racket_right.move('UP')
    elif pressed_keys[pygame.K_DOWN]:
        racket_right.move('DOWN')
    if game_mode == 2:
        if pressed_keys[pygame.K_w]:
            racket_left.move('UP')
        elif pressed_keys[pygame.K_s]:
            racket_left.move('DOWN')
    else:
        racket_left.automove(ball)
    # 球运动
    scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
    score_left += scores[0]
    score_right += scores[1]
    # 显示
    # --分隔线
    pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
    # --球
    ball.draw(screen)
    # --拍
    racket_left.draw(screen)
    racket_right.draw(screen)
    # --得分
    screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
    screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
    if score_left == 11 or score_right == 11:
        return score_left, score_right
    clock.tick(100)
    pygame.display.update()

'''主函数'''
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]
'''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''
def turn(self, num):
    self.direction += num
    self.direction = max(-2, self.direction)
    self.direction = min(2, self.direction)
    center = self.rect.center
    self.image = pygame.image.load(self.imagepaths[self.direction])
    self.rect = self.image.get_rect()
    self.rect.center = center
    self.speed = [self.direction, 6-abs(self.direction)*2]
    return self.speed
'''移动滑雪者'''
def move(self):
    self.rect.centerx += self.speed[0]
    self.rect.centerx = max(20, self.rect.centerx)
    self.rect.centerx = min(620, self.rect.centerx)
'''设置为摔倒状态'''
def setFall(self):
    self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
'''设置为站立状态'''
def setForward(self):
    self.direction = 0
    self.image = pygame.image.load(self.imagepaths[self.direction])

'''
Function:

障碍物类

Input:

img_path: 障碍物图片路径
location: 障碍物位置
attribute: 障碍物类别属性

'''
class ObstacleClass(pygame.sprite.Sprite):

def __init__(self, img_path, location, attribute):
    pygame.sprite.Sprite.__init__(self)
    self.img_path = img_path
    self.image = pygame.image.load(self.img_path)
    self.location = location
    self.rect = self.image.get_rect()
    self.rect.center = self.location
    self.attribute = attribute
    self.passed = False
'''移动'''
def move(self, num):
    self.rect.centery = self.location[1] - num

'''创建障碍物'''
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()

'''显示分数'''
def showScore(screen, score, pos=(10, 10)):

font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render("Score: %s" % score, True, (0, 0, 0))
screen.blit(score_text, pos)

'''更新当前帧的游戏画面'''
def updateFrame(screen, obstacles, skier, score):

screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()

'''主程序'''
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)
# 设置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('滑雪游戏 —— 九歌')
# 游戏开始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
# 实例化游戏精灵
# --滑雪者
skier = SkierClass()
# --创建障碍物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
# 游戏clock
clock = pygame.time.Clock()
# 记录滑雪的距离
distance = 0
# 记录当前的分数
score = 0
# 记录当前的速度
speed = [0, 6]
# 游戏主循环
while True:
    # --事件捕获
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pyga

剩下11个小游戏 下一篇会写

持续关注一下 此文章最终解释权归政胤工作室所有

目录
相关文章
|
8月前
|
程序员 C# Python
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码(2)
|
8月前
|
存储 程序员 C#
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
100行python代码,轻松完成贪吃蛇小游戏_c#游戏100行代码
|
Java Python
【python小游戏】用python写一款小游戏--贪吃蛇
【python小游戏】用python写一款小游戏--贪吃蛇
|
Python
python彩图版飞机大战小游戏程序源码
python彩图版飞机大战小游戏程序源码
256 0
|
Python
python五子棋小游戏程序源码
python五子棋小游戏程序源码
163 0
|
C# Python
python小游戏——飞机大战代码开源
python小游戏——飞机大战代码开源
223 0
python小游戏——飞机大战代码开源
Py之tkinter:python最简单的猜字小游戏带你进入python的GUI世界daiding
Py之tkinter:python最简单的猜字小游戏带你进入python的GUI世界daiding
|
Python
14个py小游戏
前言 大家好,我是辣条哥 鉴于之前发布的:《30个Python小游戏,上班摸鱼我能玩一天【内附源码】》不少人都直呼不过瘾,还有人说不够详细。所以今天特意给大家讲讲大型游戏中的一些细枝末节:大型游戏的爆炸效果怎么实现的~ 目录 前言 1.效果流程(思路)(游戏素材) 2.游戏代码 第一步(依次拿到图片) 第二步(新建游戏对象) 第三步(爆炸) 第四步(随机位置爆炸) 最终效果视频 1.效果流程(思路)(游戏素材) 2.游戏代码 第一步(依次拿到图片) 思路:先把6张图片的路径依次遍历(利用字符串的格式化输出) frs = [f'exp/{i}.gif' for i in
218 0
|
Python
11平衡木 py小游戏
11平衡木
265 0
|
Python
二十四点小游戏 py小游戏
二十四点小游戏 py小游戏
148 0

热门文章

最新文章

相关实验场景

更多
下一篇
开通oss服务