Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9

Пасьянс паук

25.04.2023, 06:34. Показов 4307. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Ребята помогите пожалуйста! Что мне нужно изучить или найти, чтобы написать программу пасьянс паук на питоне! Так как я знаю только его! Помогите кто чем сможет
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2023, 06:34
Ответы с готовыми решениями:

Ним-пасьянс
Древняя и почтенная игра Ним имеет такие правила: имеется несколько куч камней. Каждый игрок в свой ход может забрать из любой кучи любое...

Псевдоним-пасьянс
Игра Ним с одной кучей для одного игрока с дополнительным ограничением: можно за один ход взять не больше трёх камней. Игрок может...

Ним2-пасьянс
Игра Ним с двумя кучами для одного игрока без ограничений на количество забираемых камней. На первой и второй строках указывается...

22
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 09:59
Цитата Сообщение от ArturNashinski Посмотреть сообщение
Так как я знаю только его!
Ты его, кхм, не знаешь.
Изучай pygame например
0
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9
25.04.2023, 10:07  [ТС]
Да, это точнo. Учу по бесплатным курсам на 'hexlet', но даёться тяжеловато. Не подскажите, может есть вариант где можно лучше прокачаться в этой затеи???
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 10:11
Вот прям тут и прокачивайся. Халявщики, не желающие думать и что-то делать самостоятельно, выбрасывают задачи пачками. Поле непаханное. Будешь решать - тебя поправят, вариантов других накидают, учись - не хочу.
3
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9
25.04.2023, 10:15  [ТС]
Понял

Добавлено через 1 минуту
Только вот что решать то и где?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 10:29
https://www.cyberforum.ru/python-tasks/
Пожалста
0
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9
25.04.2023, 10:37  [ТС]
Пасиба
0
Заблокирован
25.04.2023, 10:37
Сначала установите библиотеку, если у вас ее еще нет:

Code
1
pip install pygame
Теперь давайте создадим простое окно с использованием pygame. Вот базовый код для создания окна:

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
import pygame
import sys
 
def main():
    pygame.init()
    
    # Размеры окна и создание окна
    screen_width, screen_height = 800, 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    
    # Заголовок окна
    pygame.display.set_caption("Пасьянс 'Паук'")
 
    # Главный цикл
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        
        # Обновление дисплея
        pygame.display.flip()
 
if __name__ == "__main__":
    main()
Запустите этот код, и вы увидите пустое окно с заголовком "Пасьянс 'Паук'". В следующих шагах мы будем добавлять функциональность игры и графические элементы на экран.

Важные компоненты кода выше:

pygame.init(): инициализация всех подсистем pygame.
pygame.display.set_mode((width, height)): создание окна с указанными размерами.
pygame.display.set_caption("Пасьянс 'Паук'"): установка заголовка окна.
Главный цикл обработки событий. Здесь мы проверяем события, такие как закрытие окна и взаимодействие с пользователем.
pygame.display.flip(): обновление дисплея.
Теперь вы знакомы с основами создания окна в pygame. В следующих этапах мы добавим классы Card и Deck, графические элементы и функциональность игры.


добавим классы Card и Deck для представления карт и колоды.

Создадим класс Card для представления отдельных карт:

Python
1
2
3
4
5
6
7
8
9
10
11
class Card:
    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.face_up = False
 
    def __repr__(self):
        return f"{self.rank}{self.suit}"
 
    def flip(self):
        self.face_up = not self.face_up
Класс Card содержит атрибуты для хранения масти и значения карты, а также атрибут face_up, который показывает, видна ли карта лицом вверх. Метод flip переворачивает карту лицом вверх или вниз.

Создадим класс Deck, который будет содержать колоду карт:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import random
 
class Deck:
    def __init__(self):
        self.cards = self._create_deck()
 
    def _create_deck(self):
        suits = ['♠', '♣', '♦', '♥']
        ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
        deck = [Card(suit, rank) for suit in suits for rank in ranks]
        random.shuffle(deck)
        return deck
 
    def draw_card(self):
        return self.cards.pop()
 
    def is_empty(self):
        return len(self.cards) == 0
Класс Deck содержит список карт и методы для создания колоды, вытаскивания карты из колоды и проверки на пустоту колоды. В методе _create_deck мы создаем все возможные комбинации мастей и рангов, а затем перемешиваем колоду с помощью random.shuffle.

Теперь у нас есть базовые классы для представления карт и колоды. В следующем этапе мы добавим графические элементы, чтобы отображать карты на экране и добавим логику раздачи карт для начала игры.

добавим классы для представления стопок карт и графического интерфейса игры. Для графического интерфейса мы будем использовать библиотеку tkinter.

Создадим класс Stack, который будет представлять стопку карт:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Stack:
    def __init__(self):
        self.cards = []
 
    def add_card(self, card):
        self.cards.append(card)
 
    def remove_card(self):
        if self.cards:
            return self.cards.pop()
        return None
 
    def top_card(self):
        if self.cards:
            return self.cards[-1]
        return None
 
    def is_empty(self):
        return len(self.cards) == 0
Класс Stack содержит список карт и методы для добавления и удаления карт из стопки, а также для проверки на пустоту стопки и получения верхней карты стопки.

Создадим графический интерфейс для игры с использованием библиотеки tkinter:

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
import tkinter as tk
from tkinter import PhotoImage
 
class SpiderSolitaireGUI:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Spider Solitaire")
 
        # Загрузим изображения карт
        self.card_images = self.load_card_images()
 
        # Создадим стопки карт
        self.stacks = [Stack() for _ in range(10)]
 
        # Раздача карт
        self.deal_cards()
 
        # Отобразим стопки карт на экране
        self.display_stacks()
 
        self.window.mainloop()
 
    def load_card_images(self):
        suits = ['spades', 'clubs', 'diamonds', 'hearts']
        ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king', 'ace']
        card_images = {}
        for suit in suits:
            for rank in ranks:
                image_name = f"{rank}_of_{suit}.png"
                card_images[f"{rank[0].upper()}{suit[0]}"] = PhotoImage(file=image_name)
        return card_images
 
    def deal_cards(self):
        deck = Deck()
        for i in range(4):
            for stack in self.stacks[:-2]:
                card = deck.draw_card()
                card.flip()
                stack.add_card(card)
        for stack in self.stacks[-2:]:
            for _ in range(5):
                card = deck.draw_card()
                card.flip()
                stack.add_card(card)
 
    def display_stacks(self):
        for i, stack in enumerate(self.stacks):
            x = 10 + i * 100
            y = 10
            for card in stack.cards:
                image = self.card_images[str(card)]
                label = tk.Label(self.window, image=image)
                label.image = image
                label.place(x=x, y=y)
                y += 30
В классе SpiderSolitaireGUI мы загружаем изображения карт, создаем стопки карт, раздаем карты и отображаем их на экране. Метод load_card_images загружает изображения карт из файлов с именами вида "rank_of_suit.png" и сохраняет их в словар

Добавим функционал для перемещения карт между стопками и для автоматического удаления завершенных последовательностей карт.

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
class SpiderSolitaireGUI:
    # ... (остальные методы)
 
    def move_card(self, from_stack_idx, to_stack_idx):
        from_stack = self.stacks[from_stack_idx]
        to_stack = self.stacks[to_stack_idx]
        card = from_stack.top_card()
 
        if self.can_move_card(card, to_stack):
            from_stack.remove_card()
            to_stack.add_card(card)
            self.check_for_completed_sequence(to_stack)
 
    def can_move_card(self, card, to_stack):
        if to_stack.is_empty():
            return True
        return to_stack.top_card().get_suit() == card.get_suit() and to_stack.top_card().get_rank() - card.get_rank() == 1
 
    def check_for_completed_sequence(self, stack):
        if len(stack.cards) < 13:
            return
 
        suits = [card.get_suit() for card in stack.cards[-13:]]
        ranks = [card.get_rank() for card in stack.cards[-13:]]
 
        if len(set(suits)) == 1 and ranks == list(range(1, 14)):
            for _ in range(13):
                stack.remove_card()
 
    # ... (остальные методы)
Метод move_card перемещает карту из одной стопки в другую, если это допустимо. Метод can_move_card проверяет, можно ли переместить карту на вершину другой стопки. Метод check_for_completed_sequence проверяет, есть ли завершенная последовательность карт в стопке, и удаляет ее, если она есть.

Добавим функционал для обработки событий мыши, чтобы пользователь мог перетаскивать карты между стопками:

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
class SpiderSolitaireGUI:
    # ... (остальные методы)
 
    def on_mouse_down(self, event):
        for i, stack in enumerate(self.stacks):
            if self.is_over_stack(event.x, event.y, i):
                self.dragged_stack_idx = i
                break
 
    def on_mouse_move(self, event):
        if self.dragged_stack_idx is not None:
            pass  # Здесь можно добавить визуальное отображение перетаскивания
 
    def on_mouse_up(self, event):
        if self.dragged_stack_idx is not None:
            for i, stack in enumerate(self.stacks):
                if self.is_over_stack(event.x, event.y, i):
                    self.move_card(self.dragged_stack_idx, i)
                    self.display_stacks()
                    break
            self.dragged_stack_idx = None
 
    def is_over_stack(self, x, y, stack_idx):
        stack_x = 10 + stack_idx * 100
        stack_y = 10
        return stack_x <= x <= stack_x + 70 and stack_y <= y <= stack_y + 500
 
    # ... (остальные методы)
 
    # В конструкторе добавьте следующий код для привязки событий мыши к соответствующим обработчикам:
    self.window.bind("<Button-1>", self.on_mouse_down)
    self.window.bind("<B1-Motion>", self.on_mouse_move)
    self.window.bind("<ButtonRelease-1>", self.on_mouse_up)
Теперь мы добавим возможность сделать новую раздачу карт, если игрок застрял.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class SpiderSolitaireGUI:
    # ... (остальные методы)
 
    def deal_new_cards(self):
        if not self.deck.is_empty():
            for stack in self.stacks:
                card = self.deck.draw_card()
                card.flip()
                stack.add_card(card)
            self.display_stacks()
 
    # ... (остальные методы)
 
    # В конструкторе добавьте следующий код для создания кнопки "Новая раздача" и привязки события к обработчику:
    self.deal_button = tk.Button(self.window, text="Новая раздача", command=self.deal_new_cards)
    self.deal_button.place(x=900, y=10)
Запустим программу и наслаждаемся игрой!


Python
1
2
if __name__ == "__main__":
    SpiderSolitaireGUI()
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 10:41
BotBob, ты сам то хоть слово понял из того, что сюда скопипастил?
1
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9
25.04.2023, 10:41  [ТС]
Спасибо, но мне бы не тупо списать, а понять как это всё чикает и брякает Может есть какой-то лайфхак?
0
Заблокирован
25.04.2023, 10:44
а ты?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 10:51
BotBob, а я использую свой интеллект, когда пишу что-то на форум. А вот те, у кого он в принципе отсутствует - копипастят ответы искусственного. Что ж поделать - своего нет, хоть чужим попользуюсь. Авось за умного сойду..
3
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
25.04.2023, 10:58

Не по теме:

Цитата Сообщение от ArturNashinski Посмотреть сообщение
мне бы не тупо списать, а понять
Верной дорогой идёте, товарищ

0
0 / 0 / 0
Регистрация: 22.04.2023
Сообщений: 9
25.04.2023, 11:01  [ТС]
Желание бешеное имею! Поделитесь опытом как это происходило у вас или, что нужно делать?
0
Заблокирован
25.04.2023, 11:02
Почему у вас всех так подгорает? Я просто тестирую разницу в версиях на живвх примерах и заодно помогаю людям и получаю живой фидбек, такие токсики жесть) Время идет, через пару лет кодеры живые будут не нужны, держу вкурсе)
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 11:05
Цитата Сообщение от ArturNashinski Посмотреть сообщение
что нужно делать?
Книжки читать! Возьми Head First 'Изучаем питон', и в бой

Добавлено через 2 минуты
Цитата Сообщение от BotBob Посмотреть сообщение
кодеры живые будут не нужны
А ты вообще в курсе, откуда жпт берет ответы? Ты думаешь, что он их сам генерирует?
2
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
25.04.2023, 11:10

Не по теме:

Цитата Сообщение от BotBob Посмотреть сообщение
Время идет, через пару лет кодеры живые будут не нужны, держу вкурсе)
Тут в недавней теме вычислялся объем трапеции, кто-то даже привел пример на сайте где разместили калькулятор по вычислению этого объема... ИМХО через пару лет ChatGPT так "натренируют" тупыми вопросами, что она сойдет с ума и застрелится (читай превратится в помойку тупых ответов)

2
88 / 32 / 14
Регистрация: 25.03.2023
Сообщений: 69
25.04.2023, 11:25
BotBob, И что ты тестируешь!?))Копипастя!? Ну так хочешь помочь так скажи людям откуда скопипастить да и все, зачем представлять не свой ответ за свой?! От этого и горит - в большинстве код кривой, с ошибками и тд... А ты даже не понимаешь про что речь... Полная деградация, хотя бы запускай перед тем как выложить
4
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 939
25.04.2023, 11:27

Не по теме:

Цитата Сообщение от BotBob Посмотреть сообщение
Почему у вас всех так подгорает?
За всех не скажу, но мне тоже не сильно нравится когда просто тупо "скопировали-вставили". Потому что таким образом убивается сам смысл форума, обучения его участников. Ведь вопрос не в том что бы просто тупо вставить решение, я тут отвечаю в надежде не только помочь человеку, а еще что бы посмотрели мой код более опытные товарищи, что бы самому стать более опытным. Вот смыл моего сидения на форуме. Плюс когда я кому-то пишу свой код часто ТС просит что-то пояснить, а это дополнительный навык мочь кому-то что-то объяснить.
Цитата Сообщение от BotBob Посмотреть сообщение
заодно помогаю людям
Какой смысл вы и сами этот код не запускали (может он не рабочий совсем) и если у ТС возникнут вопросы (допустим он из скопированного вами ничего не понял) ответить по коду тоже не сможете, в чем же тут помощь? (вопрос риторический)



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от slonce Посмотреть сообщение
в большинстве код кривой, с ошибками и тд...
Абсолютно согласен!

4
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.04.2023, 11:50
Михалыч, slonce, злые мы. Вот закидали ссаными тряпками товарища, пришлось спасаться бегством в раздел c++, теперь там резвится.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2023, 11:50
Помогаю со студенческими работами здесь

Ним3-пасьянс
Игра Ним с тремя кучами для одного игрока без ограничений на количество забираемых камней. На первой, второй и третьей строках...

Интернет паук
Здравствуйте) ребят очень нужна помощь!!! есть код на язаке python, он &quot;ходит&quot; по сайту Саратовского Государственного университета и...

Ним3-пасьянс
Игра Ним с тремя кучами для одного игрока без ограничений на количество забираемых камней. На первой, второй и третьей строках...

Пасьянс-паук
Скажите , в пасьянс - паук есть ИИ ,или там карты выпадают рандомно ?

Создание игры Пасьянс-Паук
У меня 8 колод одной масти, в каждой колоде по 13 карт. Всего получается 104 карты. Подскажите, как лучше сделать? Сам алгоритм я понимаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru