java2python 发表于 2020-6-18 00:33:37

也用pygame做了俄罗斯方块,150行

只完成了最简单的功能,
由于存在转动数据,这个实在不好意思全部手动输入(实际代码行数超过了手动输入),强行转动(最后一个图形实在无奈,只能手动调整,转动取整后,图形位置移动了,只有这一个,耍赖了一把)

代码:

import sys
import pygame
from pygame.locals import *
import random

class Block:
    blk_color = [(255, 255, 255),(255, 255, 0),(255, 0, 255),(0, 255, 255),(255, 0, 0),(0, 255, 0),(0, 0, 255),(32,32,32)]
    BLANK = 7
    type_coord=[[[-1,0],,,]\
      ,[[-1,0],,,]\
      ,[[-1,0],,[-1,1],]\
      ,[[-1,0],,,]\
      ,[,,[-1,1],]\
      ,[[-1,0],,,]\
      ,[[-1,0],,,[-1,1]]]
    type_rotate = []
   
    def __init__(self,x,y,blk,angle):
      self.x = x
      self.y = y
      self.blk = blk
      self.angle = angle
      
    @staticmethod
    def rotate(no):
      rt_all = []
      rt = Block.type_coord[:]
      cx,cy=0,0
      for b in range(4):
            rt,rt = rt*4,rt*4
            cx += rt
            cy += rt
      cx = (cx)//8*2 if no !=6 else (cx+4)//8*2
      cy = (cy)//8*2 if no !=6 else (cy-4)//8*2
      rt_all.append(rt)
      for r in range(3):
            rt_new = []
            for b in range(4):
                rt_new.append(),cy-(cx-rt)])
            rt_all.append(rt_new)
            rt = rt_new
      for r in range(4):
            for b in range(4):
                rt_all //= 4
                rt_all //= 4
      return rt_all
    @staticmethod
    def init_rotate():
      for r in range(7):
            Block.type_rotate.append(Block.rotate(r))

class TRS:
    screen = None
    map = [*10 for i in range(20)]
    STATUS = 0
    cbk = None

    def __init__(self,screen):
      TRS.screen = screen

    @staticmethod
    def action(key_pressed):
      if(key_pressed and TRS.check_action(TRS.cbk.x-1,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle)):
            TRS.cbk.x -= 1
      elif (key_pressed and TRS.check_action(TRS.cbk.x+1,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle)):
            TRS.cbk.x += 1
      elif (key_pressed and TRS.check_action(TRS.cbk.x,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle+1)):
            TRS.cbk.angle += 1
      elif (key_pressed and TRS.check_action(TRS.cbk.x,TRS.cbk.y+1,TRS.cbk.blk,TRS.cbk.angle)):
            TRS.cbk.y += 1
            
    @staticmethod
    def new_blk():
      TRS.cbk = Block(5,0,random.randint(0,6),0)
    @staticmethod
    def check_action(x,y,blk,angle):
      tr = Block.type_rotate
      for b in range(4):
            bx,by = x + tr,y + tr
            if(bx<0 or bx>9 or by <0 or by>19 or TRS.map!=Block.BLANK):
                return False
      return True
    @staticmethod
    def check_drop():
      if TRS.check_action(TRS.cbk.x,TRS.cbk.y+1,TRS.cbk.blk,TRS.cbk.angle):
            TRS.cbk.y += 1
      else:
            TRS.STATUS = 2
            
    @staticmethod
    def check_clear():
      blk = Block.type_rotate
      row = list({TRS.cbk.y + blk for i in range(4)})
      row.sort()
      row.reverse()
      for b in range(4):
            TRS.map]] = TRS.cbk.blk
      del_rows = 0
      for r in row:
            if not (Block.BLANK in TRS.map):
                TRS.map.pop(r)
                del_rows += 1
      for d in range(del_rows):
            TRS.map.insert(0,)
            
    @staticmethod
    def print_game():
      TRS.screen.fill((0, 0, 0))
      for row in range(20):
            for col in range(10):
                pygame.draw.rect(TRS.screen, Block.blk_color], ((col*21,row*21), (20, 20)), 0)
      blk = Block.type_rotate
      for b in range(4):
            pygame.draw.rect(TRS.screen, Block.blk_color, (((TRS.cbk.x+blk)*21,(TRS.cbk.y+blk)*21), (20, 20)), 0)
class App:
    def __init__(self):
      pygame.init()
      screen = pygame.display.set_mode((300,430))
      Block.init_rotate()
      TRS(screen)
      
    #@staticmethod
    def main(self):
      clock = pygame.time.Clock()   # 创建游戏时钟
      count = 1
      # 进入游戏循环
      while True:
            # 设置刷新帧率
            clock.tick(15)
         
            # 事件检测
            for event in pygame.event.get():
                if event.type == pygame.QUIT:   # 退出事件
                  sys.exit()
                  
            if TRS.STATUS == 0:
                TRS.new_blk()
                if TRS.check_action(TRS.cbk.x,TRS.cbk.y,TRS.cbk.blk,TRS.cbk.angle):
                  TRS.STATUS = 1
                else:
                  TRS.STATUS = 3
                  print("GAME OVER")
            elif TRS.STATUS == 1:
                TRS.action(pygame.key.get_pressed())
                if count % 10 == 0:
                  TRS.check_drop()
            elif TRS.STATUS == 2:
                TRS.check_clear()
                TRS.STATUS = 0

            TRS.print_game()
            pygame.display.update()   #刷新屏幕
            count += 1

App().main()

java2python 发表于 2020-6-18 00:35:14

一打开高级功能,图形,附件全弄不上去了,只能回帖:
页: [1]
查看完整版本: 也用pygame做了俄罗斯方块,150行