30个Python小游戏,上班摸鱼我能玩一天【内附源码】

大家好,我是辣条。

今天给大家带来30个py小游戏,一定要收藏!

目录

有手就行

1、吃金币

2、打乒乓

3、滑雪

4、并夕夕版飞机大战

5、打地鼠

简简单单

6、小恐龙

7、消消乐

8、俄罗斯方块

9、贪吃蛇

普普通通

10、24点小游戏

11、平衡木

12、外星人入侵

13、贪心鸟

14、井字棋888‘’

有点困难

15、炸弹人

16、保卫森林

17、五子棋

18、吃豆豆

19、坦克大战

20、超级玛丽

21、水果忍者

极度困难

22、飞机大战

23、2048

24、推箱子

25、塔防

26、植物大战僵尸

27、扫雷

终极挑战

28、拼图

29、走迷宫

30、最强游戏


有手就行


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 = [col64+20, row64+20]

if location not in locations:

locations.append(location)

attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))

img_path

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值