2 / 2 / 1
Регистрация: 23.11.2021
Сообщений: 38
Записей в блоге: 1

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

07.12.2022, 10:33. Показов 2241. Ответов 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru