用python制作几款简单又好玩的小游戏,找回童年的记忆

Posted 派派百晓生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python制作几款简单又好玩的小游戏,找回童年的记忆相关的知识,希望对你有一定的参考价值。

今天给大家带来几个Python小游戏,找回童年的同时学习编程!

一、接金币

普通难度:❤

玩法介绍:吃金币,控制左右键,有手就行。

源码分享

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 = 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

二.俄罗斯方块

困难难度:❤❤

玩法介绍:小时候的经典游戏,加速玩法有一点点难度。

源码分享

import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


'''定义俄罗斯方块游戏类'''
class TetrisGame(QMainWindow):
    def __init__(self, parent=None):
        super(TetrisGame, self).__init__(parent)
        # 是否暂停ing
        self.is_paused = False
        # 是否开始ing
        self.is_started = False
        self.initUI()
    '''界面初始化'''
    def initUI(self):
        # icon
        self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
        # 块大小
        self.grid_size = 22
        # 游戏帧率
        self.fps = 200
        self.timer = QBasicTimer()
        # 焦点
        self.setFocusPolicy(Qt.StrongFocus)
        # 水平布局
        layout_horizontal = QHBoxLayout()
        self.inner_board = InnerBoard()
        self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
        layout_horizontal.addWidget(self.external_board)
        self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
        layout_horizontal.addWidget(self.side_panel)
        self.status_bar = self.statusBar()
        self.external_board.score_signal[str].connect(self.status_bar.showMessage)
        self.start()
        self.center()
        self.setWindowTitle('Tetris —— 九歌')
        self.show()
        self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
    '''游戏界面移动到屏幕中间'''
    def center(self):
        screen = QDesktopWidget().screenGeometry()
        size = self.geometry()
        self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
    '''更新界面'''
    def updateWindow(self):
        self.external_board.updateData()
        self.side_panel.updateData()
        self.update()
    '''开始'''
    def start(self):
        if self.is_started:
            return
        self.is_started = True
        self.inner_board.createNewTetris()
        self.timer.start(self.fps, self)
    '''暂停/不暂停'''
    def pause(self):
        if not self.is_started:
            return
        self.is_paused = not self.is_paused
        if self.is_paused:
            self.timer.stop()
            self.external_board.score_signal.emit('Paused')
        else:
            self.timer.start(self.fps, self)
        self.updateWindow()
    '''计时器事件'''
    def timerEvent(self, event):
        if event.timerId() == self.timer.timerId():
            removed_lines = self.inner_board.moveDown()
            self.external_board.score += removed_lines
            self.updateWindow()
        else:
            super(TetrisGame, self).timerEvent(event)
    '''按键事件'''
    def keyPressEvent(self, event):
        if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
            super(TetrisGame, self).keyPressEvent(event)
            return
        key = event.key()
        # P键暂停
        if key == Qt.Key_P:
            self.pause()
            return
        if self.is_paused:
            return
        # 向左
        elif key == Qt.Key_Left:
            self.inner_board.moveLeft()
        # 向右
        elif key == Qt.Key_Right:
            self.inner_board.moveRight()
        # 旋转
        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_())

三、消消乐

困难难度:❤❤ 需要源码的点击这里

玩法介绍:以前经典的游戏,给我感觉趣味性少了点

源码分享

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
    # 加载背景音乐
    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))
    # 主循环
    game = gemGame(screen, sounds, font, gem_imgs, cfg)
    while True:
        score = game.start()
        flag = False
        # 一轮游戏结束后玩家选择重玩或者退出
        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 <R> to restart the game.'
            text2 = 'Press <Esc> 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()

四、飞机大战

困难难度:❤❤

玩法介绍:并夕夕版飞机大战,也是个双人小游戏。

五、保卫森林

抓狂难度:❤❤❤ 需要源码,

玩法介绍:塔防类小游戏,个人喜欢玩的一类,比较考验策略和大局安排。

想要一起学习一起玩耍的可以扫码加好友

六、贪吃蛇

经典的电子游戏,使用箭头导航控制蛇去吃绿色食物。每次一次食物,蛇身就长出一格。吃到自己或者出界游戏结束。

七、西蒙说:经典的记忆拼图游戏

单击屏幕开始。观察图案,然后按相同顺序单击瓷砖。每次敲对顺序,系统就会增加一步继续开始游戏。

八、迷宫

从一边移到另一边。灵感来源于一行代码中的一个宇宙与10个打印。轻触屏幕可跟踪从一侧到另一侧的路径。

你喜欢哪一款呢?赶快抓紧时间动起手来找回童年回忆!

贼好玩!几行代码将童年游戏搬上屏幕!

文 | 闲欢

来源:Python 技术「ID: pythonall」

80后和90后的小伙伴们,你们是否还记得这个小小的掌上游戏机?

掌上游戏机

没有玩过这个游戏机的小伙伴的童年是不完整的!

在那个物质匮乏的年代,没有 Switch 游戏机,没有手机,也没有 pad,我们只有掌上俄罗斯和小霸王学习机!

看到这个图片,是不是勾起了童年的记忆?

还想不想再玩一下,回味童年的感觉?

没问题!这就送给你!

最近在浏览 GitHub 开源项目的时候,无意中发现了一个神奇的项目 —— free-python-games 。大家看这个项目名称,肯定能猜到这个项目的大致内容,跟 python 和 游戏有关。

没错,这个项目包含了好多我们小时候在掌上游戏机玩的小游戏,你只要几行代码就可以在电脑上开始玩。作为上班偶尔的摸鱼娱乐项目还是很不错的。

安装

安装包

第一步,我们需要安装这个开源包:

pip install freegames

使用命令

我们可以通过下面的命令来查看命令行帮助:

python -m freegames --help

运行命令后,我们可以看到命令行输出:

usage: freegames [-h] {list,copy,show} ...

Free Python Games

positional arguments:
  {list,copy,show}  sub-command help
    list            list games
    copy            copy game source code
    show            show game source code

optional arguments:
  -h, --help        show this help message and exit

Copyright 2017 Grant Jenks

我们可以看到这里有 list,copy,show 操作,分别是列举游戏列表、复制游戏源码、展示游戏源码等。

下面我们使用一下 list 命令:

python -m freegames list

我们可以看到小游戏列表:

ant
bagels
bounce
cannon
connect
crypto
fidget
flappy
guess
life
maze
memory
minesweeper
pacman
paint
pong
simonsays
snake
tictactoe
tiles
tron

运行游戏也非常简单:

python -m freegames.snake

下面是运行贪吃蛇的命令,运行命令之后,就会弹出一个 GUI 小方框来呈现贪吃蛇游戏了,我们只需要使用键盘的方向键就可以愉快地玩耍了。

至于其他的复制、查看代码之类的,由于每个小游戏的代码就一个文件,代码量也不多,大家可以到这个开源项目去拷贝源代码自己修改运行即可。

有哪些小游戏?

话不多说,我们先来看看这个项目里面有哪些小游戏。

Paint

画图。你只需要用鼠标在画布上点击一下代表开始,然后再点击一下代表结束,就可以画一条线段,通过线段来画画。

通过键盘可以控制线段的颜色(需要将键盘切换到大写字母模式)。

paint

Snake

贪吃蛇。这个不用介绍,大家应该都知道是什么游戏了。通过键盘的方向键就可以控制方向。

snake

Pacman

吃豆人。使用键盘操纵黄色的小饼饼吃完所有的小白点就算过关。但是不能碰到那四个移动的红饼饼。

pacman

Cannon

射击。通过鼠标在屏幕上点击来确定石头发射的方向,你需要在那些蓝色的移动物体移动到左侧之前把他们都消灭掉。

cannon

Flappy

小雷电。这个小游戏跟雷电类似,你需要上下移动以防止被从右往左移动的黑色大圆饼触碰到。

flappy

Tiles

拼图。开局给你一个乱序的数字拼图,中间留一个空格,你需要将这些数字按从小到大、从下向上的顺序排列起来。点击空格旁边的数字,就可以移动数字到空格。

tiles

还有很多个其他的小游戏,这里就不一一列举了,大家自己去探索吧!这些小游戏够你玩好长时间了。

总结

作为 Pythoner,不能只想着玩这些小游戏摸鱼,我们需要学习怎么设计和实现这些小游戏。这也是这个项目的初衷——帮助初学者学习 Python。源码也在那里,你可以自己拿来随意修改。作者也在一些游戏上设置了空实现(比如第一个画线的游戏,作者预留了一些实现各种形状的空函数),留待大家自己去完成。

希望大家在找回童年乐趣的同时,也能学到知识!

PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!

老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

代码获取方式

识别文末二维码,回复:python

以上是关于用python制作几款简单又好玩的小游戏,找回童年的记忆的主要内容,如果未能解决你的问题,请参考以下文章

大佬今天教你用python制作五款简单又好玩的小游戏

4399小游戏童年的乐趣,python爬取4399全站小游戏

4399小游戏童年的乐趣,python爬取4399全站小游戏

贼好玩,几行Python代码将童年游戏搬上屏幕

贼好玩!几行代码将童年游戏搬上屏幕!

贼好玩!几行代码将童年游戏搬上屏幕!