[share] Conway's Game of Life в Lineage 2 :) - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 22.05.2012, 04:31   #1
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) [share] Conway's Game of Life в Lineage 2 :)

Многие наверное знают игру Жизнь, так называемый клеточный автомат.
И многие кто увлекался/увлекается программированием наверняка реализовывали эту игру тем или иным способом. Я к примеру давным давно ее реализовывал на паскале, еще на 286 компе.

Ну и вот на днях мне от нечего делать пришло в голову - а почему бы не попробовать реализовать ее в линейке используя в качестве клеток поля неписей и меняя их вид при помощи выставления им разных значений NPC State.
Не ищите в реализации этого всего никакого практического смысла - мне просто стало интересно это все реализовать таким вот своеобразным способом, что я по быстрому и сделал.

Исходники реализации "жизни" под феникс:
Код:
package events.GameOfLife;

import java.util.concurrent.ScheduledFuture;

import l2p.common.ThreadPoolManager;
import l2p.extensions.scripts.Functions;
import l2p.gameserver.model.L2Spawn;
import l2p.gameserver.model.instances.L2NpcInstance;
import l2p.gameserver.tables.NpcTable;
import l2p.util.Rnd;

/**
 * Реализация игры Conway's Game of Life :)
 * 
 * @author Gaikotsu
 */
public class GameOfLife extends Functions
{
	private static final int worldWidth = 20;
	private static final int worldHeight = 20;

	private static final int cellNpcId = 18927;

	private static final int liveCell = 1;
	private static final int deadCell = 2;

	private static final int initialLifeCells = 200;

	private static final int autoStopSteps = 0;

	private static final int posX = 149500;
	private static final int posY = 46200;
	private static final int posZ = -3430;
	private static final int posStep = 50;

	private static final int updateWorldPeriod = 2000;

	private static ScheduledFuture<?> updateWorldTask = null;
	private static int currentStep;
	private static boolean gamePaused;

	private static L2NpcInstance world[][] = new L2NpcInstance[worldWidth][worldHeight];
	private static int worldState[][] = new int[worldWidth][worldHeight];

	public void initWorld()
	{
		currentStep = 0;
		gamePaused = true;

		if (updateWorldTask != null)
		{
			updateWorldTask.cancel(false);
			updateWorldTask = null;
		}

		try
		{
			for (int x = 0; x < worldWidth; x++)
				for (int y = 0; y < worldHeight; y++)
				{
					if (world[x][y] == null)
					{
						L2Spawn spawn = new L2Spawn(NpcTable.getTemplate(cellNpcId));
						spawn.setLocx(posX + x * posStep);
						spawn.setLocy(posY + y * posStep);
						spawn.setLocz(posZ);
						spawn.setAmount(1);

						L2NpcInstance npc = spawn.doSpawn(true);
						npc.setImobilised(true);
						npc.setNpcState(deadCell);

						world[x][y] = npc;
						worldState[x][y] = deadCell;
					}
					else
					{
						if (world[x][y].getNpcState() != deadCell)
							world[x][y].setNpcState(deadCell);

						worldState[x][y] = deadCell;
					}
				}

			int currentIteration = 0;
			int maxIteration = initialLifeCells * 10;

			for (int i = 0; i < initialLifeCells; i++)
			{
				int x = Rnd.get(worldWidth);
				int y = Rnd.get(worldHeight);

				if (worldState[x][y] == deadCell)
					worldState[x][y] = liveCell;
				else
					i--;

				currentIteration++;

				if (currentIteration > maxIteration)
					break;
			}

			updateNpcState();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public void startGame()
	{
		if (updateWorldTask != null)
			return;

		if (autoStopSteps > 0 && currentStep >= autoStopSteps)
			return;

		gamePaused = false;
		updateWorldTask = ThreadPoolManager.getInstance().scheduleGeneral(new UpdateWorld(), 0);
	}

	public void pauseGame()
	{
		gamePaused = true;

		if (updateWorldTask != null)
		{
			updateWorldTask.cancel(false);
			updateWorldTask = null;
		}
	}

	private static void updateNpcState()
	{
		for (int x = 0; x < worldWidth; x++)
			for (int y = 0; y < worldHeight; y++)
				if (world[x][y].getNpcState() != worldState[x][y])
					world[x][y].setNpcState(worldState[x][y]);
	}

	private static class UpdateWorld implements Runnable
	{
		public void run()
		{
			int neighbors = 0;
			int neighborX = 0;
			int neighborY = 0;

			for (int x = 0; x < worldWidth; x++)
				for (int y = 0; y < worldHeight; y++)
				{
					neighbors = 0;

					for (int i = -1; i <= 1; i++)
						for (int j = -1; j <= 1; j++)
						{
							if (i == 0 && j == 0)
								continue;

							neighborX = x + i;
							neighborY = y + j;

							if (neighborX < 0)
								neighborX = worldWidth - 1;

							if (neighborY < 0)
								neighborY = worldHeight - 1;

							if (neighborX >= worldWidth)
								neighborX = 0;

							if (neighborY >= worldHeight)
								neighborY = 0;

							if (world[neighborX][neighborY].getNpcState() == liveCell)
								neighbors++;
						}

					if (world[x][y].getNpcState() == deadCell && neighbors == 3)
						worldState[x][y] = liveCell;
					else
					{
						if (world[x][y].getNpcState() == liveCell && (neighbors < 2 || neighbors > 3))
							worldState[x][y] = deadCell;
						else
							worldState[x][y] = world[x][y].getNpcState();
					}
				}

			updateNpcState();

			currentStep++;

			if (autoStopSteps > 0 && currentStep >= autoStopSteps)
				gamePaused = true;

			updateWorldTask = !gamePaused ? ThreadPoolManager.getInstance().scheduleGeneral(new UpdateWorld(), updateWorldPeriod) : null;
		}
	}
}
Управлять игрой можно так же как эвентами к примеру - вызывая из хтмл нужные методы:
initWorld() - инициализирует игру (спавнит нпс при необходимости, задает начальное состояние клеток поля).
startGame() - запускает игру.
pauseGame() - останавливает игру.

Видео того как это выглядит в линейке:

Gaikotsu вне форума Ответить с цитированием
Непрочитано 22.05.2012, 04:49   #2
Аватар для linliss
Герой

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

круто!
linliss вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 22.05.2012, 08:32   #3
Аватар для Zubastic
ZG troll squad

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

Можно вопрос: в чем состоит суть игры?)))
Zubastic вне форума Ответить с цитированием
Непрочитано 22.05.2012, 08:33   #4
Аватар для Gaikotsu
Герой

Автор темы (Топик Стартер) Re: [share] Conway's Game of Life в Lineage 2 :)

я ж даже ссылку на вики указал с описанием что это такое
Gaikotsu вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 22.05.2012, 08:38   #5
Аватар для Zubastic
ZG troll squad

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

Цитата:
Сообщение от Gaikotsu Посмотреть сообщение
я ж даже ссылку на вики указал с описанием что это такое
Чорт, сижу в аудитории хорошо освещенной и линк не увидел
Ненавижу солнечный свет
Zubastic вне форума Ответить с цитированием
Непрочитано 22.05.2012, 09:08   #6
Аватар для darkevil

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

Здорово но бессмысленно для игры.
А так плюсану за креативность
__________________
darkevil вне форума Отправить сообщение для darkevil с помощью ICQ Отправить сообщение для darkevil с помощью Skype™ Ответить с цитированием
Непрочитано 22.05.2012, 09:20   #7
Пользователь

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

well its cool~~~
iquelite вне форума Отправить сообщение для iquelite с помощью MSN Ответить с цитированием
Непрочитано 22.05.2012, 11:58   #8
Аватар для Zubastic
ZG troll squad

По умолчанию Re: [share] Conway's Game of Life в Lineage 2 :)

Цитата:
Сообщение от darkevil Посмотреть сообщение
Здорово но бессмысленно для игры.
А так плюсану за креативность
Почему бессмысленно? Можно оживить города (как сделано на ТИ в годе). Например цветы, которые раскрываются/закрываются.
Zubastic вне форума Ответить с цитированием
Ответ

Метки
игра "жизнь", извращения


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Shara] Epoch-Life Menzik Lineage II 7 04.07.2014 18:11
L2JTEON Life Stones JaneKyun Lineage II 5 22.11.2010 10:01
[Продам] LINEAGE-GAME.ORG corsarc Рынок / Marketplace 1 30.06.2010 08:57
Updater на (Rus-of)Life Клиент Bastexses Игровой клиент 0 29.04.2009 10:50


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 06:29. Часовой пояс GMT +3.

Вверх