最近在学习pygame,就写了个俄罗斯方块玩玩,完成了基本的功能,后续在加入
需要安装pygame,ubuntu用户 sudo apt-get install python-pygame
代码入下
#-* coding:UTF-8 -*
#!/usr/bin/env python
import copy
import pygame
import random
ALL_BLOCKS = [
[
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0]
],
[
[0, 0, 0, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
]
def get_block():
return random.choice(ALL_BLOCKS)
def get_line_block():
return ALL_BLOCKS[0]
def rorate_block(block):
'''
90度旋转方块
'''
new_block = [[0 for col in range(5)] for row in range(5)]
for x in range(5):
for y in range(4, -1, -1):
new_block[y][x] = block[x][4 - y]
return new_block
def print_block(block):
for line in block:
print '%s \n' % line
def init_map(max_x, max_y, wall_widith, wall_height):
'''
初始化地图,上左右加入墙壁
'''
maps = [[0 for col in range(max_x)]for cell in range(max_y)]
for y in range(max_y):
for x in range(max_x):
if x < wall_widith or x > max_x - wall_widith - 1 or y > max_y - wall_height:
maps[y][x] = 1
return maps
SCREEN_SIZE = WIDTH, HEIGHT = [480, 660]
BACKGROUND_COLOR = (123, 22, 33)
BLOCK_COLOR = (33, 124, 33)
WALL_COLOR = (14, 233, 4)
WALL_WIDTH = 3
WALL_HEIGHT = 4
#地图从(0,0)坐标开始画
MAP_BEGIN_POINT = [0, 0]
#地图的最大行数和列数
MAX_X, MAX_Y = 16, 22
#方块的边长
RECT_SIZE = [WIDTH/MAX_X, HEIGHT/MAX_Y]
#屏幕中央的x坐标
CENTER_X = int(MAX_X / 2) - 3
#地图的数据
MAP_DATA = init_map(MAX_X, MAX_Y, WALL_WIDTH, WALL_HEIGHT)
#方块的起始位置
BLOCK_START_POINT = [CENTER_X, -1]
#每秒的帧数
FPS = 40
#方块的下落速度
SPEED = 1
#方块自由体积下落的时间间隔
FALL_PER_SECONDS = 1
def draw(block_data, start_point, map_data, screen):
'''
将方块的数据画到地图上,二维数组的传递是传址的
一维数组使用[:]复制,二维数组使用deepcopy
'''
_map_data = copy.deepcopy(map_data)
_map_start_point = MAP_BEGIN_POINT[:]
#更新地图
update_map(block_data, start_point, _map_data)
#print_block(_map_data)
begin_x = _map_start_point[0]
#画含有方块的地图
for line in _map_data:
for block in line:
#print 'draw at %s,%s' % (_start_point[0],_start_point[1])
rect = pygame.Rect(_map_start_point, RECT_SIZE)
if block == 0:
pygame.draw.rect(screen, BLOCK_COLOR, rect)
if block == 1:
pygame.draw.rect(screen, WALL_COLOR, rect, 1)
_map_start_point[0] += RECT_SIZE[0]
_map_start_point[1] += RECT_SIZE[1]
_map_start_point[0] = begin_x
def update_map(block_data, start_point, map_data):
'''
将方块的数组画到地图的数组里面去
'''
_start_point_x = start_point[0]
_start_point_y = start_point[1]
for y in range(5):
for x in range(5):
#防止画到墙外面
#print '_start_point_x is %s' % _start_point_x
#print 'map_data[%s][%s] % s' % (_start_point_y+y,_start_point_x+x,map_data[_start_point_y+y][_start_point_x+x])
if _start_point_x + x <= WALL_WIDTH - 1 or _start_point_x + x >= MAX_X - WALL_WIDTH:
continue
if map_data[_start_point_y + y][_start_point_x + x] != 1:
map_data[_start_point_y + y][_start_point_x + x] = block_data[y][x]
def can_move(block_data, start_point, map_data):
'''
判断方块在地图里面是否发生相撞
'''
_start_point_x = start_point[0]
_start_point_y = start_point[1]
for y in range(5):
for x in range(5):
#print 'map_data[%s][%s] is: %s' % (_start_point_y + y, _start_point_x + x, map_data[_start_point_y + y][_start_point_x + x])
#到达两侧,不能移动
if block_data[y][x] and map_data[_start_point_y + y][_start_point_x + x]:
return False
return True
def get_clear_lines(map_data):
'''
判断哪些行可以进行消除,返回可以消除的行的y坐标集合
'''
#记录满行的行的y坐标
full_line_y_list = []
#如果整行都被1覆盖,则认为可以消除
#从最底部开始向上扫描,如果发现可以消除,只需要再扫描往上三行即可
for y in range(-WALL_HEIGHT, -MAX_Y + 1, -1):
if len([x for x in map_data[y] if x == 1]) == MAX_X:
full_line_y_list.append(y)
for y2 in range(1, 4):
if len([x for x in map_data[y - y2] if x == 1]) == MAX_X:
full_line_y_list.append(y - y2)
break;
return full_line_y_list
def clear_lines(map_data):
'''
循环满行的行,将数组依次下移
'''
full_line_y_list = get_clear_lines(map_data)
while full_line_y_list:
for full_line_y in full_line_y_list:
print 'full_line_y: %s' % full_line_y
for y in range(full_line_y, -MAX_Y + 1, -1):
for x in range(WALL_WIDTH, MAX_X - WALL_WIDTH):
#print 'map_data[%s][%s] = map_data[%s][%s]' % (y,x,y-1,x)
map_data[y][x] = map_data[y - 1][x]
#print_block(map_data)
full_line_y_list = get_clear_lines(map_data)
print 'full_line_y_list is %s' % full_line_y_list
def reach_bottom(block_data,block_left_top,map_data):
'''
让方块移动到最底部
'''
_block_left_top_x = block_left_top[0]
_block_left_top_y = block_left_top[1]
max_move_y = 0
for y in range(1,MAX_Y-WALL_HEIGHT+1):
if can_move(block_data, [_block_left_top_x, _block_left_top_y + y], map_data):
max_move_y += 1
else:
break
if max_move_y:
block_left_top[1] += max_move_y
update_map(block_data, block_left_top, map_data)
clear_lines(map_data)
print 'max_move_y is %s' % max_move_y
return max_move_y
def main():
pygame.init()
clock = pygame.time.Clock()
time_passed = 0
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32)
screen.fill(BACKGROUND_COLOR)
map_data = copy.deepcopy(MAP_DATA)
block_data = get_block()
block_left_top = BLOCK_START_POINT[:]
draw(block_data, block_left_top, map_data, screen)
#print 'can_move: %s' % can_move(block_data,block_left_top,map_data)
pygame.display.flip()
running = True
try:
while running:
time_passed_seconds = clock.tick(FPS) / 1000.0
time_passed += time_passed_seconds
#print 'moved: %s' % moved
#到达刷新的时间间隔
if int(round(time_passed))/FALL_PER_SECONDS == 1:
#移动一个距离,不能移动的时候,更新地图,获得新方块,清除行
_block_left_top_x = block_left_top[0]
_block_left_top_y = block_left_top[1]
_block_left_top_y += SPEED
if can_move(block_data,[_block_left_top_x,_block_left_top_y],map_data):
block_left_top[1] = _block_left_top_y
else:
update_map(block_data, block_left_top, map_data)
clear_lines(map_data)
block_data = get_block()
block_left_top = BLOCK_START_POINT[:]
#重置时间间隔
time_passed = 0
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
_block_left_top_x = block_left_top[0]
_block_left_top_y = block_left_top[1]
if event.key == pygame.K_UP:
pass
elif event.key == pygame.K_DOWN:
if not reach_bottom(block_data,block_left_top,map_data):
print 'game over'
block_data = get_block()
block_left_top = BLOCK_START_POINT[:]
elif event.key == pygame.K_LEFT:
if can_move(block_data, [_block_left_top_x - 1, _block_left_top_y], map_data):
block_left_top[0] -= 1
elif event.key == pygame.K_RIGHT:
if can_move(block_data, [_block_left_top_x + 1, _block_left_top_y], map_data):
block_left_top[0] += 1
elif event.key == pygame.K_SPACE:
test_rorate = rorate_block(block_data)
#print_block(test_rorate)
if can_move(test_rorate, block_left_top, map_data):
block_data = test_rorate
#print 'can_move: %s' % can_move(block_data,block_left_top,map_data)
#print_block(map_data)
screen.fill(BACKGROUND_COLOR)
draw(block_data, block_left_top, map_data, screen)
pygame.display.update()
finally:
pygame.quit()
if __name__ == '__main__':
main()
分享到:
相关推荐
python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。python基于pygame的俄罗斯方块小游戏源码。...
【使用Pygame实现俄罗斯方块】 1. **初始化**:首先,你需要导入Pygame库并初始化,创建一个游戏窗口。设置窗口大小和标题,根据游戏需求调整背景色。 2. **方块设计**:定义方块的形状和颜色,通常有七种不同的...
在“pygame做的俄罗斯方块游戏”项目中,开发者利用pygame库实现了经典游戏——俄罗斯方块的完整功能。 首先,让我们了解一下pygame库的核心功能。pygame包括窗口管理器、事件处理、颜色管理、图像绘制、声音播放等...
近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序用Python语言编写俄罗斯方块,左侧显示正在运行的游戏,右边显示下一个出现的...
俄罗斯方块(图形界面pygame实现);俄罗斯方块(图形界面pygame实现);俄罗斯方块(图形界面pygame实现);俄罗斯方块(图形界面pygame实现);俄罗斯方块(图形界面pygame实现);俄罗斯方块(图形界面pygame实现);俄罗斯...
本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 Github:Tetris 代码: # -*- coding:utf-8 -*- import pygame, sys, random, copy from pygame.locals import * pygame.init() ...
该项目是一款基于Python和pygame库实现的俄罗斯方块游戏源码,总计包含24个文件,包括13个Python源文件、8个PNG图片文件、1个Git忽略文件、1个LICENSE授权文件和1个Markdown描述文件。
该俄罗斯方块是有Python编写而成的。它具有对游戏的正常操作,可以控制方块下落位置、下落时改变方向,以及对方块的直接下落。该游戏分左右两个界面,左边显示游戏的运行状态,右边显示游戏下一个即将出现的方块,...
本项目是使用Pygame实现的经典游戏——俄罗斯方块。 在俄罗斯方块游戏中,玩家需要操控各种形状的方块(通常由四个单位方格组成)从屏幕顶部下落,并在合适的位置排列。当一列或几列方块堆满时,它们将被消除,玩家...
本文实例为大家分享了pygame库实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 import random,time,pygame,sys from pygame.locals import *#导pygame内定义的一些常量 FPS=25#每秒传输帧数(刷新率),...
用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2) 代码构架 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块3) 实现说明 用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯...
最近学python,然后做了点小东西,python2.51/pygame1.7编译,
《计算机毕业设计:Python实现的PyGame的俄罗斯方块游戏》是一项集趣味性与学习性于一体的优质资源,特别适合本科课程设计、毕业设计以及Python学习者使用。此资源利用Python编程语言结合PyGame库,成功实现了一款...
在本文中,我们将深入探讨如何使用Python的pygame库来实现经典的俄罗斯方块游戏。首先,我们需要了解pygame库,它是一个用于创建游戏的Python模块,提供了丰富的图形、音频和事件处理功能。 游戏的核心元素包括游戏...
该俄罗斯方块是有Python编写而成的。它具有对游戏的正常操作,可以控制方块下落位置、下落时改变方向,以及对方块的直接下落。该游戏分左右两个界面,左边显示游戏的运行状态,右边显示游戏下一个即将出现的方块,...
在本项目中,"Python课程设计之俄罗斯方块"是一个基于Python编程语言实现的经典游戏——俄罗斯方块。这个课程设计旨在帮助学生理解Python的基本语法、控制结构、对象导向编程以及图形用户界面(GUI)的创建。以下是...
《俄罗斯方块源代码加详细注释》是一个非常适合初学者学习的游戏开发资源,它提供了完整的俄罗斯方块游戏的源代码,并且附带了详尽的注释,方便理解每个部分的功能和逻辑。在这个项目中,我们可以深入学习到游戏编程...
总的来说,基于pygame的俄罗斯方块小游戏是一个很好的学习资源,它涵盖了游戏开发的基础知识,包括图形绘制、事件处理、游戏逻辑和用户交互等。通过理解和修改这个游戏的代码,开发者可以深入理解pygame库的使用,...
在本教程中,我们将深入探讨如何使用Python的pygame模块来创建一个基本的俄罗斯方块游戏。首先,让我们了解几个关键概念和技术。 1. **pygame模块**:pygame是Python的一个库,用于开发2D图形和游戏。它提供了丰富...