Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/155: Рейтинг темы: голосов - 155, средняя оценка - 4.74
8 / 6 / 2
Регистрация: 30.09.2019
Сообщений: 12

Пятнашки

30.09.2019, 21:35. Показов 34479. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для игры в пятнашки картинку надо разрезать на 16 частей (4 × 4 равных квадрата), а затем отбросить правый нижний квадратик.

Формат ввода
Квадратная картинка image.bmp, ширина которой кратна четырём.
Формат вывода
Создайте 15 картинок с именами вида imageXY.bmp, где X и Y — числа от 1 до 4 — номера строки и столбца соответственно, в которых данный фрагмент располагается на исходной картинке. Т.е. части должны иметь названия image11.bmp, image12.bmp, ..., image43.bmp.

вот мой код, в котором runtime-error:

Python
1
2
3
4
5
6
7
8
9
10
from PIL import Image
 
im = Image.open("image.bmp")
x, y = im.size
 
for i in range(4):
    for j in range(4):
        if i != 4 and j != 4:
            im.crop((i * (x / 4), j * (y / 4)), ((i + 1) * (x / 4), (j + 1) * (y / 4)))
            im.save('image{}{}.bmp').format(str(i + 1), str(j + 1))
Помогите найти и исправить ошибку!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2019, 21:35
Ответы с готовыми решениями:

Как сделать пятнашки?
Вот код который получился, я начинающий, напишите на понятном языке. Заранее спасибо from tkinter import * from random import * ...

