最近在学习pygame,就写了个俄罗斯方块玩玩,完成了基本的功能,后续在加入

需要安装pygame,ubuntu用户 sudo apt-get install python-pygame

代码入下

#-* coding:UTF-8 -*
#!/usr/bin/env pythonimport copy
import pygame
import randomALL_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_blockdef print_block(block):for line in block:print '%s \n' % linedef 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] = 1return mapsSCREEN_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 = 1def 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_xdef 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:continueif 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 Falsereturn Truedef 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_listdef 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_yfor 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_listdef 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 = 0for 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:breakif max_move_y:block_left_top[1] += max_move_yupdate_map(block_data, block_left_top, map_data)clear_lines(map_data)print 'max_move_y is %s' % max_move_yreturn max_move_ydef main():pygame.init()clock = pygame.time.Clock()time_passed = 0screen = 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 = Truetry:while running:time_passed_seconds = clock.tick(FPS) / 1000.0time_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 += SPEEDif can_move(block_data,[_block_left_top_x,_block_left_top_y],map_data):block_left_top[1] = _block_left_top_yelse: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 = 0for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif 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:passelif 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] -= 1elif 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] += 1elif 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()

用pygame写了个俄罗斯方块相关推荐

  1. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...

    游戏是为了什么而存在的?Bingo,是为了娱乐~ 在这个最高主题之前,技术啥的什么都无所谓! 前一段时间,有位姓刘的网友用Pygame写了个俄罗斯方块,在用py2exe打包的时候遇到一些问题,和我交流 ...

  2. python用户界面游戏_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)...

    我们接着来做这个整死人不偿命的俄罗斯方块. 代码组织和名词约定 上一次我们稍微整理了一下游戏运行的框架,这里需要整理一下python代码的框架,一个典型的pygame脚本结构如下: 其中,lib为py ...

  3. python教程是用什么博客写的-用Python和Pygame写游戏-从入门到精通(目录)

    目光博客一开始,就有一个将pygame好好介绍一遍的宏伟计划,历时四个月,在各位朋友的关怀鞭策下,如今(2011/8/26)理论学习的部分似乎已经都完成了,在次列一个目录,方便查询.介绍还不是很全,下 ...

  4. 用Python和Pygame写游戏-从入门到精通(1)

    From: http://eyehere.net/2011/python-pygame-novice-professional-1/ 博客刚开,打算做一个Pygame的系列,翻译自Will McGug ...

  5. python是一门面向什么的语言用词语填空_使用pygame写一个古诗词填空通关游戏

    之前写的诗词填空的游戏支持python2,现在对程序进行了修改,兼容支持python2和python3,附下效果图. 下面是两个主程序 idiom_lib.py代码: # -*- coding=utf ...

  6. pygame写游戏,常用代码记录

    2019独角兽企业重金招聘Python工程师标准>>> pygame 写起游戏来还是挺不错的,不过我也没用过别的什么东西写,所以也没什么发言权. 些游戏我是从这篇文章开始入门的13岁 ...

  7. python的pygame库使用方法_python基础教程使用Python第三方库pygame写个贪吃蛇小游戏...

    今天看到几个关于pygame模块的博客和视频,感觉非常有趣,这里照猫画虎写了一个贪吃蛇小游戏,目前还有待完善,但是基本游戏功能已经实现,下面是代码: # 导入模块 import pygame impo ...

  8. 如何用Pygame写游戏(一)

    转载地址:http://eyehere.net/2011/python-pygame-novice-professional-1/ Pygame的历史  Pygame是一个利用SDL库的写就的游戏 ...

  9. pygame写的弹力球

    这是pygame写的弹力球 运行效果: ======================================================== 代码部分: ================= ...

最新文章

  1. EF6连接MySql,网上那些所谓解决方案提供者你们够了
  2. AVFoundation和 GPUImage初探
  3. 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
  4. V4L2编程 视频采集
  5. python partition函数_如何使用正确的姿势进行高效Python函数式编程?
  6. android6.0 sd卡卸载api,android6.0 用户关掉sd卡读取权限的情况下, 还能做到手机缓存么?...
  7. 感性精品高清PSD美手分层海报,一键替换,奢华品、首饰、护肤品推荐临摹应用
  8. 软件测试--中间件介绍
  9. base | 使用apply族函数进行向量化运算
  10. 有哪些写给自己的句子?
  11. Azure powershell 获取 vmSize 可用列表的命令
  12. C语言SOCKET编程指南
  13. 如何编写python代码
  14. 【iOS开发】——weak底层原理
  15. Android账号管理系统详解
  16. 立创EDA——PCB的走线(五)
  17. leetcode--石子游戏
  18. 文件上传绕过姿势整理
  19. 猴子选大王(c语言)
  20. Android vivo手机无法调试安装Apk的解决办法

热门文章

  1. 80x86 汇编语言编程:判定数据序列的奇偶个数
  2. 想装吗?看看装B大全
  3. 朋友圈广告投放优势及广告投放案例分享
  4. css3实现旋转魔方
  5. 听说你还在花钱从网上买 PPT 模板?
  6. mysql总是出乱码怎么办_mysql数据库出现乱码怎么办
  7. 多目标优化拥挤距离计算
  8. 阿里cai鸟一二三面+HR面
  9. 这些网络流行语是什么意思!打工是不可能打工的,这辈子不可能打工的!(来自窃·格瓦拉的名言)
  10. 2.1数据类型、变量和常量