|
前言
下一个青年节快到了,想小编我也是过不了几年节日了呢!!
社交媒体上流传着一张照片——按照国家规定“14岁到28岁今天都应该放半天假!”不得不说,
这个跨度着实有点儿大,如果按整自然年来算年龄,心里还真是有点儿小激动呢!
(年纪大了喜欢回忆我逝去的青春了——不仅感叹一声自己果然已经老了~老了~老了~)
关注公众号:python源码 领取完整的项目代码
直接摊牌吧!
今天的小编给大家推文来安利童年“小游戏”的,不过不是游戏内的小游戏。
而是Python代码编写的一些小游戏,应该有很多童年的小伙伴儿都玩过很多小游戏吧。
现在可以重温童年时光咯~(不仅感叹还是小时候的游戏有趣,放开让我来都玩儿一遍儿吧~)
如果你能情不自禁的说出了大多数游戏的名字,那么只能恭喜你,暴露年龄啦~
今天小编给大家带来两款童年的小游戏——我敢保证,这两款童年小游戏,你一定玩过!
1)坦克大战小游戏 单|双模式 2)经典益智游戏推箱子
小科普——
五四青年节源于中国1919年反帝爱国的“五四运动”,五四爱国运动是一次彻底的反对帝国主义
和封建主义的爱国运动,也是中国新民主主义革命的开始。1939年,陕甘宁边区西北青年救国
联合会规定5月4日为中国青年节。
青年节期间,中国各地都要举行丰富多彩的纪念活动,青年们还要集中进行各种社会志愿和社
会实践活动,还有许多地方在青年节期间举行成人仪式。
正文
一、素材准备
1)环境准备
环境安装:python 3.8: 解释器、pycharm: 代码编辑器、
相对应的安装包/安装教程/激活码/ 使用教程/学习资料/工具插件 可以直接找我厚台获取 。
自带的一些模块安装完Python可以直接使。如需要安装的话↓
2)模块安装教程
第三方库的安装方式如下:
一般安装:pip install +模块名
镜像源安装:pip install -i https://pypi.douban.com/simple/+模块名
(还有很多国内镜像源,这里是豆瓣的用习惯 了,其他镜像源可以去看下之前文章都有写的)
二、坦克大战小游戏 单|双模式
1)游戏介绍
《坦克大战》是当年火遍大江南北的FC游戏,小霸王时代的装机必备。现在看来是觉得画面有
点简陋,但在以前绝对是属于玩不腻的游戏之一。
这游戏有一个奇葩特点就是可以自己打爆自己的碉堡,车开的太猛,得意忘形一炮把自己的老
家给爆了,可以说是非常喜闻乐见了。
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[&#39;fire&#39;].play() if tank_player1.tanklevel < 2 else self.sounds[&#39;Gunfire&#39;].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(&#39;up&#39;, 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(&#39;down&#39;, 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(&#39;left&#39;, 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(&#39;right&#39;, 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[&#39;fire&#39;].play() if tank_player2.tanklevel < 2 else self.sounds[&#39;Gunfire&#39;].play()
2.2主程序运行的代码
&#39;&#39;&#39;
Function:
经典坦克大战小游戏
&#39;&#39;&#39;
import os
import cfg
import pygame
from modules import *
&#39;&#39;&#39;主函数&#39;&#39;&#39;
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
&#39;&#39;&#39;run&#39;&#39;&#39;
if __name__ == &#39;__main__&#39;:
while True:
is_quit_game = main(cfg)
if is_quit_game:
break3)效果展示
3.1游戏界面
3.2游戏加载画面
3.3游戏开始界面
三、经典益智游戏推箱子
1)游戏介绍
《 推箱子 》的机制和玩法其实都很简单,通过上下左右移动工人把箱子推到指定位置就行。
只不过它的游戏过程中牵涉到了大量的空间逻辑推理,比如箱子推到角落就不能移动、不能同
时推两个箱子等等,很容易陷入死局。
这种游戏设计和玩法的结合可玩性非常强,于是这款游戏很快就火遍了全世界。
2)代码展示
代码效果——
2.1配置文件
&#39;&#39;&#39;配置文件&#39;&#39;&#39;
import os
&#39;&#39;&#39;屏幕大小&#39;&#39;&#39;
SCREENSIZE = (500, 500)
&#39;&#39;&#39;block大小&#39;&#39;&#39;
BLOCKSIZE = 50
&#39;&#39;&#39;levels所在文件夹&#39;&#39;&#39;
LEVELDIR = os.path.join(os.getcwd(), &#39;resources/levels&#39;)
&#39;&#39;&#39;图片所在文件夹&#39;&#39;&#39;
IMAGESDIR = os.path.join(os.getcwd(), &#39;resources/images&#39;)
&#39;&#39;&#39;字体所在文件夹&#39;&#39;&#39;
FONTDIR = os.path.join(os.getcwd(), &#39;resources/font&#39;)
&#39;&#39;&#39;音频所在文件夹&#39;&#39;&#39;
AUDIODIR = os.path.join(os.getcwd(), &#39;resources/audios&#39;)
&#39;&#39;&#39;背景颜色&#39;&#39;&#39;
BACKGROUNDCOLOR = (45, 45, 45)2.2运行主程序代码
&#39;&#39;&#39;
Function:
推箱子小游戏
&#39;&#39;&#39;
import os
import sys
import cfg
import pygame
from modules import *
from itertools import chain
&#39;&#39;&#39;游戏地图&#39;&#39;&#39;
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
&#39;&#39;&#39;增加游戏元素&#39;&#39;&#39;
def addElement(self, elem_type, col, row):
if elem_type == &#39;wall&#39;:
self.walls.append(elementSprite(&#39;wall.png&#39;, col, row, cfg))
elif elem_type == &#39;box&#39;:
self.boxes.append(elementSprite(&#39;box.png&#39;, col, row, cfg))
elif elem_type == &#39;target&#39;:
self.targets.append(elementSprite(&#39;target.png&#39;, col, row, cfg))
&#39;&#39;&#39;画游戏地图&#39;&#39;&#39;
def draw(self, screen):
for elem in self.elemsIter():
elem.draw(screen)
&#39;&#39;&#39;游戏元素迭代器&#39;&#39;&#39;
def elemsIter(self):
for elem in chain(self.targets, self.walls, self.boxes):
yield elem
&#39;&#39;&#39;该关卡中所有的箱子是否都在指定位置, 在的话就是通关了&#39;&#39;&#39;
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
&#39;&#39;&#39;某位置是否可到达&#39;&#39;&#39;
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
&#39;&#39;&#39;获得某位置的box&#39;&#39;&#39;
def getBox(self, col, row):
for box in self.boxes:
if box.col == col and box.row == row:
return box
return None
&#39;&#39;&#39;游戏界面&#39;&#39;&#39;
class gameInterface():
def __init__(self, screen):
self.screen = screen
self.levels_path = cfg.LEVELDIR
self.initGame()
&#39;&#39;&#39;导入关卡地图&#39;&#39;&#39;
def loadLevel(self, game_level):
with open(os.path.join(self.levels_path, game_level), &#39;r&#39;) 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 == &#39;p&#39;:
self.player = pusherSprite(col, row, cfg)
elif elem == &#39;*&#39;:
self.game_map.addElement(&#39;wall&#39;, col, row)
elif elem == &#39;#&#39;:
self.game_map.addElement(&#39;box&#39;, col, row)
elif elem == &#39;o&#39;:
self.game_map.addElement(&#39;target&#39;, col, row)
&#39;&#39;&#39;游戏初始化&#39;&#39;&#39;
def initGame(self):
self.scroll_x = 0
self.scroll_y = 0
&#39;&#39;&#39;将游戏界面画出来&#39;&#39;&#39;
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))
&#39;&#39;&#39;因为游戏界面面积>游戏窗口界面, 所以需要根据人物位置滚动&#39;&#39;&#39;
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
&#39;&#39;&#39;某一关卡的游戏主循环&#39;&#39;&#39;
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, &#39;simkai.ttf&#39;)
text = &#39;按R键重新开始本关&#39;
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(&#39;left&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;left&#39;)
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move(&#39;left&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;left&#39;)
box.move(&#39;left&#39;)
break
if event.key == pygame.K_RIGHT:
next_pos = game_interface.player.move(&#39;right&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;right&#39;)
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move(&#39;right&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;right&#39;)
box.move(&#39;right&#39;)
break
if event.key == pygame.K_DOWN:
next_pos = game_interface.player.move(&#39;down&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;down&#39;)
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move(&#39;down&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;down&#39;)
box.move(&#39;down&#39;)
break
if event.key == pygame.K_UP:
next_pos = game_interface.player.move(&#39;up&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;up&#39;)
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move(&#39;up&#39;, is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move(&#39;up&#39;)
box.move(&#39;up&#39;)
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)
&#39;&#39;&#39;主函数&#39;&#39;&#39;
def main():
pygame.init()
pygame.mixer.init()
pygame.display.set_caption(&#39;推箱子 —— 源码基地:#959755565#&#39;)
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.init()
audio_path = os.path.join(cfg.AUDIODIR, &#39;EineLiebe.mp3&#39;)
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)
&#39;&#39;&#39;run&#39;&#39;&#39;
if __name__ == &#39;__main__&#39;:
main()
3)效果展示
3.1游戏界面
3.2第二关游戏界面
总结
好啦~今天的内容就更新到这里,先给大家介绍2款童年的小游戏吧,如果你喜欢这个游戏滴滴
我免费分享的哈!你的童年还玩儿过那些游戏呢?(偷偷收藏起来以后可以写成代码的哦~)
关注公众号:python源码 领取完整的项目代码
|
|