Игра Раскраска написана на Питоне с использованием графической библиотеки GTK. Правила игры просты, необходимо закрасить всё поле в один цвет начиная с левого верхнего угла.
Программа состоит из двух файлов example.glade и example.py. Запускается из командной строки командой ./example.py.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="title" translatable="yes">"Раскраска" Автор Диордица АА Лицензия Simplified BSD Желаю уДачи</property>
<property name="default_width">801</property>
<property name="default_height">801</property>
<signal name="button-press-event" handler="on_click" swapped="no"/>
<signal name="destroy" handler="on_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
<child>
<object class="GtkDrawingArea" id="colorDraw">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
</object>
</interface>
Листинг 1. XML файл example.glade
#!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width:$
# Автор программы Диордица АА
# Лицензия Simplified BSD
# Желаю уДачи
#
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject
import random, math, cairo
XML_FILE = "example.glade"
SIDE = 17 # элементов
SIZE = 47 # пикселей
COLORSCHEMES = ((1,0,0),(0,1,0),(0,0,1),(0.95,0.9,0),(1,0,1),(0.6,0.5,0.5))
PLAYGROUND = [] # Цветное поле int
ZONE = [] # Занятая зона boolean
for row in range (SIDE+1): # сторока
tmp1 = []
tmp2 = []
for col in range (SIDE+1): # столбец
rnd = random.randint(0, len(COLORSCHEMES)-1)
tmp1.append(rnd)
tmp2.append(False)
PLAYGROUND.append(tmp1)
ZONE.append(tmp2)
THISCOLOR = PLAYGROUND[0][0] # выбранный цвет, в начале в квадрате с координатами 0,0
ZONE[0][0] = True
def do_draw(self, cr):
global CAIRO_OBJ
for row in range (SIDE):
for col in range (SIDE):
cr.set_source_rgb(*COLORSCHEMES[PLAYGROUND[row][col]])
cr.rectangle(col * SIZE + 1, row * SIZE + 1, SIZE, SIZE)
cr.fill()
def play_game():
for n in range (4):
for row in range (SIDE):
for col in range (SIDE):
if (ZONE[row][col]):
if (PLAYGROUND[row][col+1] == THISCOLOR):
ZONE[row][col+1] = True
if (PLAYGROUND[row+1][col] == THISCOLOR):
ZONE[row+1][col] = True
for row in range (SIDE, 0, -1):
for col in range (SIDE, 0, -1):
if (ZONE[row][col]):
if (PLAYGROUND[row][col-1] == THISCOLOR):
ZONE[row][col-1] = True
if (PLAYGROUND[row-1][col] == THISCOLOR):
ZONE[row-1][col] = True
for row in range (0, SIDE):
for col in range (0, SIDE):
if (ZONE[row][col]):
PLAYGROUND[row][col] = THISCOLOR
colordr.queue_draw()
k = True
for row in range (SIDE):
for col in range (SIDE):
k = k and ZONE[row][col]
if (k):
if (len(win.get_title())>0):
win.set_title("Хороший результат")
else:
win.set_title("Средний результат")
class Handler:
def on_destroy(self, *args):
Gtk.main_quit()
def on_click(self, *args):
global THISCOLOR, CAIRO_OBJ
coord = win.get_pointer()
col = (coord[0]-2)//SIZE
row = (coord[1]-2)//SIZE
if (row<SIDE and col<SIDE):
if (THISCOLOR != PLAYGROUND[row][col]):
THISCOLOR = PLAYGROUND[row][col]
#print(win.get_title())
win.set_title("* " * (len(win.get_title())//2-1))
play_game()
builder = Gtk.Builder()
builder.add_from_file(XML_FILE)
builder.connect_signals(Handler())
win = builder.get_object("window")
colordr = builder.get_object("colorDraw")
colordr.connect('draw', do_draw)
play_game()
win.show_all()
Gtk.main()
Листинг 2. Программа на Python, файл example.py
Рис. 1. Игра "Раскраска".
Во время игры, количество ходов подсчитывается в строке заголовка программы.