Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
1

Реализация игры «Инь-Ян»

06.04.2016, 22:00. Показов 3232. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Я делаю курсовой проект на Java и столкнулся с проблемой, но обо всём по порядку.

Краткая постановка задачи.
Игра «Инь-Ян» представляет собой клеточный автомат, состояния ячеек и правила переключения которого приближённо отражают закон единства и борьбы противоположностей. Ячейки автомата имеют три состояния: пустая ячейка (мёртвая), живая ячейка Инь и живая ячейка Ян. Соседние по-Муру ячейки (у каждой ячейки их 8), если они живые, называются соседями. Правила переключения определены таким образом, чтобы популяции ячеек Инь и Ян противоборствовали, но не могли развиваться друг без друга. Вот эти правила:
1. Рождение. У пустой ячейки ровно три соседа (живых), и они не все одинаковые – в ней рождается Ян, если: среди соседей только один Ян, или Инь, среди соседей только один Инь.
2. Гибель от перенаселения (одиночества). Живая ячейка, имеющая больше четырех (меньше двух) соседей, умирает от перенаселения (от одиночества);
3. Гибель в неравном противостоянии. У живой ячейки ровно четыре соседа, из которых большинство – противоположного типа – ячейка умирает.
Начальные конфигурации формируются случайно (с помощью генератора случайных чисел для заданных вероятностей Инь и Ян). Эволюция, порождаемая заданной начальной конфигурацией состояний клеток, может быть изучена в общем случае только путём её пошагового воспроизведения. Однако для каждого значения вероятности генерации можно отследить статистику результата через n шагов и говорить в каком случае будет больше вероятность вырождения автомата за заданное количество шагов.

Готов уже весь код и текст работы, но есть загвоздка - где-то в программе закралась ошибка и в итоге вся популяция инь-ян погибает на третьем ходу, симуляции жизни не происходит. У меня, честно сказать, уже глаза замылились на эту работу, сколько не анализирую код, а проблему найти не могу. Помогите отследить ошибку.

В архиве исходники классов проекта.
Вложения
Тип файла: 7z src.7z (3.9 Кб, 22 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2016, 22:00
Ответы с готовыми решениями:

Нарисовать инь ян
нужно нарисовать инь ян(как на картинке) но у меня хрень какая то получается:( подскажите как...

Про инь, ян и хрень
Занимательная статья, которая имхо отражает нашу нынешнюю жизнь и то, кем мы все стали... Наш...

Реализация игры
Здравствуйте! Вопрос по реализации игры. switch(key) { case KEY_LEFT: { ...

реализация игры со спичками
ребята помогите пожалуйста) нужно сделать игру со спичками при помощи html-технологий) У нас есть...

6
http://1248.site
130 / 118 / 20
Регистрация: 15.05.2012
Сообщений: 341
Записей в блоге: 10
10.04.2016, 22:40 2
замудрил чуток с поиском соседей из-за перевода алгоритма с языка Си, я не стал сильно углубляться, но вроде что-то работает

Изменены некоторые идентификаторы, для понятности, если есть желание вернуть, то нажимай в эклипсе Ctrl-Shift-R и назначай новое уникальное имя.
Вложения
Тип файла: zip src.zip (4.8 Кб, 24 просмотров)
0
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
11.04.2016, 19:20  [ТС] 3
RinatV, спасибо, что откликнулись, это уже больше похоже на правду. Класс поиска соседей сильно переделан, я надеялся, что в моём коде нужно было одну или две строки убрать или добавить)) Единственное, что я пытался сделать по заданию, а в вашей реализации это убрано, так расчёт соседей по-Муру (у каждой ячейки их 8).

Java
1
2
3
4
5
6
7
8
9
if ((row == 0 && col == 0)
                || (row == rowCount - 1 && col == columnCount - 1)
                || (row == 0 && col == columnCount - 1)
                || (row == rowCount - 1 && col == 0))
            resultSize = 3;// в углах три соседа
        else if (row == 0 || col == 0)
            resultSize = 5;// у краев 6 соседей
        else
            resultSize = 8; // в поле 8 соседей
По идее, у каждой клетки по 8 соседей.
0
http://1248.site
130 / 118 / 20
Регистрация: 15.05.2012
Сообщений: 341
Записей в блоге: 10
11.04.2016, 19:27 4
Я незнаю что такое "расчёт соседей по-Муру", можно хотябы ссылку хотя бы на личность "по-Муру". 8 соседей только в поле получается.

Я и не стал обращать внимания на лишние методы т.к. вроде все упростилось и лишние знания никчему.
0
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
11.04.2016, 19:45  [ТС] 5
Если я правильно понял, то имеется ввиду окрестность Мура
https://ru.wikipedia.org/wiki/... 1%80%D0%B0

В такой окрестности клетки, примыкающие к граням поля соседствуют с клетками, как бы на "противоположенной стороне". Если я не ошибаюсь, то квадратное поле здесь на самом деле является поверхностью тора.

http://oco.org.ua/%D0%BA%D0%BB... %82%D1%8B/

Добавлено через 4 минуты
В моём варианте было сделано так сложно и запутано как раз для просчёта этих Муровских соседей. Каждый метод считал соседей отдельно в центральной области, для верхнего, нижнего, правого и левого рядов.
0
http://1248.site
130 / 118 / 20
Регистрация: 15.05.2012
Сообщений: 341
Записей в блоге: 10
11.04.2016, 20:41 6
Вот код с торированием пространства, особо ничего не меняет.

Java
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
public class CalculateNeighbors {
 
    private int[][] neighborXYOffsets = new int[][] { { -1, -1 }, { 0, -1 },
            { 1, -1 }, { -1, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } };
 
    public int[] findNeighborsCentralArea(int row, int col,
            int[][] aRandomArray, int rowCount, int colCount) {
 
        int[] resultArray = new int[8];
 
        for (int i = 0; i < 8; i++) {
            int neighborRow = row + neighborXYOffsets[i][0];
            int neighborCol = col + neighborXYOffsets[i][1];
 
            // Торирование
            if (neighborRow == -1)
                neighborRow = rowCount - 1;
            if (neighborCol == -1)
                neighborCol = colCount - 1;
            if (neighborCol == colCount)
                neighborCol = 0;
            if (neighborRow == rowCount)
                neighborRow = 0;
 
            resultArray[i] = aRandomArray[neighborRow][neighborCol];
        }
 
        return resultArray;
    }
}
1
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
12.04.2016, 00:58  [ТС] 7
Благодаря помощи форумчанина RinatV, было установлено, что в оригинальной программе в методе oneStepOfGame() необходимо при каждом его вызове копировать содержимое передаваемого в параметрах двумерного массива во вновь создаваемый массив, содержащий игровое поле.

Java
1
2
3
4
5
6
7
8
9
10
11
public int[][] oneStepOfGame(int[][] aRandomArray, int aNumberOfRows, int aNumberOfColumns) {
 
        int[][] oneStepOfGameArray = new int[aNumberOfRows][aNumberOfColumns];
        CalculateNeighbors cn = new CalculateNeighbors();
 
        for (int i = 0; i < aNumberOfRows; i++) {
            for (int j = 0; j < aNumberOfColumns; j++) {
 
                oneStepOfGameArray[i][j] = aRandomArray[i][j];
            }
        }
Кроме того неверно были составлены условия проверки на жизнеспособность клеток. Правильный (насколько это представляется объективным) вариант имеет следующий вид:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if ((countingReps(neighbors, 1) + countingReps(neighbors, 2)) > 4 ||
                        (countingReps(neighbors, 1) + countingReps(neighbors, 2)) < 2) {
 
                    oneStepOfGameArray[i][j] = 0;
 
                } else if ((countingReps(neighbors, 0) == 4)
                        && (countingReps(neighbors, 2) != 2))
 
                    oneStepOfGameArray[i][j] = 0;
 
                else if ((countingReps(neighbors, 1) + countingReps(neighbors,
                        2)) == 3 && oneStepOfGameArray[i][j] == 0) {
 
                    if (countingReps(neighbors, 1) == 1)
                        oneStepOfGameArray[i][j] = 1;
                    else
                        oneStepOfGameArray[i][j] = 2;
                }
где neighbors - один из вариантов массива соседей анализируемой клетки.

Итоговый код основных классов находится в архиве.
Вложения
Тип файла: zip src.zip (32.8 Кб, 46 просмотров)
0
12.04.2016, 00:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2016, 00:58
Помогаю со студенческими работами здесь

Реализация функции игры
Доброго времени суток. Задали в универе сделать игрушку какую то. Я придумал простенькую игру в...

Реализация игры на XNA
Здравствуйте , дорогие форумчане! Нужна ваша помощь, появилось задание у меня на курсовую...

Реализация покер игры
Всем привет! Хочу сделать консольную мини-игру &quot;покер&quot;. Начало игры (тасовка колоды, раздача...

Реализация игры Манкала
Здравствуйте, нужна помощь в написании игры Манкала. Смысл и правила игры понятны, а вот алгоритм...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru