以python 3.8.5150.0版本為例,python中eval函數(shù)作用如下:
成都創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、章丘網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制、商城網(wǎng)站定制開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為章丘等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
1、計(jì)算字符串中有效的表達(dá)式,并返回結(jié)果。
2、將字符串轉(zhuǎn)成相應(yīng)的對(duì)象(如list、tuple、dict和string之間的轉(zhuǎn)換)。
3、將利用反引號(hào)轉(zhuǎn)換的字符串再反轉(zhuǎn)回對(duì)象。
參數(shù)解析:
expression:這個(gè)參數(shù)是一個(gè)字符串,python會(huì)使用globals字典和locals字典作為全局和局部的命名空間,將expression當(dāng)作一個(gè)python表達(dá)式進(jìn)行解析和計(jì)算。
globals:這個(gè)參數(shù)控制的是一個(gè)全局的命名空間,也就是我們?cè)谟?jì)算表達(dá)式的時(shí)候可以使用全局的命名空間中的函數(shù),如果這個(gè)參數(shù)被提供了。
并且沒(méi)有提供自定義的builtins(python的內(nèi)建模塊),那么會(huì)將當(dāng)前環(huán)境中的builtins拷貝到提供的globals里,然后進(jìn)行計(jì)算。如果globals沒(méi)有被提供,則使用python的全局命名空間。
locals:這個(gè)參數(shù)控制的是一個(gè)局部的命名空間,和globals類似,不過(guò)當(dāng)它和globals中有重復(fù)的部分時(shí),locals里的定義會(huì)覆蓋掉globals中的,也就是說(shuō)當(dāng)globals和locals中有沖突的部分時(shí),locals說(shuō)了算,它有決定權(quán),以它的為準(zhǔn)。如果locals沒(méi)有被提供的話,則默認(rèn)為globals。
1、我方飛機(jī)模塊
import pygame
class MyPlane(pygame.sprite.Sprite):
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image1 = pygame.image.load(r'E:\learn pygame\image\me1.png').convert_alpha()
self.image2 = pygame.image.load(r'E:\learn pygame\image\me2.png').convert_alpha()
self.image3 = pygame.image.load(r'E:\learn pygame\image\me_protect.png').convert_alpha()
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load(r'E:\learn pygame\image\me_destroy_1.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\me_destroy_2.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\me_destroy_3.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\me_destroy_4.png').convert_alpha() \
])
self.rect = self.image1.get_rect()
self.width,self.height = bg_size[0],bg_size[1]
self.rect.left,self.rect.top = (self.width - self.rect.width) // 2,self.height - self.rect.height - 60
self.speed = 10
self.active = True
self.invincible = False
self.mask = pygame.mask.from_surface(self.image1)
def moveUp(self):
if self.rect.top 0:
self.rect.top -= self.speed
else:
self.rect.top = 0
def moveDown(self):
if self.rect.bottom self.height - 30:
self.rect.top += self.speed
else:
self.rect.bottom = self.height - 30
def moveLeft(self):
if self.rect.left 0:
self.rect.left -= self.speed
else:
self.rect.left = 0
def moveRight(self):
if self.rect.right self.width:
self.rect.left += self.speed
else:
self.rect.right = self.width
def reset(self):
self.rect.left,self.rect.top = (self.width - self.rect.width) // 2,self.height - self.rect.height - 30
self.active = True
self.invincible = True
2、敵機(jī)與背景動(dòng)圖模塊
import pygame
from random import *
class SmallEnemy(pygame.sprite.Sprite):
energy = 1
def __init__(self,bg_size):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(r'E:\learn pygame\image\enemy1.png').convert_alpha()
self.destroy_images = []
self.destroy_images.extend([\
pygame.image.load(r'E:\learn pygame\image\enemy1_down1.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\enemy1_down2.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\enemy1_down3.png').convert_alpha(), \
pygame.image.load(r'E:\learn pygame\image\enemy1_down4.png').convert_alpha() \
])
self.rect = self.image.get_rect()
self.width,self.height = bg_size[0],bg_size[1]
self.speed = 2
self.active = True
self.rect.left,self.rect.top = \
randint(0,self.width - self.rect.width), \
randint(-5 * self.height, 0)
self.mask = pygame.mask.from_surface(self.image)
self.energy = SmallEnemy.energy
self.hit = False
def move(self):
if self.rect.top self.height:
self.rect.top += self.speed
else:
self.reset()
def reset(self):
self.active = True
self.energy = SmallEnemy.energy
self.rect.left,self.rect.top = \
randint(0,self.width - self.rect.width), \
randint(-5 * self.height, 0)
class MidEnemy(pygame.sprite.Sprite):
energy = 4
所有的元件圖片要是png類型的圖片,那樣可以有透明的背景,否則會(huì)有白色的邊框露出來(lái)。
找到素材以后我們就要開(kāi)始搭建我們的飛機(jī)大戰(zhàn)了。
微信上的飛機(jī)大戰(zhàn)是由手指控制的,在電腦上,我們就先用鼠標(biāo)代替了。
按照之前我們?cè)谔炜丈弦苿?dòng)云的那個(gè)程序,我們可以知道該怎么做。
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
def run_game():
# 初始化游戲并創(chuàng)建一個(gè)屏幕對(duì)象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 創(chuàng)建一艘飛船
ship = Ship(ai_settings, screen)
# 創(chuàng)建一個(gè)用于存儲(chǔ)子彈的編組
bullets = Group()
# 開(kāi)始游戲主循環(huán)
while True:
gf.check_events(ai_settings, screen, ship, bullets)
ship.update()
bullets.update()
gf.update_bullets(ship, bullets)
gf.update_screen(ai_settings, screen, ship, bullets)
run_game()
python中eval函數(shù)用法如下:
1、計(jì)算字符串中有效的表達(dá)式,并返回結(jié)果。
2、將字符串轉(zhuǎn)成相應(yīng)的對(duì)象(如list、tuple、dict和string之間的轉(zhuǎn)換)。
3、將利用反引號(hào)轉(zhuǎn)換的字符串再反轉(zhuǎn)回對(duì)象。
函數(shù)作用域:eval()函數(shù)并不會(huì)創(chuàng)建一個(gè)新的作用域,并且它的作用域就是它所在的作用域,有時(shí)候需要將eval()函數(shù)的作用域設(shè)置為全局,當(dāng)然可以將eval()在全局作用域中使用,這個(gè)時(shí)候可以用window.eval()的方式實(shí)現(xiàn)。
參數(shù)情況:
(1)如果參數(shù)是一個(gè)表達(dá)式,eval() 函數(shù)將執(zhí)行表達(dá)式。
(2)如果參數(shù)是Javascript語(yǔ)句,eval()將執(zhí)行 Javascript 語(yǔ)句。
注意:如果執(zhí)行結(jié)果是一個(gè)值就返回,不是就返回undefined,如果參數(shù)不是一個(gè)字符串,則直接返回該參數(shù)。
春節(jié)這些天,閑賦在家,甚是無(wú)聊,便萌發(fā)了研究經(jīng)典小 游戲 :飛機(jī)大戰(zhàn)的念頭,想必大家可能玩過(guò)微信的這款小 游戲 ,給我的感覺(jué)是這款 游戲 怎么可以做得這么好呢,操作簡(jiǎn)單,容易上手,簡(jiǎn)直是“老少皆宜”啊~
既然這款 游戲 這么棒,能否自己動(dòng)手用 Python 來(lái)實(shí)現(xiàn)呢?事實(shí)證明是可以的。
先來(lái)看下飛機(jī)大戰(zhàn) 游戲 最終實(shí)現(xiàn)的動(dòng)態(tài)效果圖。
在導(dǎo)入pygame之前,需要先使用命令:
進(jìn)行包模塊的安裝
(1). __init__初始化方法:
進(jìn)行 游戲 開(kāi)始的初始化操作,包含:創(chuàng)建 游戲 窗口,創(chuàng)建 游戲 的敵機(jī),背景等精靈
(2). __create_sprites創(chuàng)建精靈方法:
負(fù)責(zé)創(chuàng)建不同角色的精靈,并將其添加至精靈組
(3). start_game 游戲 開(kāi)始方法:
負(fù)責(zé)播放背景音樂(lè),使用while循環(huán)來(lái)設(shè)置刷新幀率、事件監(jiān)聽(tīng)、碰撞檢測(cè)、更新繪制精靈組、更新顯示屏幕圖像
(4). __event_handler事件監(jiān)聽(tīng)方法:
負(fù)責(zé)監(jiān)聽(tīng)用戶在 游戲 界面的操作,例如:關(guān)閉 游戲 窗口,左右方向鍵的移動(dòng)等
(5). __check_collide碰撞檢測(cè)方法:
負(fù)責(zé)檢測(cè)子彈是否碰撞到敵機(jī),敵機(jī)是否碰撞到英雄飛機(jī),然后做出相應(yīng)的操作
(6). __update_sprites更新精靈方法:
負(fù)責(zé)各個(gè)角色精靈的更新并繪制到屏幕,展示給用戶
(7). __game_over 游戲 結(jié)束方法:
當(dāng)檢測(cè)到碰撞事件的發(fā)生,判斷是否需要調(diào)用該方法來(lái)退出 游戲
鼓勵(lì)大家親自動(dòng)手實(shí)現(xiàn)一下這個(gè)小 游戲 ,還是挺有趣的。代碼注釋較為詳細(xì),在實(shí)踐過(guò)程中,可以仔細(xì)閱讀以便于加深理解。