Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 18.06.2022
Сообщений: 5

"Война вирусов"

26.06.2022, 19:52. Показов 1215. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При создании цикла на вывод победителя pygame зависает. Нужна помощь с созданием окна окончания игры с возможностью перезапуска игры.
Правила:
Играют в «войну вирусов» два игрока на доске 10 на 10 клеток, один крестиками, другой ноликами.
Ходят поочерёдно. Начинают крестики. Каждый ход состоит из трёх отдельных последовательных ходов (назовём их «ходиками»).
Каждый «ходик» является либо размножением, либо убиванием. Размножение — это выставление своего символа в любую доступную пустую клетку доски, а убивание — это объявление убитым некоторого чужого символа, который находится на доступной клетке.
Клетка считается доступной для крестиков, если она либо непосредственно соприкасается (по вертикали, горизонтали или диагонали) с живым крестиком, либо через цепочку убитых ноликов(но не через цепочку убитых крестиков!).
Аналогично определяются клетки, доступные для ноликов: либо непосредственно соприкасающиеся с одним из ноликов, либо через цепочку убитых крестиков.
Убитые крестики обводятся кружком, убитые нолики закрашиваются. Если игра ведётся не на бумажной доске, а при помощи доски «многоразового использования» и фишек с изображениями крестиков и ноликов, то убитую фишку надо накрыть своей фишкой.
В начале игры доска пуста, и полей доступных для крестиков нет, поэтому в порядке исключения они имеют право сделать свой первый «ходик» на a1. Точно также нолики имеют право своим первым «ходиком» выставиться на k10.
В любой момент игрок может отказаться от хода. Однако выполнение вместо полного хода лишь одного или двух «ходиков» запрещается, за исключением того случая, когда выполнить полный ход невозможно в принципе.
Запрещается:
Ставить свой символ в уже занятую клетку.
Убивать уже убитые символы противника.
Целью игры является полное уничтожение колонии противника (то есть убивание всех вражеских символов). Если оба игрока, считая такое уничтожение невозможным, отказываются от хода, партия считается закончившейся вничью.
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import pygame
import sys
import pygame_menu
 
pygame.init()
surface = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Война вирусов")
 
 
def rules():
    def blit_text(surface, text, pos, font, color=pygame.Color('black')):
        words = [word.split(' ') for word in text.splitlines()]
        space = font.size(' ')[0]
        max_width, max_height = surface.get_size()
        x, y = pos
        for line in words:
            for word in line:
                word_surface = font.render(word, 0, color)
                word_width, word_height = word_surface.get_size()
                if x + word_width >= max_width:
                    x = pos[0]
                    y += word_height
                surface.blit(word_surface, (x, y))
                x += word_width + space
            x = pos[0]
            y += word_height
 
    text = "1. Каждый ход состоит из трёх отдельных последовательных ходов." \
           "Каждый ход является либо размножением, либо убиванием. " \
           "\n2.Размножение — это выставление своего символа в любую доступную пустую клетку доски, " \
           "убивание — объявление убитым некоторого чужого символа, который находится на доступной клетке." \
           "\n3. В начале игры крестики начинают ход на a1. Точно также нолики начинают на k10." \
           "\n4. Клетка считается доступной, если она либо непосредственно соприкасается с живым знаком, либо через цепочку убитых знаков" \
           "\nЗапрещается:" \
           "\nСтавить свой символ в уже занятую клетку." \
           "\nУбивать уже убитые символы противника." \
           "\nНажмите 'ESC' чтобы выйти"
 
    font = pygame.font.SysFont('comicsansms', 20)
    loop = True
    while loop:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    loop = False
                    start_menu()
 
        surface.fill(pygame.Color('white'))
        blit_text(surface, text, (20, 20), font)
        pygame.display.update()
 
 
def start_the_game():
    size_block = 40
    margin = 10
    screen = pygame.display.set_mode((510, 510))
    loop = True
    green = (0, 255, 0)
    white = (255, 255, 255)
    red = (255, 0, 0)
    blue = (0, 0, 255)
    mas = [[0] * 10 for _ in range(10)]
    query = 0
    step = 'x'
    step_converter = {'x': 's', 'o': 'z'}
    startX = True
    startO = True
 
    def nigger(row, column):
        # Левый верхний угол
        if _is_valid([row - 1, column - 1]):
            if mas[row - 1][column - 1] != 0 and (mas[row - 1][column - 1] == step
                                                  or mas[row - 1][column - 1] == step_converter[step]):
                return True
        # Центр верх
        if _is_valid([row - 1, column]):
            if mas[row - 1][column] != 0 and (mas[row - 1][column] == step
                                              or mas[row - 1][column] == step_converter[step]):
                return True
        # Правый верхний угол
        if _is_valid([row - 1, column + 1]):
            if mas[row - 1][column + 1] != 0 and (mas[row - 1][column + 1] == step
                                                  or mas[row - 1][column + 1] == step_converter[step]):
                return True
        # Центр право
        if _is_valid([row, column + 1]):
            if mas[row][column + 1] != 0 and (mas[row][column + 1] == step
                                              or mas[row][column + 1] == step_converter[step]):
                return True
        # Правый нижний угол
        if _is_valid([row + 1, column + 1]):
            if mas[row + 1][column + 1] != 0 and (mas[row + 1][column + 1] == step
                                                  or mas[row + 1][column + 1] == step_converter[step]):
                return True
        # Центр низ
        if _is_valid([row + 1, column]):
            if mas[row + 1][column] != 0 and (mas[row + 1][column] == step
                                              or mas[row + 1][column] == step_converter[step]):
                return True
        # Левый нижний угол
        if _is_valid([row + 1, column - 1]):
            if mas[row + 1][column - 1] != 0 and (mas[row + 1][column - 1] == step
                                                  or mas[row + 1][column - 1] == step_converter[step]):
                return True
        # Центр лево
        if _is_valid([row, column - 1]):
            if mas[row][column - 1] != 0 and (mas[row][column - 1] == step
                                              or mas[row][column - 1] == step_converter[step]):
                return True
        return False
 
    def has_free_cells():
        for current_row in mas:
            if 0 in current_row: return True
        return False
 
    while loop:
        if not has_free_cells():
            pass
        else:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit(0)
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    x_mouse, y_mouse = pygame.mouse.get_pos()
                    print(f'x={x_mouse} y={y_mouse}')
                    col = x_mouse // (margin + size_block + 1)
                    row = y_mouse // (margin + size_block + 1)
                    if startX == True:
                        if step == 'x' and col == 0 and row == 0:
                            mas[row][col] = 'x'
                            query += 1
                            startX = False
                    if startO == True:
                        if step == 'o' and col == 9 and row == 9:
                            mas[row][col] = 'o'
                            query += 1
                            startO = False
 
                    if startX == False:
                        if step == 'x':
                            if mas[row][col] == 0 and nigger(row, col):
                                mas[row][col] = 'x'
                                query += 1
                            if mas[row][col] == 'o' and nigger(row, col):
                                mas[row][col] = 's'  # убитый o
                                query += 1
                    if startO == False:
                        if step == 'o':
                            if mas[row][col] == 0 and nigger(row, col):
                                mas[row][col] = 'o'
                                query += 1
                            if mas[row][col] == 'x' and nigger(row, col):
                                mas[row][col] = 'z'  # убитый x
                                query += 1
                    if query == 3:
                        if step == 'x':
                            step = 'o'
                        elif step == 'o':
                            step = 'x'
                        query = 0
 
            for row in range(10):
                for col in range(10):
                    if mas[row][col] == 'x':
                        color = red
                    elif mas[row][col] == 'o':
                        color = green
                    elif mas[row][col] == 'z':
                        color = red
                    elif mas[row][col] == 's':
                        color = blue
                    else:
                        color = white
                    x = col * size_block + (col + 1) * margin
                    y = row * size_block + (row + 1) * margin
                    pygame.draw.rect(screen, color, (x, y, size_block, size_block))
                    if color == red:
                        if mas[row][col] != 'z':
                            pygame.draw.line(screen, white, (x, y), (x + size_block, y + size_block), 3)
                            pygame.draw.line(screen, white, (x + size_block, y), (x, y + size_block), 3)
                        else:
                            pygame.draw.line(screen, white, (x, y), (x + size_block, y + size_block), 3)
                            pygame.draw.line(screen, white, (x + size_block, y), (x, y + size_block), 3)
                            pygame.draw.circle(screen, white, (x + size_block // 2, y + size_block // 2),
                                               size_block // 2 - 3, 3)
                    elif color == green and mas[row][col] != 's':
                        pygame.draw.circle(screen, white, (x + size_block // 2, y + size_block // 2),
                                           size_block // 2 - 3,
                                           3)
            pygame.display.update()
 
 
def _is_valid(value):
    if 9 >= value[0] >= 0 and 9 >= value[1] >= 0:
        return True
    return False
 
 
def start_menu():
    menu = pygame_menu.Menu('Приветсвуем', 600, 600,
                            theme=pygame_menu.themes.THEME_DARK)
 
    menu.add.button('Играть', start_the_game)
    menu.add.button('Правила', rules)
    menu.add.button('Выйти', pygame_menu.events.EXIT)
    menu.mainloop(surface)
 
start_menu()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2022, 19:52
Ответы с готовыми решениями:

Игра "Война вирусов"
Кое-что сделано, но нужна помощь с добавлением функций. import pygame import sys import pygame_menu pygame.init() surface =...

Война вирусов
Не смог найти нигде эту игру, а у самого что-то проблемы с этим... Вот мой код, может тут подскажете, если так проще вам будет ...

Амиго, Вконтакте, Война Престолов, Искать в интернете - Удаление вирусов
Добрый день! Столкнулся, как и многие, с такой проблемой. После скачивания книги нахватался всяких штук типа "Амиго",...

2
171 / 111 / 65
Регистрация: 26.06.2020
Сообщений: 331
27.06.2022, 06:19
Цитата Сообщение от Zeras Посмотреть сообщение
Клетка считается доступной для крестиков, ... , либо через цепочку убитых ноликов(но не через цепочку убитых крестиков!).
Это не сделано.
0
0 / 0 / 0
Регистрация: 18.06.2022
Сообщений: 5
27.06.2022, 14:14  [ТС]
Это ладно, нужно меню конца игры
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2022, 14:14
Помогаю со студенческими работами здесь

Игра "Война Вирусов". Оценка позиции для алгоритма Альфа-Бета отсечения
Я создаю игру "Война Вирусов" на языке Visual Prolog. Правила игры описаны здесь: ...

Война!
Капитан Керам должен принять трудное решение. Шел 2147 год, в мире шла большая война. Его солдаты были вместе в начале войны, два года...

Война
Войны ведется не только на поле битвы, но и в глубине души!! а вы как сочетаете ??

«Война и мир» (т.4, ч.1, гл.11)
Здравствуйте! Пожалуйста, помогите ответить на вопрос: Проанализируйте сцену расстрела пленных французами в романе Л. Толстого «Война и...

Война и мир.
Здравствуйте товарищи.Вот начало проблемы- http://cyberforum.ru/windows-xp/thread562779.html потом Решил сделать средствами Виндовс...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru