《Take it Easy》
歌手:蔡依林
专辑:《爱上了一条街》
Come on take it easytry to take it easy
随别人去说
也影响不了我
Come on take it easybabe take it easy
一阵风吹过
你就感觉到我
你的背包装满梦想
满溢在我只手
我的心中有一个念头
你笑我就不说
我们过着简单的生活
却有别人不懂的快乐
The sun rises for you and me
没有人担心
偶尔我会觉得委屈
你比我更着急
你猜不透的我的谜题
我准你都放弃
我们过着快乐的生活
却有别人不懂的简单
Peace and love for you and me
没有人担心
Come on take it easytry to take it easy
爱太难形容
快握紧我的手
Come on take it easybabe take it easy
看我的表情
你就会相信我
python 项目:DIY 街机游戏
这个练习是一个小游戏程序,如果要是给它起个名字的话,应该叫:快躲,香蕉。 主要的游戏内容就是,游戏开始会从屏幕上方不断随便的掉一些铁块,在屏幕下 方有一个小香蕉是受你控制的,你需要不断的左右移动来躲避铁块。在你躲避完 一定数量的铁块之后,就会进入下一关。下一关依然是让你躲铁块,不过铁块下 降的速度就快了很多。在游戏中你可以按下任意键暂停,再次按则继续,按下 ESC 键退出。这就是全部的功能了,下面我们来看游戏的实现。
首先对所有代码分类:
1、整体上代码有一个配置模块,来对游戏的速度、屏幕 的宽度、香蕉移动速度、字体大小、各个物体的图片等进行配置。
2、然后是有 一个元素模块,即游戏中的两个元素落下来的铁块以及被砸的香蕉,其中还要包 含他们具有的行为。
3、然后还有游戏中的各种状态模块,状态模块中的类继承 关系稍微多一些,处于家谱最上方的就是 state 类,由它来衍生其他的所有状态, 它的直接子类是 Level 和 Pause,其中 Pause 有衍生出子类 Info、levelCleared、 GameOver、StartUp。
4、最后就是游戏的主模块,用来让其他模块协调工作 的。
然后再来看一个整体图:

有了上面整体的认识,下面就要细揪一下了。我自己看代码的方法是这样的,首先整体分析,然后在从程序的入口点开始分析。我估计大多数人也是这么做的。
首先是 squish.py 文件中的 game 类:
class Game:
def init (self,*args):
path = os.path.abspath(args[0])
dir = os.path.split(path)[0]
os.chdir(dir)
self.state = None
self.nextState = StartUp()
def run(self):
pygame.init()
flag = 0
if config.full_screen:
flag = FULLSCREEN
screen_size = config.screen_size
screen = pygame.display.set_mode(screen_size,flag)
pygame.display.set_caption('Fruit Self Defense')
pygame.mouse.set_visible(False)
while True:
if self.state != self.nextState:
self.state = self.nextState
self.state.firstDisplay(screen)
for event in pygame.event.get():
self.state.handle(event)
self.state.update(self)
self.state.display(screen)
if name == ' main ':
game = Game(*sys.argv)
game.run()
忽略掉 init 中的设置代码,在 run 中,该管理类首先调用 pygame 初始化并启动游戏界面,然后在一个 whileTrue 的死循环中不断的进行状态判断,事件处理,然后根据事件更新当前状态,并且绘制界面。
让我们把焦点放在那个死循环中,因为他就是整个程序的流程所在。 其中状态和事件的关系就是,当发生某一事件之后,状态就会发生变化,比如点击事件、过关事件、死亡事件。这些事件的来源分别是:用户操作、系统判断、系统判断。要继续深入分析就需要再拿一部分代码出来。
依然是来自 squish.py 文件中剩余的所有代码:
import os, sys, pygame
from pygame.locals import *
import objects, config
class State:
def handle(self,event):
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN and event.key == K_ESCAPE:
sys.exit()
def firstDisplay(self, screen):
screen.fill(config.background_color)
pygame.display.flip()
def display(self, screen):
pass
class Level(State):
def init (self,number=1):
self.number = number
self.remaining = config.weights_per_level
speed = config.drop_speed
speed += (self.number - 1) * config.speed_increase
self.weight = objects.Weight(speed)
self.banana = objects.Banana()
both = self.weight,self.banana
self.sprites = pygame.sprite.RenderUpdates(both)
def update(self, game):
self.sprites.update()
if self.banana.touches(self.weight):
game.nextState = GameOver()
elif self.weight.landed:
self.weight.reset()
self.remaining -= 1
if self.remaining == 0:
game.nextState = LevelCleared(self.number)
def display(self, screen):
screen.fill(config.background_color)
updates = self.sprites.draw(screen)
pygame.display.update(updates)
class Paused(State ):
finished = 0
image = None
text = ''
def handle(self, event):
State.handle(self, event)
if event.type in [MOUSEBUTTONDOWN,KEYDOWN]:
self.finished = 1
def update(self, game):
if self.finished:
game.nextState = self.nextState()
def firstDisplay(self, screen):
screen.fill(config.background_color)
font = pygame.font.Font(None, config.font_size)
lines = self.text.strip().splitlines()
height = len(lines) * font.get_linesize()
center,top = screen.get_rect().center
top -= height // 2
if self.image:
image = pygame.image.load(self.image).convert()
r = image.get_rect()
top += r.height // 2
r.midbottom = center, top -20
screen.blit(image, r)
antialias = 1
black = 0,0,0
for line in lines:
text = font.render(line.strip(),antialias,black)
r = text.get_rect()
r.midtop = center,top
screen.blit(text, r)
top += font.get_linesize()
pygame.display.flip()
class Info(Paused):
nextState = Level
text = '''
In this game you are a banana,
trying to survive a course in
self-defense against fruit,where the
participants will 'defend' themselves
against you with a 16 ton weight.'''
class StartUp(Paused):
nextState = Info
image = config.splash_image
text = '''
Welcome to Squish.
the game of Fruit Self-Defense'''
class LevelCleared(Paused):
def init (self, number):
self.number = number
self.text = '''Level %i cleared
Click to start next level''' % self.number
def nextState(self):
return Level(self.number + 1)
class GameOver(Paused):
nextState = Level
text = '''
Game Over
Click to Restart, Esc to Quit'''
其中用户判断部分就是 Paused 类中的 update 方法和 handle 方法,而系统判断就是 Level 类中的 update 方法。还有一个要注意的地方就是 Level 类中update 方法中的第一行代码:self.sprites.update(),这是让铁块不断下落的关键代码。用户判断部分的代码已经有了,下面需要贴上系统判断时用到的代码.
objects.py 中的代码:
import pygame,config,os
from random import randrange
class SquishSprite(pygame.sprite.Sprite):
def init (self, image):
pygame.sprite.Sprite. init (self)
self.image = pygame.image.load(image).convert()
self.rect = self.image.get_rect()
screen = pygame.display.get_surface()
shrink = -config.margin*2
self.area = screen.get_rect().inflate(shrink,shrink)
class Weight(SquishSprite):
def init (self, speed):
SquishSprite. init (self,config.weight_image)
self.speed = speed
self.reset()
def reset(self):
x = randrange(self.area.left, self.area.right)
self.rect.midbottom = x, 0
def update(self):
self.rect.top += self.speed
self.landed = self.rect.top >= self.area.bottom
class Banana(SquishSprite):
def init (self):
SquishSprite. init (self, config.banana_image)
self.rect.bottom = self.area.bottom
self.pad_top = config.banana_pad_top
self.pad_side = config.banana_pad_side
def update(self):
self.rect.centerx = pygame.mouse.get_pos()[0]
self.rect = self.rect.clamp(self.area)
def touches(self, other):
bounds = self.rect.inflate(-self.pad_side,-self.pad_top)
bounds.bottom = self.rect.bottom
return bounds.colliderect(other.rect)
在类 Banana 和 Weight 中的 update 和 touches 方法,用于进行系统判断。好了,到这主要的东西都分析完了,剩下的只需要稍看一下就能够懂得了。 最后还有一个配置模块的代码 config.py:banana_image = 'banana.png'weight_image = 'weight.png'splash_image = 'weight.png'screen_size = 800,600background_color = 255,255,255margin = 30full_screen = 1font_size = 48drop_speed = 1banana_speed = 10speed_increase = 1weights_per_level = 10banana_pad_top = 40banana_pad_side = 20到此为止,《python 基础教程》中的十个项目都已经分析了一遍,下一步要做的就是做几个实用软件出来,然后把 python 再好好深入研究下。
应晓勇要求,上几个运行图:


没有上市
抖音是字节跳动公司的产品, 字节跳动成立于2012年,旗下产品包括抖音、TiKTok、今日头条、火山小视频、西瓜视频等。字节跳动目前还没有在任何股票市场上市,包括A股、港股、美股,之前有传闻说字节跳动要上市上交所科创板,但官方出面否认了。
Iron Lotus 铁莲
music Mili
“Frozen stairs, carpet in blood red”
“阶梯已被冰封,地毯已被染红”
here I am following your steps
我踏着你的足迹前来
I ' m following your steps
我寻觅你的踪迹
Drop by Drop
泪水一滴接一滴
As your unchanging reality dampen my sleeve
你的离去覆水难收,泪沾湿了我的衣袖
You kissed them off
(曾经)你像吻一样的轻柔地
Through the fibers of my handkerchief
用手绢为我擦拭(眼泪)
I am fire
我如同火焰
Burn those who dare to care for me
焚尽了爱我的人
And my fuel are memories, fuel are memories of you
我燃烧的是回忆,曾与你的回忆
They perish with the heat, perish with the heat
它们化作烟云,在火焰的热浪中消散
So I can move on
我不得不前行
Flower of iron
钢铁之花
Shrivelled up to hide the imposter in me
同我心中的伪装一同凋零
“Hey, why did you leave?Why did you leave?”
“嘿,为什么你要离我而去?为什么一无所剩?”
Don ' t let those words out of me
有些话我无法说出口
Im poster ' s about to speak
虚伪的内心开始发声
So I chewed on Huameitang
我咬碎了话梅糖(我没有说这话的资格)
For whom the shelves hold on the pages,hold on to the pages
书架上的书是谁,又是为谁变落得这般田地
Their pain, Their joy were given value as they were rated
对他们的悲欢进行评定
Isn ' t it ironic?
这不是很滑稽吗?
Greed is unlimited;freedom is a limited resou
在无限的欲望面前,自由却弥足珍贵
Extra large for you means less for me
你得到了满足,我未能如愿
There’ll be less for me
为什么对我如此不公
(Weiwu…)
威武
Demanding a new trial
要求再审
(Weiwu…)
威武
You got the wrong head
命不该绝却因你而死
Would You take mine instead, take mine instead?
为何不能由我顶罪,明明我罪加一等?
Stop leading me on
请不要再离我而去
World of titan allows me to live
在巨人的世界里我得以苟活
Only in the mud down its feet
你却活在泥泞之中挣扎
Though you’re not with me, you’re not with me
尽管你不在我身边,再也不能同我一起
I’ll never admit defeat
我也没有退后的理由
Cause when I thought that every nice thing about me has become Canxiang
回忆的美好都化作残香
You showed me I still had an umbrella full of love inside me
你在我心中用爱守护着我
Without you I could never be
并付出了一切
So sincerely thank you for everything
我真心感谢你
It pains me to think
这让每次回忆都是如此痛苦
That my happiness turned out to be one of those fingers That strangled you until you couldn’t breathe
每当想起你是因为我的辛福而死
Not ashamed to go this way
我便义无反顾
just want to choose my fate
只想正视自己的宿命
I ' m on my last white rabbit Naitang
白兔奶糖也是最后一颗了(我倾注了所有对你的爱)
I am iron
我将屹立不倒
In my blood it streams roots deep
爱在我体内暗流涌动
With bruises on my knees, bruises on my knees
即使我膝盖淤青
And ribs crushed down to pieces, crushed down to pieces
即使我肋骨粉碎
Nothing left to hold on
我已经一无所有
Actually wait
我却依然在等待
I do have one regret
依旧有个遗憾
That day before you left me
在你离我去前的那天
“you’re my everything”
“你是我的全部”
Before my thoughts began to speak
当我想好准备开口
I bit my lip, said nothing
我却咬着嘴唇,一言不发
And just sucked on Maiyatang
只在吮吸着麦芽糖(只沉浸在爱的甜蜜之中)