python实现飞机大战游戏(pygame版)


Posted in Python onOctober 26, 2020

简介

使用python实现pygame版的飞机大战游戏;

环境:Windows系统+python3.8.0

游戏规则:

1.点击“PLAY”或者按键“P”开始游戏;

2.敌机根据设置频率从顶部随机位置生成,生成后向下移动;

3.飞船在底部中间生成,玩家使用上下左右键控制飞船移动,敲击空格键发射子弹;

4.子弹打到敌机,该敌机产生爆炸效果并累计分数到右上角;

5.消灭10只飞机后,等级升高,敌机生成频率变快,下落速度也变快;

6.当三条命都消失了,游戏结束。

游戏运行效果如下:

python实现飞机大战游戏(pygame版)

实现过程

1.新建文件“file.py”,用来存储信息到文件和读取文件的信息,本例用来存储和读取最高分;

import pickle
# filename = 'file/stats.pkl'
# 存储信息到文件
def save_file(obj, filename):
 statsObj = load_file(filename)
 if statsObj == 0:
 # 不存在文件时,直接保存字典
 with open(filename, 'wb') as f:
 pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
 else:
 # 存在文件时,只修改文件中的最高分
 for key, val in statsObj.items():
 # 获取文件最高分的值(当文件字段不止一个时候使用)
 if key == 'highScore':
 statsObj[key] = obj['highScore']
 obj = statsObj
 with open(filename, 'wb') as f:
 pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
 
# 读取信息
def load_file(filename):
 try:
 with open(filename, 'rb') as f:
 return pickle.load(f)
 except FileNotFoundError:
 # 不存在文件则输入错误信息
 msg = "Sorry, the file " + filename + " does not exist."
 print(msg)
 return 0
 
# obj = {'highScore': 20, 'points': 5}
# obj = {'highScore': 50}
# save_file(obj, filename)
# filedata = load_file(filename)
# print(filedata)

2.k新建文件settings.py,用来定义一些必须的基本属性和初始值;

import file as f
class Settings():
 def __init__(self):
 self.screen_width = 480
 self.screen_height = 660
 self.bg_color = (230, 230, 230)
 # 子弹设置(宽、高、颜色、最大数量) 
 self.bullet_width = 5
 self.bullet_height = 15
 self.bullet_color = 255, 255, 255
 # 敌机移动频率
 self.enemy_frequency = 0
 # 加快游戏节奏的速度
 self.speedup_scale = 1.1
 # 分数的提高速度
 self.score_scale = 1.5
 
 self.initialize_settings()
 # 初始化统计信息
 self.reset_stats()
 # 统计信息文件路径
 self.filename = 'file/stats.pkl'
 # 游戏刚启动时处于非活动状态
 self.game_active = False
 # 读取文件的最高分,在任何情况下都不应重置最高得分
 statsObj = f.load_file(self.filename)
 if statsObj == 0:
 # 不存在文件则显示最高分0
 highScore = 0
 else:
 for key, val in statsObj.items():
 # 获取文件最高分的值(当文件字段不止一个时候使用)
 if key == 'highScore':
 highScore = val
 self.high_score = highScore
 
 def initialize_settings(self):
 """初始化随游戏进行而变化的设置"""
 self.player_move_speed = 2.5
 self.bullet_speed = 3
 self.enemy_move_speed = 1
 # 记分
 self.one_points = 50
 def increase_speed(self):
 """提高速度设置"""
 # self.player_move_speed *= self.speedup_scale
 self.bullet_speed *= self.speedup_scale
 self.enemy_move_speed *= self.speedup_scale
 self.one_points = int(self.one_points * self.score_scale)
 def reset_stats(self):
 """初始化在游戏运行期间可能变化的统计信息"""
 # 可射失的数量
 self.player_limit = 3
 # 射击分数
 self.score = 0
 # 等级
 self.level = 1
 # 打中多少矩形升一级
 self.level_number = 10
 # 生成敌机频率间隔
 self.enemy_frequency_space = 50

3.新建文件enemy.py,用来定义敌机类(位置topleft随机生成)和声明方法move;

import pygame
import random
from pygame.sprite import Sprite
class Enemy(Sprite):
 def __init__(self, enemy_down_imgs, settings):
 super(Enemy, self).__init__()
 self.image = pygame.image.load('images/enemy1.png')
 self.rect = self.image.get_rect() 
 self.rect.topleft = [random.randint(0, settings.screen_width - self.rect.width), 0]
 self.down_imgs = enemy_down_imgs
 self.speed = settings.enemy_move_speed
 self.down_index = 0
 
 # 敌机移动,边界判断及删除在游戏主循环里处理
 def move(self):
 self.rect.top += self.speed

4.新建文件player.py,用来定义玩家类(可上下左右移动)和相应的方法;

import pygame
from pygame.sprite import Sprite
class Player(Sprite):
 def __init__(self, settings, screen):
 super(Player, self).__init__()
 self.settings = settings
 self.screen = screen
 self.screen_rect = self.screen.get_rect()
 # 引入飞船图片并定位
 self.image = pygame.image.load('images/player.png') 
 self.rect = self.image.get_rect()
 self.rect.centerx = self.screen_rect.centerx
 self.rect.bottom = self.screen_rect.bottom
 
 # 移动标志
 self.move_left = False
 self.move_right = False
 self.move_down = False
 self.move_up = False
 def rotate(self, angle):
 # 图片旋转
 self.image = pygame.transform.rotate(self.image, angle)
 def scale(self, multiple):
 # 图片缩放
 self.image = pygame.transform.smoothscale(self.image, (multiple, multiple))
 def update(self):
 if self.move_left and self.rect.left > self.screen_rect.left:
 self.rect.centerx -= self.settings.player_move_speed
 if self.move_right and self.rect.right < self.screen_rect.right:
 self.rect.centerx += self.settings.player_move_speed
 if self.move_down and self.rect.bottom < self.screen_rect.bottom:
 self.rect.centery += self.settings.player_move_speed
 if self.move_up and self.rect.top > 0:
 self.rect.centery -= self.settings.player_move_speed
 def draw_player(self):
 """绘制飞船到屏幕"""
 self.screen.blit(self.image, self.rect)

5.新建文件“bullet.py”,用来定义子弹类(位置在飞船的顶部,并往上移动)和相应的方法;

import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
 """ 一个对飞船发射的子弹进行管理的类 """
 def __init__(self, settings, screen, player):
 """ 在飞船所处的位置创建一个子弹对象 """
 super(Bullet, self).__init__()
 self.screen = screen
 # 在 (0,0) 处创建一个表示子弹的矩形,再设置正确的位置
 self.rect = pygame.Rect(0, 0, settings.bullet_width, settings.bullet_height)
 self.rect.centerx = player.rect.centerx
 # 飞船顶部
 self.rect.bottom = player.rect.top
 # 存储用小数表示的子弹位置
 self.y = float(self.rect.y)
 self.color = settings.bullet_color
 self.speed = settings.bullet_speed
 def update(self):
 """向上移动子弹"""
 # 更新表示子弹位置的小数值(子弹往右)
 self.y -= self.speed
 # 更新表示子弹的rect的位置
 self.rect.y = self.y
 def draw_bullet(self):
 """在屏幕上绘制子弹"""
 pygame.draw.rect(self.screen, self.color, self.rect)

6.新建文件“button.py”,用来定义按钮类和相应方法,本例使用于绘制“PLAY”按钮;

import pygame.font
class Button():
 def __init__(self, screen, msg):
 """初始化按钮的属性"""
 self.screen = screen
 self.screen_rect = screen.get_rect()
 # 设置按钮的尺寸和其他属性
 self.width, self.height = 100, 30
 self.button_color = (216, 30, 6)
 self.text_color = (255, 255, 255)
 self.font = pygame.font.SysFont(None, 36)
 # 创建按钮的rect对象,并使其居中
 self.rect = pygame.Rect(0, 0, self.width, self.height)
 self.rect.center = self.screen_rect.center
 # 按钮的标签只需创建一次
 self.prep_msg(msg)
 def prep_msg(self, msg):
 """将msg渲染为图像,并使其在按钮上居中"""
 self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)
 self.msg_image_rect = self.msg_image.get_rect()
 self.msg_image_rect.center = self.rect.center
 def draw_button(self):
 # 绘制一个用颜色填充的按钮,再绘制文本
 self.screen.fill(self.button_color, self.rect)
 self.screen.blit(self.msg_image, self.msg_image_rect)

7.新建文件“scoreboard.py”,用来定义记分板,本例使用于绘制左上角飞船(生命数)、顶部中间的“最高分”、右上角的“积分”和“等级”;

import pygame.font
from pygame.sprite import Group
from player import Player
class Scoreboard():
 """显示得分信息的类"""
 def __init__(self, settings, screen):
 """初始化显示得分涉及的属性"""
 self.screen = screen
 self.screen_rect = screen.get_rect()
 self.settings = settings
 # 显示得分信息时使用的字体设置
 self.text_color = (255, 255, 255)
 self.font = pygame.font.SysFont(None, 30)
 # 飞船缩放值
 self.scaleValue = 20
 # 准备初始得分图像\最高得分\等级
 self.prep_score()
 self.prep_high_score()
 self.prep_level()
 self.prep_players()
 def prep_score(self):
 """将得分转换为渲染的图像"""
 rounded_score = int(round(self.settings.score, -1))
 score_str = '{:,}'.format(rounded_score)
 self.score_image = self.font.render(score_str, True, self.text_color)
 # 将得分放在屏幕右上角
 self.score_rect = self.score_image.get_rect()
 self.score_rect.right = self.screen_rect.right -20
 self.score_rect.top = 10
 def prep_high_score(self):
 """ 将最高得分转换为渲染的图像 """
 high_score = int(round(self.settings.high_score, -1))
 high_score_str = "{:,}".format(high_score)
 self.high_score_image = self.font.render(high_score_str, True, self.text_color)
 # 将最高得分放在屏幕顶部中央
 self.high_score_rect = self.high_score_image.get_rect()
 self.high_score_rect.centerx = self.screen_rect.centerx
 self.high_score_rect.top = self.score_rect.top
 def prep_level(self):
 """将等级转换为渲染的图像"""
 self.level_image = self.font.render(str(self.settings.level), True, self.text_color)
 # 将等级放在得分下方
 self.level_rect = self.level_image.get_rect()
 self.level_rect.right = self.score_rect.right
 self.level_rect.top = self.score_rect.bottom + 10
 def prep_players(self):
 """ 显示还余下多少艘飞船 """
 self.players = Group()
 for player_number in range(self.settings.player_limit):
 player = Player(self.settings, self.screen)
 
 # 缩放球大小并赋值位置
 player.scale(self.scaleValue)
 player.rect.x = 10 + player.rect.width * player_number * 0.5
 player.rect.y = self.score_rect.top
 self.players.add(player)
 def show_score(self):
 """在屏幕上显示得分"""
 self.screen.blit(self.score_image, self.score_rect)
 self.screen.blit(self.high_score_image, self.high_score_rect)
 self.screen.blit(self.level_image, self.level_rect)
 # 绘制飞船
 self.players.draw(self.screen)

8.新建文件“game_functions.py”,存放跟游戏有关的所有业务逻辑函数(代码有详细的注释信息);

import sys
import pygame
from bullet import Bullet
from enemy import Enemy
import file as f
 
# 事件
def check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound):
 """ 响应按键和鼠标事件 """
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 save_file(settings)
 sys.exit()
 elif event.type == pygame.KEYDOWN:
 check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound)
 elif event.type == pygame.KEYUP:
 check_keyup_events(event, player)
 elif event.type == pygame.MOUSEBUTTONDOWN:
 mouse_x, mouse_y = pygame.mouse.get_pos()
 check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y)
def check_keydown_events(event, settings, screen, player, scoreboard, bullets, fireSound):
 """ 响应按键 """
 if event.key == pygame.K_DOWN:
 player.move_down = True
 elif event.key == pygame.K_UP:
 player.move_up = True
 elif event.key == pygame.K_LEFT:
 player.move_left = True
 elif event.key == pygame.K_RIGHT:
 player.move_right = True
 elif event.key == pygame.K_SPACE:
 fireSound.play()
 # 点击空格键创建一颗子弹
 fire_bullet(settings, screen, player, bullets)
 elif event.key == pygame.K_p:
 start_game(settings, scoreboard)
 elif event.key == pygame.K_q:
 save_file(settings)
 sys.exit()
def check_keyup_events(event, player):
 """ 响应松开 """
 if event.key == pygame.K_DOWN:
 player.move_down = False
 elif event.key == pygame.K_UP:
 player.move_up = False
 elif event.key == pygame.K_LEFT:
 player.move_left = False
 elif event.key == pygame.K_RIGHT:
 player.move_right = False
def check_play_button(settings, play_button, scoreboard, mouse_x, mouse_y):
 """在玩家单击Play按钮时开始新游戏"""
 button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
 if button_clicked and not settings.game_active:
 start_game(settings, scoreboard)
def start_game(settings, scoreboard):
 """开始游戏"""
 # 重置游戏设置
 settings.initialize_settings()
 # 隐藏光标
 pygame.mouse.set_visible(False)
 # 重置游戏统计信息
 settings.reset_stats() 
 settings.game_active = True
 # 重置记分牌图像
 scoreboard.prep_score()
 scoreboard.prep_high_score()
 scoreboard.prep_level()
 scoreboard.prep_players()
def save_file(settings):
 # 保持文件
 obj = {'highScore': settings.high_score}
 f.save_file(obj, settings.filename)
 
# 敌机
def update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound): 
 # 生成敌机,需要控制生成频率
 if settings.enemy_frequency % settings.enemy_frequency_space == 0: 
 enemy1 = Enemy(enemy_down_imgs, settings)
 enemies.add(enemy1)
 settings.enemy_frequency += 1
 if settings.enemy_frequency >= 100:
 settings.enemy_frequency = 0
 for enemy in enemies:
 # 移动敌机
 enemy.move()
 # 敌机与玩家飞机碰撞效果处理 两个精灵之间的圆检测
 if pygame.sprite.collide_circle(enemy, player):
 enemies_down.add(enemy)
 enemies.remove(enemy)
 settings.player_limit -= 1
 scoreboard.prep_players()
 break
 # 移动出屏幕后删除飞机
 if enemy.rect.top < 0:
 enemies.remove(enemy)
 # 敌机被子弹击中效果处理
 # 将被击中的敌机对象添加到击毁敌机 Group 中,用来渲染击毁动画
 # 方法groupcollide()是检测两个精灵组中精灵们的矩形冲突
 enemies1_down = pygame.sprite.groupcollide(enemies, bullets, True, True)
 if enemies1_down:
 explosiveSound.play()
 # 计算分数并渲染
 for enemys in enemies1_down.values():
 settings.score += settings.one_points * len(enemys)
 scoreboard.prep_score()
 # 渲染最高分
 check_high_score(settings, scoreboard)
 # 等达到等级数量升级并渲染新等级
 settings.level_number -= 1
 
 if settings.level_number == 0:
 settings.increase_speed()
 settings.level += 1
 scoreboard.prep_level()
 # 还原为4(同settings一致)
 settings.level_number = 10
 # 加快生成敌机 
 if settings.enemy_frequency_space > 10:
 settings.enemy_frequency_space -= 10
 # 遍历key值 返回的碰撞敌机
 for enemy_down in enemies1_down:
 # 点击销毁的敌机到列表
 enemies_down.add(enemy_down)
 # 敌机被子弹击中效果显示
 for enemy_down in enemies_down:
 if enemy_down.down_index == 0:
 pass
 if enemy_down.down_index > 7:
 enemies_down.remove(enemy_down)
 continue
 #显示碰撞图片
 screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect)
 enemy_down.down_index += 1
 # 显示精灵
 enemies.draw(screen) 
 
# 子弹
def fire_bullet(settings, screen, player, bullets):
 """创建子弹"""
 new_bullet = Bullet(settings, screen, player)
 bullets.add(new_bullet)
def update_bullets(screen, bullets):
 """更新子弹的位置,并删除已消失的子弹"""
 # 更新子弹的位置
 bullets.update()
 
 # 删除已消失的子弹并同时更新飞船的生命
 for bullet in bullets.copy():
 if bullet.rect.top < screen.get_rect().top:
 bullets.remove(bullet)
 
# 分数
def check_high_score(settings, scoreboard):
 """检查是否诞生了新的最高得分"""
 if settings.score > settings.high_score:
 settings.high_score = settings.score
 scoreboard.prep_high_score()
 
# 屏幕
def update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets):
 """ 更新屏幕上的图像,并切换到新屏幕 """
 # 绘制飞船到屏幕
 player.draw_player()
 # 绘制子弹到屏幕 
 for bullet in bullets.sprites():
 bullet.draw_bullet()
 # 渲染记分牌信息
 scoreboard.show_score()
 # 
 if settings.player_limit == 0:
 settings.game_active = False
 settings.reset_stats()
 # 清空矩形列表和子弹列表
 enemies.empty()
 bullets.empty()
 
 screen_rect = screen.get_rect()
 player.rect.centerx = screen_rect.centerx
 player.rect.bottom = screen_rect.bottom
 
 # 如果游戏处于非活动状态,就绘制 Play 按钮
 if not settings.game_active:
 play_button.draw_button()
 # 让最近绘制的屏幕可见
 pygame.display.flip()

9.新建文件shootingenemy.py,主函数用来初始化程序,并同步更新程序的信息;

import pygame
from pygame.sprite import Group
from settings import Settings
from button import Button
from player import Player
import game_functions as gf
from scoreboard import Scoreboard
 
def run_game():
 pygame.init()
 # 初始化全部音频,并加载爆炸声音乐
 pygame.mixer.init()
 # 等待1s
 pygame.time.delay(1000)
 pygame.mixer.music.load('file/bgsound.mp3')
 # -1代表无限循环(背景音乐)
 pygame.mixer.music.play(-1)
 # 爆炸声
 explosiveSound = pygame.mixer.Sound('file/explosiveSound.wav')
 # 枪声
 fireSound = pygame.mixer.Sound('file/fireSound.wav')
 # 游戏循环帧率设置
 clock = pygame.time.Clock()
 
 settings = Settings()
 screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
 # 全屏显示
 # screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
 pygame.display.set_caption('飞机大战')
 # 左上角图标
 ic_launcher = pygame.image.load('images/ic_launcher.png').convert_alpha()
 pygame.display.set_icon(ic_launcher)
 # 背景图
 background = pygame.image.load('images/background.png').convert_alpha()
 
 # 敌机图片
 enemy_img1= pygame.image.load('images/enemy1.png')
 enemy_img2= pygame.image.load('images/enemy2.png')
 enemy_img3= pygame.image.load('images/enemy3.png')
 enemy_img4= pygame.image.load('images/enemy4.png')
 # 敌机不同状态的图片列表,多张图片展示为动画效果
 enemy_down_imgs = []
 enemy_down_imgs.append(enemy_img1)
 enemy_down_imgs.append(enemy_img2)
 enemy_down_imgs.append(enemy_img3)
 enemy_down_imgs.append(enemy_img4)
 # 储存敌机
 enemies = Group()
 # 存储被击毁的飞机,用来渲染击毁动画
 enemies_down = Group() 
 
 # 创建Play按钮
 play_button = Button(screen, 'Play')
 
 # 创建飞船
 player = Player(settings, screen)
 # 创建子弹的编组
 bullets = Group()
 # 创建记分牌
 scoreboard = Scoreboard(settings, screen)
 
 while True:
 # 绘制背景
 screen.blit(background, (0, 0))
 # 控制游戏最大频率
 clock.tick(60)
 
 # 检查玩家输入(不加会导致一直加载)
 gf.check_events(settings, screen, player, play_button, scoreboard, bullets, fireSound)
 if settings.game_active:
 # 更新飞船位置
 player.update()
 # 更新敌机
 gf.update_enemies(settings, screen, scoreboard, enemies, enemies_down, enemy_down_imgs, player, bullets, explosiveSound)
 # 更新子弹位置
 gf.update_bullets(screen, bullets)
 # 更新屏幕信息
 gf.update_screen(settings, screen, player, play_button, scoreboard, enemies, bullets)
 
run_game(),

10.在文件shootingenemy.py目录路径下,执行命令“python shootingenemy.py”弹出窗口,即可对其操作游玩。

结语

该游戏加入了背景音乐、射击声、子弹射中敌机的爆炸声和爆炸效果、生命数、积分、等级、最高分和开始按钮等元素,大家也可以自行加入其它好玩的元素。

更多关于python游戏的精彩文章请点击查看以下专题:

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python strip()函数 介绍
May 24 Python
python数据结构之二叉树的统计与转换实例
Apr 29 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
Python爬取京东的商品分类与链接
Aug 26 Python
Python实现统计代码行的方法分析
Jul 12 Python
Python 错误和异常代码详解
Jan 29 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
python列表的逆序遍历实现
Apr 20 Python
Django 实现图片上传和下载功能
Dec 31 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
Python调用Windows命令打印文件
Feb 07 #Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 #Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 #Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 #Python
python第三方库学习笔记
Feb 07 #Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 #Python
tensorflow之自定义神经网络层实例
Feb 07 #Python
You might like
追求程序速度,而不是编程的速度
2008/04/23 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
form自动提交实例讲解
2017/07/10 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
JS实现日期时间动态显示的方法
2015/12/07 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
Python删除n行后的其他行方法
2019/01/28 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python读取xml文件方法解析
2020/08/04 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
商场总经理岗位职责
2014/02/03 职场文书
平安校园建设方案
2014/05/02 职场文书
2014年师德师风学习材料
2014/05/16 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
早读课迟到检讨书
2014/09/25 职场文书
办公室规章制度范本
2015/08/04 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript