Attachment 'txtscr.py'

Download

   1 #!/usr/bin/env python3
   2 '''
   3 Рисование фигур из символов на текстовом экране
   4 '''
   5 
   6 def init(width, height, paper="."):
   7     """Создаёт пустой экран (список строк) размером width×height,
   8     в качестве пустых элементов использовать строку paper.
   9     Возвращает экран.
  10     """
  11     return([paper*width for i in range(height)])
  12 
  13 def str(screen):
  14     """Преобразует экран в строку"""
  15     sep = "+"+"-"*len(screen[0])+"+"
  16     return(sep+"\n"+"\n".join("|"+s+"|" for s in screen)+"\n"+sep)
  17 
  18 def dot(screen, x, y, ink="*"):
  19     """Ставит точку (первый символ строки ink) нв экран screen по координатам x:y
  20     Выход за границы экрана обрезается по модулю
  21     """
  22     x = x % len(screen[0])
  23     y = y % len(screen)
  24     screen[y] = screen[y][:x]+ink[0]+screen[y][x+1:]
  25 
  26 def get(screen, x, y):
  27     """Возвращает символ экрана screen по координатам x,y
  28     Выход за границы экрана обрезается по модулю
  29     """
  30     x = x % len(screen[0])
  31     y = y % len(screen)
  32     return screen[y][x]
  33 
  34 def hline(screen, x, y, x1, ink="*"):
  35     """Проводит горизонтальный отрезок из символов ink на экране screen
  36     начиная с точки x:y и заканчивая точкой x1:y (координаты неотрицательные)"""
  37     for x0 in range(x,x1+1) if x<x1 else range(x1,x+1):
  38         dot(screen,x0,y,ink)
  39 
  40 def vline(screen, x, y, y1, ink="*"):
  41     """Проводит вертикальный отрезок из символов ink на экране screen
  42     начиная с точки x:y и заканчивая точкой x:y1 (координаты неотрицательные)"""
  43     for y0 in range(y,y1+1) if y<y1 else range(y1,y+1):
  44         dot(screen,x,y0,ink)
  45 
  46 def line(screen, x0, y0, x1, y1, ink="*"):
  47     """Проводит произвольный отрезок из символов ink на экране screen 
  48     начиная с точки x0:y0 и заканчивая точкой x0:y1 (координаты неотрицательные)"""
  49     x, y = x0, y0
  50     if x0 == x1:
  51         return vline(screen, x, y0, y1, ink)
  52     if y0 == y1:
  53         return hline(screen, x, y0, x1, ink)
  54     dx, dy = -1 if x1<x0 else 1, -1 if y1<y0 else 1
  55     dot(screen, x, y, ink)
  56     n = max(abs(x0-x1),abs(y0-y1))
  57     for i in range(n):
  58         x, y = x0+(x1-x0)*i//n, y0+(y1-y0)*i//n
  59         dot(screen, x, y, ink)
  60 
  61 def fill(screen, x, y, ink="#", paper="."):
  62     """Закрашивает связную область экрана screen из символов paper
  63     символами ink
  64     """
  65     turn = (0,1), (1,0), (0,-1), (-1,0)
  66     todo = [(x,y)]
  67     while todo:
  68         x,y = todo.pop()
  69         dot(screen,x,y,ink)
  70         for dx, dy in turn:
  71             if get(screen,x+dx,y+dy)==paper:
  72                 todo.append((x+dx,y+dy))
  73 
  74 if __name__ == "__main__":
  75     scr = init(60,20)
  76     print(str(scr))
  77     vline(scr,4,2,18,"+")
  78     print(str(scr))
  79     hline(scr,2,4,55,"@")
  80     print(str(scr))
  81     line(scr, 0,12,57,38)
  82     print(str(scr))
  83     line(scr, 10,19,58,7,"%")
  84     print(str(scr))
  85     fill(scr, 20, 10)
  86     print(str(scr))

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.