Пятнашки
помогите в функции permutation массив не изменяется незнаю что делать буду очень благодарен import random def print_board(board:...

Программа собирающая пятнашки (3x3)
Вот собственно код import pprint pp = pprint.PrettyPrinter(indent=4) def puzz_astar(start, end): """ A* algorithm ...

5
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
30.09.2019, 22:12
Лучший ответ Сообщение было отмечено python4ik как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
from PIL import Image
 
im = Image.open("image.bmp")
x, y = im.size
 
for i in range(4):
    for j in range(4):
        if i != 4 and j != 4:
            im2 = im.crop((i * (x / 4), j * (y / 4), (i + 1) * (x / 4), (j + 1) * (y / 4)))
            im2.save('image{}{}.bmp'.format(str(i + 1), str(j + 1)))
1
1 / 1 / 0
Регистрация: 18.09.2019
Сообщений: 8
23.11.2019, 18:55
Python
1
2
3
4
5
6
7
8
9
10
from PIL import Image
 
im = Image.open("image.bmp")
x, y = im.size
 
for i in range(4):
    for j in range(4):
        if i != 4 and j != 4:
            im2 = im.crop((i * (x / 4), j * (y / 4), (i + 1) * (x / 4), (j + 1) * (y / 4)))
            im2.save('image{}{}.bmp'.format(str(j + 1), str(i + 1)))
1
5 / 5 / 0
Регистрация: 08.01.2020
Сообщений: 5
11.10.2020, 02:33
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from PIL import Image
from os import remove
 
# сначала откроем изображение для работы с ним
img = Image.open("image.bmp")
# теперь создадим кортеж с размерами картинки
x, y = img.size
 
for i in range(4):
    for j in range(4):
        if i != 4 and j != 4:
            # здесь производится нарезка картинки на 16 фрагментов
            # сначала заполняется первый столбик фрагментов, затем второй и тд
            img2 = img.crop((i * (x / 4), j * (y / 4), (i + 1) * (x / 4), (j + 1) * (y / 4)))
            # каждый из получившихся фрагментов сохраняется под определенным именем
            # после сохранения одного фрагмента, происходит переход к другому в том же столбике
            # если обработался 4 фрагмент столбика, начинается обработка след. столбца
            img2.save('image{x}{y}.bmp'.format(x=str(j + 1), y=str(i + 1)))
 
# здесь удаляется файл с последним фрагментом
remove('image44.bmp')
3
1 / 1 / 0
Регистрация: 30.01.2023
Сообщений: 5
19.09.2023, 16:18
Рабочий вариант без удаления файлов.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
from PIL import Image
 
 
im = Image.open('image.bmp')
x, y = im.size
for i in range(4):
    for j in range(4):
        im_crop = im.crop((j * int(x / 4), i * int(y / 4),
                           j * int(x / 4) + int(x / 4), i * int(y / 4) + int(y / 4)))
        name = f"{'image'}{i + 1}{j + 1}.bmp"
        if i + j < 6:
            im_crop.save(name)
            print(name)
Добавлено через 34 секунды
Последняя строка лишняя правда, забыл удалить.
1
0 / 0 / 1
Регистрация: 06.02.2025
Сообщений: 14
13.02.2025, 03:24
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# мой вариант
 
import random
from tkinter import *
from tkinter import messagebox
 
def on_closing():
    if messagebox.askokcancel("ВЫХОД", "Хотите выйти?"):
        window.destroy()
 
window = Tk()
window.protocol("WM_DELETE_WINDOW", on_closing)
window.title("ПЯТНАШКИ")
window.resizable(False, False)
window.wm_attributes("-topmost", 1)
window.geometry('600x480')
 
frame = Frame(window, bg="blue", width=476, height=480) # нужен для удаления старых кнопок 
frame.pack(anchor=NW)
 
step_x = 119 # ширина кнопки
step_y = 121 # высота кнопки
empty_x = 357 # начальная координата х пустой клетки
empty_y = 363 # начальная координата y пустой клетки
 
def move_button(event):
    global step_x
    global step_y
    global empty_x
    global empty_y
    
    current_x = event.widget.winfo_x() # текущая координата кнопки по x
    current_y = event.widget.winfo_y() # текущая координата кнопки по y
 
    if isinstance(event.widget,Button): # будет сдвиг виджета, только если этот виджет "кнопка"
        if abs(current_x - empty_x) > step_x or abs(current_y - empty_y) > step_y:
            pass
        elif abs(current_x - empty_x) == step_x and abs(current_y - empty_y) == step_y:
            pass    
        else:   
            if current_x < empty_x:
                event.widget.place(x=current_x+step_x, y=current_y)
                empty_x = empty_x - step_x
 
            if current_y < empty_y:
                event.widget.place(x=current_x, y=current_y+step_y)
                empty_y = empty_y - step_y
 
            if current_x > empty_x:
                event.widget.place(x=current_x-step_x, y=current_y)
                empty_x = empty_x + step_x
 
            if current_y > empty_y:
                event.widget.place(x=current_x, y=current_y-step_y)
                empty_y = empty_y + step_y
 
def new_game():
    global empty_x
    global empty_y
    global frame
    
    empty_x = 357 # начальная координата х пустой клетки
    empty_y = 363 # начальная координата y пустой клетки
 
    frame.destroy() # для обновления поля, удаления старых кнопок
    frame = Frame(window, bg="blue", width=476, height=480)
    frame.pack(anchor=NW)
 
# формируем новую матрицу кнопок со случайной нумерацией 
    list_= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
 
    for j in range(0, 364, step_y):
        for i in range(0, 358, step_x):
            if  i == 357 and j == 363:
                pass
            else:
                ch = random.choice(list_)
                list_.remove(ch)
                
                button = Button(
                text=str(ch),
                width=3,
                bg="gray",
                font='Arial 40',
                borderwidth=10)
                button.place(x = i, y = j) #расположение кнопок матрицей 4х4
 
new_game()
window.bind("<Button-1>", move_button)
 
button_new = Button(window, text="ЗАНОВО", font=("Arial", 12), bg="green", command=new_game) 
button_new.place(x=500, y=50)
 
window.mainloop()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2025, 03:24
Помогаю со студенческими работами здесь

Добавить в игру пятнашки условие проверки
Добавить в игру пятнашки условие проверки(Мы можем переставлять соседние с пустой ячейки. Через одну и по диагонали переставлять не можем) ...

нужно, чтобы номер хода в игре пятнашки считывался с файла
есть такой код:import numpy as np import time from pathlib import Path import json a = np.arange(0, 16) np.random.shuffle(a) b...

Пятнашки: при перемещении пустой ячейки номер рядом стоящей фишки не перемещается
делаю пятнашки с управлением с клавиатуры. почему в моем коде при перемещении пустой ячейки номер рядом стоящей фишки не перемещается? ...

Пятнашки
1)какие тесты придумать к игре &quot;пятнашки&quot; 2) не знаю как сделать плавный сдвиг кнопки в пустое место public partial class...

Пятнашки)))
подскажите пожалуйста как это делается)))


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru