![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вам вроде объяснили. У Вас нет элемента [n][27] и элемента [20][n]. Их нет. 27-й элемент имеет индекс 26. Соответственно все написанные условия приводят к ошибке — Вы обращаетесь к элементу, которого нет. Какими еще словами это объяснять, я не знаю. Предлагаю поспать и перечитать топик.
Я вообще не понял зачем Вам этот огород. Все эти вопросы только для того, чтобы выяснить, есть ли там элемент с индексом, который хочется проверить на живучесть. Вуаля. Так что вместо того, чтобы пытать значения итераторов, достаточно просто спросить, есть там кто? А уже потом — живой ли он? Другими словами: if(mama[j - 1][j2 - 1] is enemy && mama[j - 1][j2 - 1].alive) liver_a ++; if(mama[j - 1][j2] is enemy && mama[j - 1][j2].alive) liver_a ++; if(mama[j - 1][j2 + 1] is enemy && mama[j - 1][j2 + 1].alive) liver_a ++; if(mama[j + 1][j2 - 1] is enemy && mama[j + 1][j2 - 1].alive) liver_a ++; if(mama[j + 1][j2] is enemy && mama[j + 1][j2].alive) liver_a ++; if(mama[j + 1][j2 + 1] is enemy && mama[j + 1][j2 + 1].alive) liver_a ++; if(mama[j][j2 + 1] is enemy && mama[j][j2 + 1].alive) liver_a ++; if(mama[j][j2 - 1] is enemy && mama[j][j2 - 1].alive) liver_a ++; Понять бы еще, чего считает этот счетчик печенок по всему полю)))
__________________
Reality.getBounds(this); |
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Цитата:
Мне таки было непонятно с массивами..(п) так в начале программы я создавал массивы с границами - private var mama:Array = new Array(20); //То есть тут будут 20 элементов с индексами от 0 до 19 public function LiveGame() { //Build Massive for(var j:int = 0; j < 21; j++){ mama[j] = new Array(29);//То есть тут будут 29 элементов с индексами от 0 до 28 } etc. Делаю проверку я вот для чего .. Математическая игра жизнь Из за погрешности в коде массивов и проверки ход игры идет не так =( Последний раз редактировалось PasserBy; 26.11.2012 в 10:36. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
Цитата:
При j = 19 вы обращаетесь к mama[20], который содержит в себе массив с null'ами. Соответственно, после доступа по (j2-1) вы получите из него только null, у которого нет свойства alive. Цитата:
Добавлено через 2 минуты Цитата:
|
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Цитата:
.. private var mama:Array = new Array(21); ////21 элементов массива, c инд. от 0 до 20 .. //Build Massive for(var j:int = 0; j < 21; j++){ //21 элементов массива, каждый из которых (с инд. от 0 до 20) mama[j] = new Array(27); //Приобретает значение нового массива из 27 элементов с инд. от 0 до 26 } for(var i:int = 0; i < 21; i++){ //Чекаем по циклам в том же стиле, for(var i2:int = 0; i2 < 27; i2++){ //что и создавали сие массивы (см.выше) var perem:Number = Math.random(); //Код ниже не имеет значения var some:Enemy = new Enemy(); if(perem > 0.8){ some.alive = true; } else { some.alive = false; } some.x = (i2 + 1) * 20 - 10; some.y = (i + 1) * 20 - 10; mama[i][i2] = some; //!!!! trace(i + " " + i2 + " " + mama[i][i2]); //Show me massive addChild(some); } } etc. //Код вне конструктора trace("Generation: " + e.target.currentCount); //Check LIve here var liver_a:int = 0; for(var u:int = 0; u < 20; u++){//ОБРАТИТЕ ВНИМАНИЕ, используем те же параметры, что при for(var u2:int = 0; u2 < 27; u2++){ // "населении" массива //CHECK LIVE AROUND //-- if(u > 0 && u2 > 0){//Не позволяет выходить за границы [0-20,0-26] if(mama[u - 1][u2 - 1].alive == true){ liver_a ++; } } //0- if(u2 > 0){ //Не позволяет выходить за границы [0-20,0-26] if(mama[u][u2 - 1].alive == true){ liver_a ++; } } //+- if(u < 20 && u2 > 0){//Не позволяет выходить за границы [0-20,0-26] if(mama[u + 1][u2 - 1].alive == true){ liver_a ++; } } //-0 if(u > 0){ //Не позволяет выходить за границы [0-20,0-26] if(mama[u - 1][u2].alive == true){ liver_a ++; } } //+0 if(u < 20){ //Не позволяет выходить за границы [0-20,0-26] if(mama[u + 1][u2].alive == true){ liver_a ++; } } //-+ if(u > 0 && u2 < 27){//Не позволяет выходить за границы [0-20,0-26] if(mama[u - 1][u2 + 1].alive == true){ liver_a ++; } } //0+ if(u2 < 27){ //Не позволяет выходить за границы [0-20,0-26] if(mama[u][u2 + 1].alive == true){ liver_a ++; } } //++ if(u < 20 && u2 < 27){//Не позволяет выходить за границы [0-20,0-26] if(mama[u + 1][u2 + 1].alive == true){ liver_a ++; } } /* ========================== > 3 = dead 3 = new live 2 - 3 = alive < 2 = dead ========================== */ if(mama[u][u2].alive == true){ if(liver_a > 3 || liver_a < 2){ mama[u][u2].alive = false; } else if(liver_a == 2 || liver_a == 3){ mama[u][u2].alive = true; } } else if(mama[u][u2].alive == false){ if(liver_a == 3){ mama[u][u2].alive = true; } } liver_a = 0; } } redrawFunction(); |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
И включите отладочную информацию. Вам станет видно, в какой строке проблема. |
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Цитата:
for(var u:int = 0; u < 20; u++){ for(var u2:int = 0; u2 < 27; u2++){ //ТУТ ОСТАВИТЬ .. if(u > 0 && u2 < 26){//А ЗДЕСЬ НЕОБХОДИМО ИЗМЕНИТЬ ДИАПАЗОН? if(mama[u - 1][u2 + 1].alive == true){ liver_a ++; } } .. Что касается "отладочной информации", пока не умею. Спасибо. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А Вам вообще надо для трупов считать врагов вокруг? А то может просто продолжать цикл, если mama[u][u2] уже труп и врагами не интересуется, чтобы не гонять циклы зазря.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 26.11.2012 в 13:08. |
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Цитата:
Правила игры ЖИзнь Правила Место действия этой игры — «вселенная» — это размеченная на клетки поверхность или плоскость — безграничная, ограниченная, или замкнутая (в пределе — бесконечная плоскость). Каждая клетка на этой поверхности может находиться в двух состояниях: быть «живой» или быть «мёртвой» (пустой). Клетка имеет восемь соседей (окружающих клеток). Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам: в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь; если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседей меньше двух или больше трёх) клетка умирает («от одиночества» или «от перенаселённости»). Игра прекращается, если на поле не останется ни одной «живой» клетки, если при очередном шаге ни одна из клеток не меняет своего состояния (складывается стабильная конфигурация) или если конфигурация на очередном шаге в точности (без сдвигов и поворотов) повторит себя же на одном из более ранних шагов (складывается периодическая конфигурация). |
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Столкнулся с новой проблемой, а именно с механикой самой игры. Может кто помочь?
Нужно изменить код, ибо "клетки" ведут себя нелогично main package { import flash.display.*; import flash.events.*; import flash.ui.*; import flash.utils.Timer; //@author I'm public class Main extends MovieClip{ private var CellSize:int = 10; //DEFAULT CELL SIZE private var CellPad:int = 40; //DEFAULT CELL PAD private var _max:int; //FOR MASSIVE SIZE private var mamaDefault:Array = new Array(); //DEFAULT MASSIVE private var mamaLoad:Array = new Array(); //FOR LOAD FUNCTION MASSIVE private var timeM:Timer; public function Main() { // constructor code var _grid:Grid = new Grid(CellSize, CellPad); //ADD GRID addChild(_grid); _max = CellPad - 1; creatLive(); timeM = new Timer( 200 ); timeM.addEventListener(TimerEvent.TIMER, timerListener); timeM.start(); } //CREAT MASSIVES & ADD CELL's private function creatLive():void{ var i:int; var j:int; for(i = 0; i < _max; i++){ mamaDefault[i] = new Array(); mamaLoad[i] = new Array(); for(j = 0; j < _max; j++){ var decisive:Number = Math.random(); var _cell:Cell = new Cell(CellSize); _cell.x = i * CellSize; //TAKE CELL POSITION _cell.y = j * CellSize; if( decisive > 0.9 ){ Cell(_cell).setState(1); } else { Cell(_cell).setState(0); } mamaDefault[i][j] = _cell; mamaLoad[i][j] = Cell(_cell).getState(); addChild(_cell); } } } //TIME SHIFT MANAGER private function timerListener(e:TimerEvent):void{ checkLiveAround(); } //CHECK AROUND STATUS AND WRITE IT ON MASSIVE 2 (mamaLoad) private function checkLiveAround():void{ var i1:int; var i2:int; var bros:int = 0; //POINT OF LIVE AROUND var _min:int = _max - 1; //NUMBER, FOR CHECK BORDER //trace(CellPad, _max, _min); //START CHECK MASSIVE for(i1 = 0; i1 < _max; i1++){ for(i2 = 0; i2 < _max; i2++){ // North if ( i2 > 0 ) if ( mamaDefault[i1][i2-1]._state > 0.4 ) bros++; // North East if ( i1 < _min && i2 > 0 ) if ( mamaDefault[i1+1][i2-1]._state > 0.4 ) bros++; // North West if ( i1 > 0 && i2 > 0 ) if ( mamaDefault[i1-1][i2-1]._state > 0.4 ) bros++; // South if ( i2 < _min ) if ( mamaDefault[i1][i2+1]._state > 0.4 ) bros++; // South East if ( i1 < _min && i2 < _min ) if ( mamaDefault[i1+1][i2+1]._state > 0.4 ) bros++; // South West if ( i1 > 0 && i2 < _min ) if ( mamaDefault[i1-1][i2+1]._state > 0.4 ) bros++; // East if ( i1 < _min ) if ( mamaDefault[i1+1][i2]._state > 0.4 ) bros++; // West if ( i1 > 0 ) if ( mamaDefault[i1-1][i2]._state > 0.4 ) bros++; /* DO NEW MASSIVE WITH PARAMETERS OF NEW LIVE ========================================== 2 or 3 = alive > 3 or < 2 = dead ========================================== */ if( bros == 3 || bros == 2){ mamaLoad[i1][i2] = 1; } else if( bros > 3 || bros < 2){ mamaLoad[i1][i2] = 0; } if( mamaDefault[i1][i2]._state > 0.4 && bros == 3 ){ mamaLoad[i1][i2] = 0.5; } bros = 0; } } unWriteMassive1(); //END CHECK MASSIVE } //FUNCTION TO UNWRITE FIRST MASSIVE (mamaDefault) private function unWriteMassive1():void{ var i1:int; var i2:int; for(i1 = 0; i1 < _max; i1++){ for(i2 = 0; i2 < _max; i2++){ Cell(mamaDefault[i1][i2]).setState(mamaLoad[i1][i2]); } } //trace("Complete rewrite"); } } } package { import flash.display.*; import flash.events.*; import flash.ui.*; public class Cell extends Sprite{ private var _size:int = 10; public var _state:Number = 1; //THIS ALPHA public var ok:Boolean = false; //Alive STATUS private var gra:Shape = new Shape(); public function Cell(size:int) { // constructor code _size = size; gra.graphics.beginFill(0x000000,1); gra.graphics.drawRect( 0, 0, _size, _size); gra.graphics.endFill(); gra.addEventListener(Event.ENTER_FRAME, checkState); addChild(gra); } //LISTENER OF GRA private function checkState(e:Event):void{ this.alpha = _state; } //TAKE STATE public function setState(stateHere:Number):void{ _state = stateHere; } //GET STATE public function getState():Number{ return _state; } } } Последний раз редактировалось Котяра; 29.12.2012 в 21:12. |
|
|||||
|
Banned
Регистрация: Nov 2012
Сообщений: 43
|
Ах!!!!!....Проблема Решена!!! эйфория, кайф ))))
Решение: Код который был(вырезка) if( bros == 3 || bros == 2){ mamaLoad[i1][i2] = 1; } else if( bros > 3 || bros < 2){ mamaLoad[i1][i2] = 0; } if( mamaDefault[i1][i2]._state > 0.4 && bros == 3 ){ mamaLoad[i1][i2] = 0.5; } bros = 0; Вот..В приложенных файлах няшная рабочая версия. всем спасибо! Последний раз редактировалось Котяра; 29.12.2012 в 21:12. |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:11. |
|
|
« Предыдущая тема | Следующая тема » |
|
|