【Python游戏】坦克大战、推箱子小游戏怎么玩?学会这些让你秒变高高手—那些童年的游戏还记得吗?(附Pygame合集源码)

前言

下一个青年节快到了,想小编我也是过不了几年节日了呢!!

社交媒体上流传着一张照片——按照国家规定“14岁到28岁今天都应该放半天假!”不得不说,

这个跨度着实有点儿大,如果按整自然年来算年龄,心里还真是有点儿小激动呢!

(年纪大了喜欢回忆我逝去的青春了——不仅感叹一声自己果然已经老了老了老了~)

【----帮助Python学习,以下源码及课件文末免费领!----】
动图封面

直接摊牌吧!

今天的小编给大家推文来安利童年“小游戏”的,不过不是游戏内的小游戏。

而是Python代码编写的一些小游戏,应该有很多童年的小伙伴儿都玩过很多小游戏吧。

现在可以重温童年时光咯(不仅感叹还是小时候的游戏有趣,放开让我来都玩儿一遍儿吧

如果你能情不自禁的说出了大多数游戏的名字,那么只能恭喜你,暴露年龄啦~

今天小编给大家带来两款童年的小游戏——我敢保证,这两款童年小游戏,你一定玩过!

1)坦克大战小游戏 单|双模式 2)经典益智游戏推箱子

img

小科普——
五四青年节源于中国1919年反帝爱国的“五四运动”,五四爱国运动是一次彻底的反对帝国主义

和封建主义的爱国运动,也是中国新民主主义革命的开始。1939年,陕甘宁边区西北青年救国

联合会规定5月4日为中国青年节。

青年节期间,中国各地都要举行丰富多彩的纪念活动,青年们还要集中进行各种社会志愿和社

会实践活动,还有许多地方在青年节期间举行成人仪式。

正文

一、素材准备

1)环境准备

环境安装:python 3.8: 解释器、pycharm: 代码编辑器、

相对应的安装包/安装教程/激活码/ 使用教程/学习资料/工具插件 可以直接找我厚台获取 。

自带的一些模块安装完Python可以直接使。如需要安装的话↓

2)模块安装教程

第三方库的安装方式如下:

一般安装:pip install +模块名

镜像源安装:pip install -i https://pypi.douban.com/simple/+模块名

(还有很多国内镜像源,这里是豆瓣的用习惯 了,其他镜像源可以去看下之前文章都有写的)

二、坦克大战小游戏 单|双模式

1)游戏介绍

《坦克大战》是当年火遍大江南北的FC游戏,小霸王时代的装机必备。现在看来是觉得画面有

点简陋,但在以前绝对是属于玩不腻的游戏之一。

这游戏有一个奇葩特点就是可以自己打爆自己的碉堡,车开的太猛,得意忘形一炮把自己的老

家给爆了,可以说是非常喜闻乐见了。

img
【----帮助Python学习,以下源码及课件文末免费领!----】

2)代码展示

游戏有单人和双人两种模式,己方大本营被破或者己方坦克被歼灭则游戏失败,成功通过所有

关卡则游戏胜利。另外,玩家可以通过射击特定的坦克使地图上随机出现一个道具,若己方坦

克捡到该道具,则触发一个事件,例如坦克能力的增强。

代码效果——

2.1玩家操作方式如下

玩家一:wsad键:上下左右;空格键:射击。玩家二:↑↓←→键:上下左右;小键盘0键:射击。

玩家一, WSAD移动, 空格键射击

        if tank_player1.num_lifes >= 0:
            if key_pressed[pygame.K_w]:
                player_tanks_group.remove(tank_player1)
                tank_player1.move('up', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player1)
            elif key_pressed[pygame.K_s]:
                player_tanks_group.remove(tank_player1)
                tank_player1.move('down', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player1)
            elif key_pressed[pygame.K_a]:
                player_tanks_group.remove(tank_player1)
                tank_player1.move('left', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player1)
            elif key_pressed[pygame.K_d]:
                player_tanks_group.remove(tank_player1)
                tank_player1.move('right', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player1)
            elif key_pressed[pygame.K_SPACE]:
                bullet = tank_player1.shoot()
                if bullet:
                    self.sounds['fire'].play() if tank_player1.tanklevel < 2 else self.sounds['Gunfire'].play()
                    player_bullets_group.add(bullet)
        # 玩家二, ↑↓←→移动, 小键盘0键射击
        if self.is_dual_mode and (tank_player2.num_lifes >= 0):
            if key_pressed[pygame.K_UP]:
                player_tanks_group.remove(tank_player2)
                tank_player2.move('up', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player2)
            elif key_pressed[pygame.K_DOWN]:
                player_tanks_group.remove(tank_player2)
                tank_player2.move('down', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player2)
            elif key_pressed[pygame.K_LEFT]:
                player_tanks_group.remove(tank_player2)
                tank_player2.move('left', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player2)
            elif key_pressed[pygame.K_RIGHT]:
                player_tanks_group.remove(tank_player2)
                tank_player2.move('right', self.scene_elems, player_tanks_group, enemy_tanks_group, home)
                player_tanks_group.add(tank_player2)
            elif key_pressed[pygame.K_KP0]:
                bullet = tank_player2.shoot()
                if bullet:
                    player_bullets_group.add(bullet)
                    self.sounds['fire'].play() if tank_player2.tanklevel < 2 else self.sounds['Gunfire'].play()

2.2主程序运行的代码

'''
Function:
    经典坦克大战小游戏
​
'''
import os
import cfg
import pygame
from modules import *
​
​
'''主函数'''
def main(cfg):
    # 游戏初始化
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
    pygame.display.set_caption(cfg.TITLE)
    # 加载游戏素材
    sounds = {}
    for key, value in cfg.AUDIO_PATHS.items():
        sounds[key] = pygame.mixer.Sound(value)
        sounds[key].set_volume(1)
    # 开始界面
    is_dual_mode = gameStartInterface(screen, cfg)
    # 关卡数
    levelfilepaths = [os.path.join(cfg.LEVELFILEDIR, filename) for filename in sorted(os.listdir(cfg.LEVELFILEDIR))]
    # 主循环
    for idx, levelfilepath in enumerate(levelfilepaths):
        switchLevelIterface(screen, cfg, idx+1)
        game_level = GameLevel(idx+1, levelfilepath, sounds, is_dual_mode, cfg)
        is_win = game_level.start(screen)
        if not is_win: break
    is_quit_game = gameEndIterface(screen, cfg, is_win)
    return is_quit_game
​
​
'''run'''
if __name__ == '__main__':
    while True:
        is_quit_game = main(cfg)
        if is_quit_game:
            break

3)效果展示

3.1游戏界面

img

3.2游戏加载画面

img

3.3游戏开始界面

在这里插入图片描述

三、经典益智游戏推箱子

1)游戏介绍

《 推箱子 》的机制和玩法其实都很简单,通过上下左右移动工人把箱子推到指定位置就行。

只不过它的游戏过程中牵涉到了大量的空间逻辑推理,比如箱子推到角落就不能移动、不能同
时推两个箱子等等,很容易陷入死局。

这种游戏设计和玩法的结合可玩性非常强,于是这款游戏很快就火遍了全世界。

img
【----帮助Python学习,以下源码及课件文末免费领!----】

2)代码展示

代码效果——

2.1配置文件

'''配置文件'''
import os
​
​
'''屏幕大小'''
SCREENSIZE = (500, 500)
'''block大小'''
BLOCKSIZE = 50
'''levels所在文件夹'''
LEVELDIR = os.path.join(os.getcwd(), 'resources/levels')
'''图片所在文件夹'''
IMAGESDIR = os.path.join(os.getcwd(), 'resources/images')
'''字体所在文件夹'''
FONTDIR = os.path.join(os.getcwd(), 'resources/font')
'''音频所在文件夹'''
AUDIODIR = os.path.join(os.getcwd(), 'resources/audios')
'''背景颜色'''
BACKGROUNDCOLOR = (45, 45, 45)

2.2运行主程序代码

'''
Function:
    推箱子小游戏
'''
import os
import sys
import cfg
import pygame
from modules import *
from itertools import chain
​
​
'''游戏地图'''
class gameMap():
    def __init__(self, num_cols, num_rows):
        self.walls = []
        self.boxes = []
        self.targets = []
        self.num_cols = num_cols
        self.num_rows = num_rows
    '''增加游戏元素'''
    def addElement(self, elem_type, col, row):
        if elem_type == 'wall':
            self.walls.append(elementSprite('wall.png', col, row, cfg))
        elif elem_type == 'box':
            self.boxes.append(elementSprite('box.png', col, row, cfg))
        elif elem_type == 'target':
            self.targets.append(elementSprite('target.png', col, row, cfg))
    '''画游戏地图'''
    def draw(self, screen):
        for elem in self.elemsIter():
            elem.draw(screen)
    '''游戏元素迭代器'''
    def elemsIter(self):
        for elem in chain(self.targets, self.walls, self.boxes):
            yield elem
    '''该关卡中所有的箱子是否都在指定位置, 在的话就是通关了'''
    def levelCompleted(self):
        for box in self.boxes:
            is_match = False
            for target in self.targets:
                if box.col == target.col and box.row == target.row:
                    is_match = True
                    break
            if not is_match:
                return False
        return True
    '''某位置是否可到达'''
    def isValidPos(self, col, row):
        if col >= 0 and row >= 0 and col < self.num_cols and row < self.num_rows:
            block_size = cfg.BLOCKSIZE
            temp1 = self.walls + self.boxes
            temp2 = pygame.Rect(col * block_size, row * block_size, block_size, block_size)
            return temp2.collidelist(temp1) == -1
        else:
            return False
    '''获得某位置的box'''
    def getBox(self, col, row):
        for box in self.boxes:
            if box.col == col and box.row == row:
                return box
        return None
​
​
'''游戏界面'''
class gameInterface():
    def __init__(self, screen):
        self.screen = screen
        self.levels_path = cfg.LEVELDIR
        self.initGame()
    '''导入关卡地图'''
    def loadLevel(self, game_level):
        with open(os.path.join(self.levels_path, game_level), 'r') as f:
            lines = f.readlines()
        # 游戏地图
        self.game_map = gameMap(max([len(line) for line in lines]) - 1, len(lines))
        # 游戏surface
        height = cfg.BLOCKSIZE * self.game_map.num_rows
        width = cfg.BLOCKSIZE * self.game_map.num_cols
        self.game_surface = pygame.Surface((width, height))
        self.game_surface.fill(cfg.BACKGROUNDCOLOR)
        self.game_surface_blank = self.game_surface.copy()
        for row, elems in enumerate(lines):
            for col, elem in enumerate(elems):
                if elem == 'p':
                    self.player = pusherSprite(col, row, cfg)
                elif elem == '*':
                    self.game_map.addElement('wall', col, row)
                elif elem == '#':
                    self.game_map.addElement('box', col, row)
                elif elem == 'o':
                    self.game_map.addElement('target', col, row)
    '''游戏初始化'''
    def initGame(self):
        self.scroll_x = 0
        self.scroll_y = 0
    '''将游戏界面画出来'''
    def draw(self, *elems):
        self.scroll()
        self.game_surface.blit(self.game_surface_blank, dest=(0, 0))
        for elem in elems:
            elem.draw(self.game_surface)
        self.screen.blit(self.game_surface, dest=(self.scroll_x, self.scroll_y))
    '''因为游戏界面面积>游戏窗口界面, 所以需要根据人物位置滚动'''
    def scroll(self):
        x, y = self.player.rect.center
        width = self.game_surface.get_rect().w
        height = self.game_surface.get_rect().h
        if (x + cfg.SCREENSIZE[0] // 2) > cfg.SCREENSIZE[0]:
            if -1 * self.scroll_x + cfg.SCREENSIZE[0] < width:
                self.scroll_x -= 2
        elif (x + cfg.SCREENSIZE[0] // 2) > 0:
            if self.scroll_x < 0:
                self.scroll_x += 2
        if (y + cfg.SCREENSIZE[1] // 2) > cfg.SCREENSIZE[1]:
            if -1 * self.scroll_y + cfg.SCREENSIZE[1] < height:
                self.scroll_y -= 2
        elif (y + 250) > 0:
            if self.scroll_y < 0:
                self.scroll_y += 2
​
​
'''某一关卡的游戏主循环'''
def runGame(screen, game_level):
    clock = pygame.time.Clock()
    game_interface = gameInterface(screen)
    game_interface.loadLevel(game_level)
    font_path = os.path.join(cfg.FONTDIR, 'simkai.ttf')
    text = '按R键重新开始本关'
    font = pygame.font.Font(font_path, 15)
    text_render = font.render(text, 1, (255, 255, 255))
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit(0)
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    next_pos = game_interface.player.move('left', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('left')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('left', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('left')
                                box.move('left')
                    break
                if event.key == pygame.K_RIGHT:
                    next_pos = game_interface.player.move('right', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('right')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('right', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('right')
                                box.move('right')
                    break
                if event.key == pygame.K_DOWN:
                    next_pos = game_interface.player.move('down', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('down')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('down', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('down')
                                box.move('down')
                    break
                if event.key == pygame.K_UP:
                    next_pos = game_interface.player.move('up', is_test=True)
                    if game_interface.game_map.isValidPos(*next_pos):
                        game_interface.player.move('up')
                    else:
                        box = game_interface.game_map.getBox(*next_pos)
                        if box:
                            next_pos = box.move('up', is_test=True)
                            if game_interface.game_map.isValidPos(*next_pos):
                                game_interface.player.move('up')
                                box.move('up')
                    break
                if event.key == pygame.K_r:
                    game_interface.initGame()
                    game_interface.loadLevel(game_level)
        game_interface.draw(game_interface.player, game_interface.game_map)
        if game_interface.game_map.levelCompleted():
            return
        screen.blit(text_render, (5, 5))
        pygame.display.flip()
        clock.tick(100)
​
​
'''主函数'''
def main():
    pygame.init()
    pygame.mixer.init()
    pygame.display.set_caption('推箱子 —— 源码基地:#959755565#')
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.mixer.init()
    audio_path = os.path.join(cfg.AUDIODIR, 'EineLiebe.mp3')
    pygame.mixer.music.load(audio_path)
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    startInterface(screen, cfg)
    for level_name in sorted(os.listdir(cfg.LEVELDIR)):
        runGame(screen, level_name)
        switchInterface(screen, cfg)
    endInterface(screen, cfg)
​
​
'''run'''
if __name__ == '__main__':
    main()

3)效果展示

3.1游戏界面

img

3.2第二关游戏界面

img

总结

好啦~今天的内容就更新到这里,先给大家介绍2款童年的小游戏吧,如果你喜欢这个游戏滴滴

我免费分享的哈!你的童年还玩儿过那些游戏呢?(偷偷收藏起来以后可以写成代码的哦~)

img

资料领取

上述这份完整版的Python游戏源码及课件已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取游戏源码” 即可领取

在这里插入图片描述

好文推荐

了解python的前景:https://blog.csdn.net/weixin_49891576/article/details/127187029

了解python的兼职:https://blog.csdn.net/weixin_49891576/article/details/127125308

猜你喜欢

转载自blog.csdn.net/weixin_49891576/article/details/130100025