Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
2 / 2 / 1
Регистрация: 23.11.2021
Сообщений: 38
Записей в блоге: 1

Сделать игру жизнь (чтобы клетки не останавливались у границы)

07.12.2022, 10:33. Показов 2230. Ответов 7

Студворк — интернет-сервис помощи студентам
Проблема в том что клетки останавливаются при соприкосании с границей поля

Вот мой код игры:
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
import copy
 
import pygame
 
 
class Board:
    # создание поля
    def __init__(self, width, height, left=10, top=10, cell_size=30):
        self.width = width
        self.height = height
        self.board = [[0] * width for _ in range(height)]
        # значения по умолчанию
        self.left = 0
        self.top = 0
        self.cell_size = 0
        self.set_view(left, top, cell_size)
 
    def render(self, screen):
        for y in range(self.height):
            for x in range(self.width):
                pygame.draw.rect(screen, pygame.Color(255, 255, 255),
                                 (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                  self.cell_size,
                                  self.cell_size), 1)
 
    # настройка внешнего вида
    def set_view(self, left, top, cell_size):
        self.left = left
        self.top = top
        self.cell_size = cell_size
 
    # cell - кортеж (x, y)
    def on_click(self, cell):
        # заглушка для реальных игровых полей
        pass
 
    def get_cell(self, mouse_pos):
        cell_x = (mouse_pos[0] - self.left) // self.cell_size
        cell_y = (mouse_pos[1] - self.top) // self.cell_size
        if cell_x < 0 or cell_x >= self.width or cell_y < 0 or cell_y >= self.height:
            return None
        return cell_x, cell_y
 
    def get_click(self, mouse_pos):
        cell = self.get_cell(mouse_pos)
        if cell:
            self.on_click(cell)
 
 
class Life(Board):
    def __init__(self, width, height, left=10, top=10, cell_size=30):
        super().__init__(width, height, left, top, cell_size)
 
    def on_click(self, cell):
        self.board[cell[1]][cell[0]] = (self.board[cell[1]][cell[0]] + 1) % 2
 
    def render(self, screen):
        for y in range(self.height):
            for x in range(self.width):
                if self.board[y][x]:
                    # живые клетки рисуем зелеными
                    pygame.draw.rect(screen, pygame.Color("green"),
                                     (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                      self.cell_size,
                                      self.cell_size))
                pygame.draw.rect(screen, pygame.Color(255, 255, 255),
                                 (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                  self.cell_size,
                                  self.cell_size), 1)
 
    def next_move(self):
        # сохраняем поле
        tmp_board = copy.deepcopy(self.board)
        # пересчитываем
        for y in range(self.height):
            for x in range(self.width):
                # сумма окружающих клеток
                s = 0
                for dy in range(-1, 2):
                    for dx in range(-1, 2):
                        if x + dx < 0 or x + dx >= self.width or y + dy < 0 or y + dy >= self.height:
                            continue
                        s += self.board[y + dy][x + dx]
                s -= self.board[y][x]
                if s == 3:
                    tmp_board[y][x] = 1
                elif s < 2 or s > 3:
                    tmp_board[y][x] = 0
        # обновляем поле
        self.board = copy.deepcopy(tmp_board)
 
 
def main():
    pygame.init()
    size = 470, 470
    screen = pygame.display.set_mode(size)
    clock = pygame.time.Clock()
    pygame.display.set_caption('Игра «Жизнь»')
 
    board = Life(30, 30, 10, 10, 15)
 
    # Включено ли обновление поля
    time_on = False
    ticks = 0
    speed = 10
 
    running = True
 
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                board.get_click(event.pos)
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE or event.type == pygame.MOUSEBUTTONDOWN and event.button == 3:
                time_on = not time_on
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 4:
                speed += 1
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 5:
                speed -= 1
 
        screen.fill((0, 0, 0))
        board.render(screen)
        if ticks >= speed:
            if time_on:
                board.next_move()
            ticks = 0
        pygame.display.flip()
        clock.tick(100)
        ticks += 1
    pygame.quit()
 
 
if __name__ == '__main__':
    main()
Как сделать так, чтобы клетки, при выходе за границу поля, появлялись на противоположенной стороне?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2022, 10:33
Ответы с готовыми решениями:

HomeLisp. Сделать часы, чтобы они запускались и останавливались
Суть вот в чем. Когда функция вызывается, то нужно ждать окончания ее выполнения. А я хочу сделать часы, чтобы они запускались и...

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

В игре "Жизнь" надо отметить клетки, где хоть раз была жизнь (Java)
Вот сама игра, где что поменять чтоб места где была жизнь отмечались ? import java.util.Random; public class life { public...

7
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
07.12.2022, 13:39
Цитата Сообщение от DEVOURING Посмотреть сообщение
Как сделать так, чтобы клетки, при выходе за границу поля, появлялись на противоположенной стороне?
убрать условие которое не дает выйти за границу и поменять на условие перехода на другую сторону. Если это реально твой код то легко найдешь это место
1
2 / 2 / 1
Регистрация: 23.11.2021
Сообщений: 38
Записей в блоге: 1
07.12.2022, 14:04  [ТС]
Welemir1, Тогда не будет работать условие для поиска живых клеток вокруг
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
07.12.2022, 14:14
DEVOURING, сделать поле на 2 клетку больше во все стороны, или отрисовывать на 2 клетку меньше со всех сторон. улетевшие будут жить +1 поколение на невидимой границе. создавая условия для правильного рождения смерти рядом с ними

Я поставил на 2, чтобы наверняка они потом сдохли

Добавлено через 6 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
    def render(self, screen):
        for y in range(2, self.height-2):
            for x in range(2, self.width-2):
                if self.board[y][x]:
                    # живые клетки рисуем зелеными
                    pygame.draw.rect(screen, pygame.Color("green"),
                                     (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                      self.cell_size,
                                      self.cell_size))
                pygame.draw.rect(screen, pygame.Color(255, 255, 255),
                                 (x * self.cell_size + self.left, y * self.cell_size + self.top,
                                  self.cell_size,
                                  self.cell_size), 1)
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,759
07.12.2022, 15:22
DEVOURING, работай с координатами по модулю width и height. Т.е. просто бери остаток от деления на них. Получишь топологию Тора тора.
0
2 / 2 / 1
Регистрация: 23.11.2021
Сообщений: 38
Записей в блоге: 1
07.12.2022, 18:43  [ТС]
u235, Можете пожалуйста по подробнее объяснить про реализацию технологии Тора в этой игре
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
07.12.2022, 19:10
Лучший ответ Сообщение было отмечено DEVOURING как решение

Решение

Цитата Сообщение от DEVOURING Посмотреть сообщение
Python
1
2
3
if x + dx < 0 or x + dx >= self.width or y + dy < 0 or y + dy >= self.height:
                            continue
                        s += self.board[y + dy][x + dx]
if x + dx < 0 or x + dx >= self.width or y + dy < 0 or y + dy >= self.height:
                            continue

Python
1
s += self.board[(y + dy+self.height)%self.height][(x + dx+self.width)%self.width]
2
2 / 2 / 1
Регистрация: 23.11.2021
Сообщений: 38
Записей в блоге: 1
07.12.2022, 19:45  [ТС]
Спасибо большое, всё получилось!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2022, 19:45
Помогаю со студенческими работами здесь

Как можно сделать игру жизнь разноцветной через код java?
как можно сделать игру жизнь разноцветной через код java? пишу через anylogic. цвет заливки квадрата идёт &quot; alive ? new...

Как сделать так, чтобы границы дочерней формы не "уходили" за границы родительской
Всем доброго времени суток! Возник следующий вопрос. Создаю MDI-приложение. Есть родительская форма и, соответственно, дочерняя. Как...

Можно ли как-то сделать Сапёр на С # без XNA, чтобы клетки были пятиугольными
Можно ли как то сделать Сапёр на С # без XNA и чтобы клетки были не квадратные а 5 угольные ? Могу кинуть ...

Чтобы кубики некоторое время меняли свое значение, затем останавливались со случайной картинкой
задача состоит в том что нужно, при нажатие на крутить, кубики некоторое время меняли свое значение, затем останавливались со случайной...

Как сделать, чтобы не выходило за границы
У меня есть блок. если его сделать меньше чем требует содержимое, то текст выходит за границы блока, как сделать, чтобы всё что за блоком...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru