用python 写一个俄罗斯方块的小游戏

时间: 2023-12-07 13:38:10 浏览: 16
好的,下面是一个简单的俄罗斯方块小游戏的Python代码示例,基于Pygame库: ```python import pygame import random pygame.init() # 游戏窗口大小 WINDOW_WIDTH = 400 WINDOW_HEIGHT = 600 # 方块大小 BLOCK_SIZE = 20 # 游戏区域大小 PLAY_WIDTH = 10 * BLOCK_SIZE PLAY_HEIGHT = 20 * BLOCK_SIZE # 游戏区域位置 PLAY_X = (WINDOW_WIDTH - PLAY_WIDTH) // 2 PLAY_Y = WINDOW_HEIGHT - PLAY_HEIGHT - 50 # 方块类型和颜色 SHAPES = [ ([(0, 0), (1, 0), (2, 0), (3, 0)], (255, 0, 0)), # I ([(0, 0), (1, 0), (0, 1), (1, 1)], (0, 255, 0)), # O ([(0, 0), (1, 0), (1, 1), (2, 1)], (0, 0, 255)), # J ([(2, 0), (1, 0), (1, 1), (0, 1)], (255, 255, 0)), # L ([(1, 0), (0, 1), (1, 1), (2, 1)], (255, 0, 255)), # T ([(0, 1), (1, 1), (1, 0), (2, 0)], (0, 255, 255)), # Z ([(2, 1), (1, 1), (1, 0), (0, 0)], (255, 128, 0)), # S ] # 初始化游戏窗口 window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("俄罗斯方块") # 游戏区域背景颜色 PLAY_BG_COLOR = (0, 0, 0) # 方块移动速度 FPS = 60 clock = pygame.time.Clock() class Block: def __init__(self, shape, color): self.shape = shape self.color = color self.x = PLAY_X + PLAY_WIDTH // 2 - BLOCK_SIZE * 2 self.y = PLAY_Y - BLOCK_SIZE * 4 # 旋转方块 def rotate(self): self.shape = [(y, -x) for x, y in self.shape[::-1]] # 移动方块 def move(self, dx, dy): self.x += dx * BLOCK_SIZE self.y += dy * BLOCK_SIZE # 在游戏区域中检查方块是否合法 def check_valid(self, board): for x, y in self.shape: if not (0 <= self.x + x * BLOCK_SIZE < PLAY_WIDTH and 0 <= self.y + y * BLOCK_SIZE < PLAY_HEIGHT) or board[ (self.y + y * BLOCK_SIZE) // BLOCK_SIZE][(self.x + x * BLOCK_SIZE) // BLOCK_SIZE]: return False return True # 在游戏区域中放置方块 def place(self, board): for x, y in self.shape: board[(self.y + y * BLOCK_SIZE) // BLOCK_SIZE][(self.x + x * BLOCK_SIZE) // BLOCK_SIZE] = self.color # 绘制方块 def draw(self, surface): for x, y in self.shape: pygame.draw.rect(surface, self.color, (self.x + x * BLOCK_SIZE, self.y + y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)) # 初始化游戏区域 board = [[(0, 0, 0) for _ in range(PLAY_WIDTH // BLOCK_SIZE)] for _ in range(PLAY_HEIGHT // BLOCK_SIZE)] # 初始化当前方块和下一个方块 current_block = Block(*random.choice(SHAPES)) next_block = Block(*random.choice(SHAPES)) # 初始化游戏分数 score = 0 # 游戏循环 while True: # 处理游戏事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() exit() elif event.key == pygame.K_LEFT: current_block.move(-1, 0) if not current_block.check_valid(board): current_block.move(1, 0) elif event.key == pygame.K_RIGHT: current_block.move(1, 0) if not current_block.check_valid(board): current_block.move(-1, 0) elif event.key == pygame.K_DOWN: current_block.move(0, 1) if not current_block.check_valid(board): current_block.move(0, -1) elif event.key == pygame.K_UP: current_block.rotate() if not current_block.check_valid(board): current_block.rotate() # 更新方块位置 current_block.move(0, 1) if not current_block.check_valid(board): current_block.move(0, -1) current_block.place(board) current_block = next_block next_block = Block(*random.choice(SHAPES)) # 消除满行 for y in range(len(board)): if all(board[y]): board.pop(y) board.insert(0, [(0, 0, 0) for _ in range(PLAY_WIDTH // BLOCK_SIZE)]) score += 10 # 绘制游戏界面 window.fill(PLAY_BG_COLOR) for y, row in enumerate(board): for x, color in enumerate(row): pygame.draw.rect(window, color, (PLAY_X + x * BLOCK_SIZE, PLAY_Y + y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)) current_block.draw(window) # 绘制分数 font = pygame.font.Font(None, 36) text = font.render("Score: " + str(score), True, (255, 255, 255)) window.blit(text, (10, 10)) # 绘制下一个方块 font = pygame.font.Font(None, 24) text = font.render("Next:", True, (255, 255, 255)) window.blit(text, (PLAY_X + PLAY_WIDTH + 20, PLAY_Y)) next_block.draw(window) pygame.display.update() # 控制游戏帧率 clock.tick(FPS) ``` 该代码实现了一个简单的俄罗斯方块小游戏,包括方块的移动、旋转、落下、消除满行等基本操作,还有分数统计和下一个方块的预览功能。可以通过改变游戏窗口大小、方块大小、方块类型和颜色、游戏区域大小等参数来进行自定义修改。

相关推荐

抱歉,我是语言模型AI,无法编写完整的游戏程序。但是,我可以提供一些思路和参考代码供您参考。 俄罗斯方块游戏的基本组成部分包括游戏界面、方块、游戏逻辑等。 游戏界面可以使用Pygame等Python游戏开发库来实现。方块可以用Python的二维列表来表示,每个方块可以用一个数字表示不同的类型。游戏逻辑包括控制方块的移动、旋转、落下以及消除已经填满的行等。 下面是一个简单的俄罗斯方块游戏的示例代码: python import pygame import random # 定义方块的类型和形状 tetrominoes = [ [[1, 1, 1], [0, 1, 0]], [[0, 2, 2], [2, 2, 0]], [[3, 3, 0], [0, 3, 3]], [[4, 0, 0], [4, 4, 4]], [[0, 0, 5], [5, 5, 5]], [[6, 6], [6, 6]] ] # 定义方块的颜色 colors = [ (0, 0, 0), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255) ] # 定义游戏区域大小 game_width = 10 game_height = 20 # 初始化游戏区域 game_area = [[0] * game_width for i in range(game_height)] # 初始化方块位置和类型 current_tetromino = tetrominoes[random.randint(0, len(tetrominoes) - 1)] current_x = game_width // 2 - len(current_tetromino[0]) // 2 current_y = 0 # 定义方块的移动和旋转 def move_left(): global current_x if check_collision(current_tetromino, current_x - 1, current_y): current_x -= 1 def move_right(): global current_x if check_collision(current_tetromino, current_x + 1, current_y): current_x += 1 def move_down(): global current_y if check_collision(current_tetromino, current_x, current_y + 1): current_y += 1 else: merge_tetromino() def rotate(): global current_tetromino current_tetromino = list(zip(*current_tetromino[::-1])) if not check_collision(current_tetromino, current_x, current_y): current_tetromino = list(zip(*current_tetromino[::-1])) # 检查方块是否和游戏区域发生碰撞 def check_collision(tetromino, x, y): for i in range(len(tetromino)): for j in range(len(tetromino[i])): if tetromino[i][j] != 0 and (y + i >= game_height or x + j < 0 or x + j >= game_width or game_area[y + i][x + j] != 0): return False return True # 合并方块到游戏区域 def merge_tetromino(): global current_tetromino, current_x, current_y for i in range(len(current_tetromino)): for j in range(len(current_tetromino[i])): if current_tetromino[i][j] != 0: game_area[current_y + i][current_x + j] = current_tetromino[i][j] current_tetromino = tetrominoes[random.randint(0, len(tetrominoes) - 1)] current_x = game_width // 2 - len(current_tetromino[0]) // 2 current_y = 0 # 消除已经填满的行 def clear_rows(): global game_area new_game_area = [[0] * game_width for i in range(game_height)] new_row = game_height - 1 for i in range(game_height - 1, -1, -1): if 0 not in game_area[i]: continue new_game_area[new_row] = game_area[i] new_row -= 1 game_area = new_game_area # 绘制游戏界面 def draw_game(): for i in range(game_height): for j in range(game_width): pygame.draw.rect(screen, colors[game_area[i][j]], (j * 30, i * 30, 30, 30), 0) for i in range(len(current_tetromino)): for j in range(len(current_tetromino[i])): if current_tetromino[i][j] != 0: pygame.draw.rect(screen, colors[current_tetromino[i][j]], ((current_x + j) * 30, (current_y + i) * 30, 30, 30), 0) pygame.display.update() # 初始化Pygame pygame.init() # 创建窗口 screen = pygame.display.set_mode((game_width * 30, game_height * 30)) # 设置游戏标题 pygame.display.set_caption('俄罗斯方块') # 游戏循环 while True: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: move_left() elif event.key == pygame.K_RIGHT: move_right() elif event.key == pygame.K_DOWN: move_down() elif event.key == pygame.K_UP: rotate() # 更新游戏界面 draw_game() # 检查是否需要消除已经填满的行 clear_rows() # 延时 pygame.time.delay(100) 这个示例代码实现了一个简单的俄罗斯方块游戏,使用了Pygame库来实现游戏界面和事件处理。具体的游戏逻辑实现在代码中有详细注释。您可以根据自己的需求和能力对代码进行修改和优化。
以下是一个简单的俄罗斯方块小游戏的Python代码: python import pygame import random # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) GRAY = (128, 128, 128) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # 定义方块的大小和形状 TETROMINOES = { 'I': [[1, 1, 1, 1]], 'J': [[1, 0, 0], [1, 1, 1]], 'L': [[0, 0, 1], [1, 1, 1]], 'O': [[1, 1], [1, 1]], 'S': [[0, 1, 1], [1, 1, 0]], 'T': [[0, 1, 0], [1, 1, 1]], 'Z': [[1, 1, 0], [0, 1, 1]] } # 初始化pygame pygame.init() # 设置窗口大小 WINDOW_SIZE = (400, 500) screen = pygame.display.set_mode(WINDOW_SIZE) # 设置标题 pygame.display.set_caption("Tetris") # 设置字体 font = pygame.font.Font(None, 36) # 定义方块类 class Tetromino: def __init__(self): self.x = 4 self.y = 0 self.shape = random.choice(list(TETROMINOES.keys())) self.rotation = 0 def rotate_left(self): self.rotation = (self.rotation - 1) % len(TETROMINOES[self.shape]) def rotate_right(self): self.rotation = (self.rotation + 1) % len(TETROMINOES[self.shape]) def move_left(self): self.x -= 1 def move_right(self): self.x += 1 def move_down(self): self.y += 1 def draw(self, surface): shape = TETROMINOES[self.shape][self.rotation] color = get_color(self.shape) for i in range(len(shape)): for j in range(len(shape[i])): if shape[i][j] == 1: pygame.draw.rect(surface, color, (self.x * 20 + j * 20, self.y * 20 + i * 20, 20, 20), 0) pygame.draw.rect(surface, BLACK, (self.x * 20 + j * 20, self.y * 20 + i * 20, 20, 20), 1) # 定义方块的颜色 def get_color(shape): if shape == 'I': return CYAN elif shape == 'J': return BLUE elif shape == 'L': return ORANGE elif shape == 'O': return YELLOW elif shape == 'S': return GREEN elif shape == 'T': return PURPLE elif shape == 'Z': return RED # 定义网格类 class Grid: def __init__(self): self.grid = [[BLACK for _ in range(10)] for _ in range(20)] def draw(self, surface): for i in range(len(self.grid)): for j in range(len(self.grid[i])): pygame.draw.rect(surface, self.grid[i][j], (j * 20, i * 20, 20, 20), 0) pygame.draw.rect(surface, GRAY, (j * 20, i * 20, 20, 20), 1) def check_lines(self): lines = 0 for i in range(len(self.grid)): if all(color != BLACK for color in self.grid[i]): self.grid.pop(i) self.grid.insert(0, [BLACK for _ in range(10)]) lines += 1 return lines def add_tetromino(self, tetromino): shape = TETROMINOES[tetromino.shape][tetromino.rotation] color = get_color(tetromino.shape) for i in range(len(shape)): for j in range(len(shape[i])): if shape[i][j] == 1: self.grid[tetromino.y + i][tetromino.x + j] = color # 定义游戏类 class Game: def __init__(self): self.grid = Grid() self.tetromino = Tetromino() self.next_tetromino = Tetromino() self.score = 0 def draw(self, surface): self.grid.draw(surface) self.tetromino.draw(surface) self.draw_score(surface) def draw_score(self, surface): score_text = font.render("Score: {}".format(self.score), True, WHITE) surface.blit(score_text, (10, 10)) def update(self): self.tetromino.move_down() if self.check_collision(): self.tetromino.move_up() self.grid.add_tetromino(self.tetromino) self.tetromino = self.next_tetromino self.next_tetromino = Tetromino() lines_cleared = self.grid.check_lines() if lines_cleared > 0: self.score += 10 * lines_cleared def check_collision(self): shape = TETROMINOES[self.tetromino.shape][self.tetromino.rotation] for i in range(len(shape)): for j in range(len(shape[i])): if shape[i][j] == 1: x = self.tetromino.x + j y = self.tetromino.y + i if x < 0 or x >= 10 or y >= 20 or self.grid.grid[y][x] != BLACK: return True return False # 创建游戏对象 game = Game() # 设置游戏循环 done = False clock = pygame.time.Clock() # 游戏循环 while not done: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: game.tetromino.move_left() if game.check_collision(): game.tetromino.move_right() elif event.key == pygame.K_RIGHT: game.tetromino.move_right() if game.check_collision(): game.tetromino.move_left() elif event.key == pygame.K_UP: game.tetromino.rotate_right() if game.check_collision(): game.tetromino.rotate_left() elif event.key == pygame.K_DOWN: game.tetromino.move_down() if game.check_collision(): game.tetromino.move_up() # 更新游戏状态 game.update() # 绘制屏幕 screen.fill(BLACK) game.draw(screen) pygame.display.flip() # 控制帧率 clock.tick(10) # 关闭pygame pygame.quit() 这个游戏实现了基本的俄罗斯方块玩法,可以使用键盘左右移动方块,上下旋转方块,下箭头加速下落方块,并计分和消除已经填满的行。你可以根据需求对代码进行修改和扩展。
当然可以!以下是一个简单版本的俄罗斯方块游戏的Python代码。在这个游戏中,你可以使用左、右、下箭头键控制方块的移动,使用上箭头键旋转方块。 python import pygame import random pygame.init() # 定义窗口大小和方块大小 SCREEN_WIDTH, SCREEN_HEIGHT = 300, 600 BLOCK_SIZE = 30 # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) # 定义形状的列表 SHAPES = [ [[1, 1, 1], [0, 1, 0]], [[1, 1, 1, 1]], [[1, 1], [1, 1]], [[1, 1, 0], [0, 1, 1]], [[0, 1, 1], [1, 1, 0]], [[1, 1, 1], [1, 0, 0]], [[1, 1, 1], [0, 0, 1]] ] class TetrisGame: def __init__(self): self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('俄罗斯方块') self.clock = pygame.time.Clock() self.game_over = False self.board = [[0] * (SCREEN_WIDTH // BLOCK_SIZE) for _ in range(SCREEN_HEIGHT // BLOCK_SIZE)] self.current_shape = self.new_shape() def new_shape(self): shape = random.choice(SHAPES) color = random.choice(pygame.color.THECOLORS.keys()) return {'shape': shape, 'color': pygame.color.Color(color), 'x': SCREEN_WIDTH // 2 // BLOCK_SIZE * BLOCK_SIZE - len(shape[0]) * BLOCK_SIZE // 2, 'y': 0} def draw_shape(self, shape, offset): for y, row in enumerate(shape): for x, cell in enumerate(row): if cell: pygame.draw.rect(self.screen, shape['color'], (shape['x'] + x * BLOCK_SIZE + offset[0], shape['y'] + y * BLOCK_SIZE + offset[1], BLOCK_SIZE, BLOCK_SIZE)) def check_collision(self, shape, offset): for y, row in enumerate(shape): for x, cell in enumerate(row): if cell: board_x = (shape['x'] + x * BLOCK_SIZE + offset[0]) // BLOCK_SIZE board_y = (shape['y'] + y * BLOCK_SIZE + offset[1]) // BLOCK_SIZE if board_x < 0 or board_x >= len(self.board[0]) or board_y >= len(self.board) or self.board[board_y][board_x]: return True return False def merge_shape(self): for y, row in enumerate(self.current_shape['shape']): for x, cell in enumerate(row): if cell: board_x = (self.current_shape['x'] // BLOCK_SIZE) + x board_y = (self.current_shape['y'] // BLOCK_SIZE) + y self.board[board_y][board_x] = self.current_shape['color'] self.current_shape = self.new_shape() if self.check_collision(self.current_shape['shape'], (0, 0)): self.game_over = True def check_lines(self): lines_to_clear = [i for i, row in enumerate(self.board) if all(row)] for i in lines_to_clear: del self.board[i] self.board.insert(0, [0] * (SCREEN_WIDTH // BLOCK_SIZE)) return len(lines_to_clear) def run(self): while not self.game_over: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT and not self.check_collision(self.current_shape['shape'], (-BLOCK_SIZE, 0)): self.current_shape['x'] -= BLOCK_SIZE elif event.key == pygame.K_RIGHT and not self.check_collision(self.current_shape['shape'], (BLOCK_SIZE, 0)): self.current_shape['x'] += BLOCK_SIZE elif event.key == pygame.K_DOWN and not self.check_collision(self.current_shape['shape'], (0, BLOCK_SIZE)): self.current_shape['y'] += BLOCK_SIZE elif event.key == pygame.K_UP: rotated_shape = list(zip(*reversed(self.current_shape['shape']))) if not self.check_collision(rotated_shape, (0, 0)): self.current_shape['shape'] = rotated_shape if not self.check_collision(self.current_shape['shape'], (0, BLOCK_SIZE)): self.current_shape['y'] += BLOCK_SIZE else: self.merge_shape() lines_cleared = self.check_lines() print(f"Lines cleared: {lines_cleared}") self.screen.fill(WHITE) for y, row in enumerate(self.board): for x, color in enumerate(row): if color: pygame.draw.rect(self.screen, color, (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)) self.draw_shape(self.current_shape, (0, 0)) pygame.display.update() self.clock.tick(10) if __name__ == '__main__': game = TetrisGame() game.run() 在这个游戏中,方块会不断地从上方落下,你可以使用左、右、下箭头键控制方块的移动,使用上箭头键旋转方块。游戏中的目标是填满一行或多行,填满的行会消除,游戏区域没有空间时游戏结束。游戏结束后,控制台会输出消除的行数。你可以根据需要修改游戏的速度、颜色和其他参数。

最新推荐

Python小游戏之300行代码实现俄罗斯方块

主要给大家介绍了关于Python小游戏之300行代码实现俄罗斯方块的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

python实现俄罗斯方块小游戏

主要为大家详细介绍了python实现俄罗斯方块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

0690、断线检测式报警电路.rar

0689、短路检测式报警电路.rar

全国34个省份2000-2021高技术产业投资-施工项目数.xlsx

数据年度2000-2021 数据范围:全国34个省份,含港澳台 数据年度:2000-2021,22个年度的数据 excel数据文件包原始数据(由于多年度指标不同存在缺失值)、线性插值、ARIMA填补三个版本,提供您参考使用。 其中,ARIMA回归填补无缺失值。 填补说明: 线性插值。利用数据的线性趋势,对各年份中间的缺失部分进行填充,得到线性插值版数据,这也是学者最常用的插值方式。 ARIMA回归填补。基于ARIMA模型,利用同一地区的时间序列数据,对缺失值进行预测填补。

基于STM32单片机的DHT11温湿度模块的使用

使用方法 工程采用Keil MDK 5编写,基于STM32标准库 工程项目文件在 Project 文件夹内的 工程模板.uvprojx,双击即可打开。 可以复制 App文件夹下的 DHT11.c 和 DHT11.h文件到自己的项目中使用。 程序运行时不需要初始化外设,具体的初始化过程在以下函数内部调用了,我们只需要关注下面函数的用法即可。 函数说明 uint8_t DHT_Get_Temp_Humi_Data(uint8_t buffer[]) 使用此函数需要传入一个8位的的数组。分别用来存储 湿度整数部分、湿度小数部分、温度整数部分、温度小数部分、校验和,注意!湿度小数部分接收到的值始终为0。 函数有一个返回值,接收到正确数据返回1,错误返回0,建议在调用时先判断一下该返回值再进行其他操作。 只需要在自己的函数中重复调用即可,示例中是将该函数在while函数中每两秒重复调用,然后打印在OLED显示屏上。 其它 工程文件中包含了常见的0.96"、1.3"的OLED显示屏的驱动,驱动芯片为SSD1306,通过SPI方式连接到STM32,具体的引脚连接翻看oled.h文件中

网络技术-综合布线-河南农村宽带客户细分的研究.pdf

网络技术-综合布线-河南农村宽带客户细分的研究.pdf

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

理解Socket编程的基础概念

# 1. 介绍Socket编程的基本概念 ## 1.1 什么是Socket编程 Socket编程是一种在网络编程中使用的抽象概念,它允许应用程序通过网络进行通信。通过Socket编程,可以实现客户端与服务器端之间的数据交换和通信。 ## 1.2 Socket编程的应用范围 Socket编程广泛应用于网络通信领域,包括但不限于Web服务、即时通讯、网络游戏、远程控制等。 ## 1.3 Socket编程的基本原理 Socket编程基于网络套接字(socket)的概念,通过套接字建立连接、传输数据和关闭连接来实现通信。在Socket编程中,使用不同的协议(如TCP、UDP)来实现数据传输和通信

c语言桌子上有几堆糖果,每堆糖果的数量记录在一个整型数组 nums 中。我们可以每次选择任意一堆,拿走其中的一颗或者两颗糖果,求拿完所有糖果的最少次数。

好的,以下是 C 语言的实现代码: ```c #include <stdio.h> #include <stdlib.h> int min(int a, int b) { return a < b ? a : b; } int minSteps(int* nums, int numsSize) { int dp[numsSize + 1]; dp[0] = 0; dp[1] = 1; for (int i = 2; i <= numsSize; i++) { dp[i] = min(dp[i-1] + 1, dp[i-2] + 1)

供应链管理制度(全).ppt

供应链管理制度