Criss-Cross или научите быть не быдло кодером

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Casperovskii »

Так, во-первых массивы.

Код: Выделить всё

var grillesArray:Array = new Array();for (var i:int = 0; i<9; i++) {    grillesArray[i] = new Grille();    grillesArray[i].x = *пишу на коленке, поэтому формулы буквами* (остаток деления i на 3) * 50;    grillesArray[i].y = (округление вниз от (остаток деления i на 3)) * 50;    addChild(grillesArray[i]);    grillesArray[i].addEventListener(MouseEvent.CLICK, grillesClickLisneter);}
И делаешь общий слушатель для всех.

Код: Выделить всё

private function ChoiseCriss (e:MouseEvent) : void {crissOrCircle = "criss";}
в слушателе grillesClickLisneter:

Код: Выделить всё

private function grillesClickLisneter (e:MouseEvent) : void { k++; //переменная для подсчета крестиков и ноликов, уже поставленных if (crissOrCircle == "criss") { figure[k] = newCriss(e.target.x, e.target.y); e.target.removeEventLisneter(grillesClickLisneter);//убираем слушателя, чтобы нельзя было поставить на то же самое место } elseIf (crissOrCircle == "cirlce") { figure[k] = Circle(e.target.x, e.target.y); e.target.removeEventLisneter(grillesClickLisneter); //убираем слушателя, чтобы нельзя было поставить на то же самое место }}
Прошу прощения за недочеты и ошибки, писал на коленке. Будут вопросы - обращайся. Найду время - отвечу. Ну и к этому коду стоит присобачить, конечно, запись в таблицу, где крестик, где нолик - но я бы это сделал через switch, но сейчас уже сплю. В другой раз, а может, и сам справишься.
Lampy
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:09

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Lampy »

ну попробую до завтрашнего дня все сделать, как я понял, главное в программировании ставить не большие для себя задачи а потом решать их, это самый хороший способ научиться чему-то )сейчас тоже уже сплю но завтра думаю за день справлюсь и оптимизирую код)
Lampy
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:09

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Lampy »

Переделав код, столкнулся с несколькими проблемами, на данный момент обдумываю 2 очень важных вопроса, как добавить поочерёдность ходов и как задать функцию победы крестиков или ноликов, но думаю к ночи с этим справлюсь) или хотя бы с чем-то одном, а пока хотелось бы чтобы вы задали мне какую-то задачку на данном примере, а точнее что еще добавить) Код ниже

Код: Выделить всё

package Study {    import flash.display.Sprite;    import flash.events.MouseEvent;    import flash.sampler.NewObjectSample;        /**     * ...     * @author П     */    public class CrissCrossClass extends Sprite     {                                private var ChoiseX:GrilleClass = new GrilleClass (); // добавление решеток для кнопок         private var ChoiseO:GrilleClass = new GrilleClass();                private var criss:NewCriss; // добавление эклемпляров класса крестика и нолика        private var cirlce:Circle;                private var CrissOrCross:String; // добавление переменной, для оператора if, тем самым обеспечить пользователю выбор кнопки                private var grilleArray:Array = new Array() ; // добавление массива, для цикла добавления  клеток                public function CrissCrossClass()         {            ChoiseX.x += 300 ;  // добавление решеток для кнопок            ChoiseO.x += 350 ;            addChild(ChoiseX);            addChild(ChoiseO);                                              ChoiseX.addEventListener(MouseEvent.CLICK , Choisexxx) ; // добавление события, при нажатии выбирая крестик или нолик            ChoiseO.addEventListener(MouseEvent.CLICK , Choiseooo);                                    for (var i:int = 0; i < 9 ; i++)  // цикл добавления решеток            {            grilleArray[i] = new GrilleClass();                        grilleArray[i].x = (i % 3) *50  ;            grilleArray[i].y =  Math.floor ( i/3) * 50;            addChild(grilleArray[i]);                        grilleArray[i].addEventListener(MouseEvent.CLICK , ClickMouse); // слушатель событий для добавления крестика или нолика в ячейку                        }                                            }        private function Choiseooo (e:MouseEvent) : void { // функции, где переменой дается значение крестик или нолик                        CrissOrCross = "Cross";            }                private function Choisexxx (e:MouseEvent) : void {                        CrissOrCross = "Criss" ;            }                private function ClickMouse (e:MouseEvent) : void {  // функция, добавления                        if (CrissOrCross == "Criss") {            criss = new NewCriss (0, 0);            addChild(criss);            criss.x = e.currentTarget.x +60  ;            criss.y = e.currentTarget.y + 60 ;                        e.target.removeEventListener(MouseEvent.CLICK, ClickMouse);            trace(CrissOrCross);            }            if (CrissOrCross == "Cross") {            cirlce = new Circle (0, 0);            addChild(cirlce);            cirlce.x = e.currentTarget.x +75  ;            cirlce.y = e.currentTarget.y + 75 ;                        e.target.removeEventListener(MouseEvent.CLICK, ClickMouse);                                trace("Nolik") ;                }            }    } }
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Alazaur »

Удалять слушатели следует не с e.target, а с e.currentTarget.
e.target - тот, кто рассылает событие.
e.currentTarget - тот кто подписан на событие.
То есть e.target может вполне быть не тем, на ком висит слушатель, а одним из его детей. В результате чего слушатель по-просту не удалится. Это конечно может случиться не при всех типах событий, но например при мышиных запросто. Возьмите просто это в привычку. ;)
Lampy
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:09

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Lampy »

спасибо
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Casperovskii »

Lampy
Очередность ходов можно сделать простой булевой переменной (ну или текстовой, как я в тот раз). Я же написал код для очередности ходов практически. Там следовало только в конце каждого ифа менять "КрестикилиНолик" на противоположное:

Код: Выделить всё

private function grillesClickLisneter (e:MouseEvent) : void { k++; //переменная для подсчета крестиков и ноликов, уже поставленных if (crissOrCircle == "criss") { figure[k] = newCriss(e.target.x, e.target.y); e.currentTarget.removeEventLisneter(grillesClickLisneter);//убираем слушателя, чтобы нельзя было поставить на то же самое место crissOrCircle = "circle" // в следующий раз нарисуется нолик//здесь нужно будет добавить в твои условия победы номер поля с пометкой крестик } elseIf (crissOrCircle == "cirlce") { figure[k] = Circle(e.target.x, e.target.y); e.currentTarget.removeEventLisneter(grillesClickLisneter); //убираем слушателя, чтобы нельзя было поставить на то же самое место crissOrCircle = "criss" //сменили очередность хода на ход крестиков//здесь нужно будет добавить в твои условия победы номер поля с пометкой нолик }}
Функцию победы можно сделать из массива, значения которого заполняются по мере заполнения твоего поля. Можно перебором найти, какая именно клетка (я не знаю, как узнать номер в массиве нажатой кнопки по-другому):

Код: Выделить всё

var numberOfGrill:int;for (var j:int=0; j<9; j++) { if (e.currentTarget == grillesArray[j]) { numberOfGrill = j; } //этот кусок кода вставить в слушатель до первого ифа}
Т.к. не очень понял алгоритм работы проверки на победу - с этим, думаю, справишься сам.
Lampy
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:09

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Lampy »

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

Код: Выделить всё

package Study {    import flash.display.Sprite;    import flash.events.MouseEvent;    import flash.sampler.NewObjectSample;    import flash.events.Event ;    import flash.ui.Mouse;    /**     * ...     * @author Lampy     */    public class CrissCrossClass extends Sprite     {                private var numberOfGrill:int;        private var numberOfGrill1:int;        private var numberOfGrill2:int;        private var numberOfGrill3:int;        private var numberOfGrill4:int;        private var numberOfGrill5:int;        private var numberOfGrill6:int;        private var numberOfGrill7:int;        private var numberOfGrill8:int;                private var numberOfGrills:int;        private var numberOfGrills1:int;        private var numberOfGrills2:int;        private var numberOfGrills3:int;        private var numberOfGrills4:int;        private var numberOfGrills5:int;        private var numberOfGrills6:int;        private var numberOfGrills7:int;        private var numberOfGrills8:int;                private var i:int ;                private var figure: Array = new Array () ;                private var ChoiseX:GrilleClass = new GrilleClass (); // добавление решеток для кнопок         private var ChoiseO:GrilleClass = new GrilleClass();                private var criss:NewCriss; // добавление эклемпляров класса крестика и нолика        private var cirlce:Circle;                private var CrissOrCross:String; // добавление переменной, для оператора if, тем самым обеспечить пользователю выбор кнопки                private var grilleArray:Array = new Array() ; // добавление массива, для цикла добавления  клеток                public function CrissCrossClass()         {            ChoiseX.x += 300 ;  // добавление решеток для кнопок            ChoiseO.x += 350 ;            addChild(ChoiseX);            addChild(ChoiseO);                          ChoiseX.addEventListener(MouseEvent.CLICK , Choisexxx) ; // добавление события, при нажатии выбирая крестик или нолик            ChoiseO.addEventListener(MouseEvent.CLICK , Choiseooo);                                    for ( i = 0; i < 9 ; i++)  // цикл добавления решеток            {            grilleArray[i] = new GrilleClass();                        grilleArray[i].x = (i % 3) *50  ;            grilleArray[i].y =  Math.floor ( i/3) * 50;            addChild(grilleArray[i]);                        grilleArray[i].addEventListener(MouseEvent.CLICK , ClickMouse); // слушатель событий для добавления крестика или нолика в ячейку            }            addEventListener(MouseEvent.CLICK, winfunc) ;                       }        private function Choiseooo (e:MouseEvent) : void { // функции, где переменой дается значение крестик или нолик            CrissOrCross = "Cross";            }        private function Choisexxx (e:MouseEvent) : void {            CrissOrCross = "Criss" ;            }        private function ClickMouse (e:MouseEvent) : void {  // функция, добавления            if (CrissOrCross == "Criss") {                if (e.currentTarget == grilleArray[0] ) {                     numberOfGrill += 1;                     trace(numberOfGrill)                }                if (e.currentTarget == grilleArray[1] ) {                     numberOfGrill1 += 1;                     trace(numberOfGrill1)                }                if (e.currentTarget == grilleArray[2] ) {                     numberOfGrill2 += 1;                     trace(numberOfGrill2)                }                if (e.currentTarget == grilleArray[3] ) {                     numberOfGrill3 += 1;                     trace(numberOfGrill3)                }                if (e.currentTarget == grilleArray[4] ) {                     numberOfGrill4 += 1;                     trace(numberOfGrill4)                }                if (e.currentTarget == grilleArray[5] ) {                     numberOfGrill5 += 1;                     trace(numberOfGrill5)                }                if (e.currentTarget == grilleArray[6] ) {                     numberOfGrill6 += 1;                     trace(numberOfGrill6)                }                if (e.currentTarget == grilleArray[7] ) {                     numberOfGrill7 += 1;                     trace(numberOfGrill7)                }                if (e.currentTarget == grilleArray[8] ) {                     numberOfGrill8 += 1;                     trace(numberOfGrill8)                }                                                        criss = new NewCriss (0, 0);                        addChild(criss);            criss.x = e.currentTarget.x +60  ;            criss.y = e.currentTarget.y + 60 ;            e.currentTarget.removeEventListener(MouseEvent.CLICK, ClickMouse);            CrissOrCross = "Cross" ;            }            else if (CrissOrCross == "Cross") {                if (e.currentTarget == grilleArray[0] ) {                     numberOfGrills += 1;                     trace(numberOfGrills)                }                if (e.currentTarget == grilleArray[1] ) {                     numberOfGrills1 += 1;                     trace(numberOfGrills1)                }                if (e.currentTarget == grilleArray[2] ) {                     numberOfGrills2 += 1;                     trace(numberOfGrills2)                }                if (e.currentTarget == grilleArray[3] ) {                     numberOfGrills3 += 1;                     trace(numberOfGrills3)                }                if (e.currentTarget == grilleArray[4] ) {                     numberOfGrills4 += 1;                     trace(numberOfGrills4)                }                if (e.currentTarget == grilleArray[5] ) {                     numberOfGrills5 += 1;                     trace(numberOfGrills5)                }                if (e.currentTarget == grilleArray[6] ) {                     numberOfGrills6 += 1;                     trace(numberOfGrills6)                }                if (e.currentTarget == grilleArray[7] ) {                     numberOfGrills7 += 1;                     trace(numberOfGrills7)                }                if (e.currentTarget == grilleArray[8] ) {                     numberOfGrills8 += 1;                     trace(numberOfGrills8)                }                            cirlce = new Circle (0, 0);            addChild(cirlce);            cirlce.x = e.currentTarget.x +75  ;            cirlce.y = e.currentTarget.y + 75 ;            CrissOrCross = "Criss" ;            e.currentTarget.removeEventListener(MouseEvent.CLICK, ClickMouse);            }            }        private function winfunc (e:MouseEvent) : void {            if (numberOfGrill == 1 && numberOfGrill1 == 1 && numberOfGrill2 == 1 || numberOfGrill == 1 && numberOfGrill3 == 1 &&              numberOfGrill6 == 1 || numberOfGrill == 1 && numberOfGrill4 == 1 && numberOfGrill8 == 1 || numberOfGrill3 == 1 &&               numberOfGrill4 == 1 && numberOfGrill5 == 1 || numberOfGrill6 == 1 && numberOfGrill7 == 1 && numberOfGrill8 == 1 || numberOfGrill1 == 1 &&              numberOfGrill4 == 1 && numberOfGrill7 == 1 || numberOfGrill2 == 1 && numberOfGrill5 == 1 && numberOfGrill8 == 1 ||               numberOfGrill2 == 1 && numberOfGrill4 == 1 && numberOfGrill6 == 1 ||               numberOfGrills == 1 && numberOfGrills1 == 1 && numberOfGrills2 == 1 || numberOfGrills == 1 && numberOfGrills3 == 1 &&              numberOfGrills6 == 1 || numberOfGrills == 1 && numberOfGrills4 == 1 && numberOfGrills8 == 1 || numberOfGrills3 == 1 &&               numberOfGrills4 == 1 && numberOfGrills5 == 1 || numberOfGrills6 == 1 && numberOfGrills7 == 1 && numberOfGrills8 == 1 || numberOfGrills1 == 1 &&              numberOfGrills4 == 1 && numberOfGrills7 == 1 || numberOfGrills2 == 1 && numberOfGrills5 == 1 && numberOfGrills8 == 1 ||               numberOfGrills2 == 1 && numberOfGrills4 == 1 && numberOfGrills6 == 1)                     {                        trace("you win")                        e.currentTarget.removeEventListener(MouseEvent.CLICK , winfunc);                        CrissOrCross = "stop" ;                     }            }    } }
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Alazaur »

Lampy, а зачем Вам эти переменные:

Код: Выделить всё

             private var numberOfGrill:int;            private var numberOfGrill1:int;            private var numberOfGrill2:int;            private var numberOfGrill3:int;            private var numberOfGrill4:int;            private var numberOfGrill5:int;            private var numberOfGrill6:int;            private var numberOfGrill7:int;            private var numberOfGrill8:int;                       private var numberOfGrills:int;            private var numberOfGrills1:int;            private var numberOfGrills2:int;            private var numberOfGrills3:int;            private var numberOfGrills4:int;            private var numberOfGrills5:int;            private var numberOfGrills6:int;            private var numberOfGrills7:int;            private var numberOfGrills8:int;
Добавьте в класс GrilleClass свойство кто эта ячейка крестик/нолик или нейтральная и вместо всей этой кучи проверок в функции ClickMouse можно будет написать:
if (CrissOrCross == "Criss") e.currentTarget.состояние = 1;
else e.currentTarget.состояние = 2;
gpv123
Сообщения: 346
Зарегистрирован: 29 янв 2012, 20:57

Re: Criss-Cross или научите быть не быдло кодером

Сообщение gpv123 »

Не люблю разбираться в чужом коде, так что держите мой :D

Код: Выделить всё

package{    import flash.display.*;        public class Main extends Sprite    {        public const fields:Array = [];                public function Main()        {            createFields();        }                public function createFields(e:* = null):void        {            while (numChildren) removeChildAt(0);                        for (var i:int = 0; i < 9; i++)            {                fields[i] = new Field(i % 3, Math.floor(i / 3), i);                addChild(fields[i]);            }                        Field.putCross = mouseChildren = true;        }    }} import flash.display.*;import flash.events.*;import flash.text.*;    class Field extends Sprite{    public static const WIDTH:uint = 30;        public static var putCross:Boolean = true; // нужно ли рисовать крестик        public var id:int;    public var content:int = 0; // 0 - пусто, 1 - крестик, 2 - нолик        public function Field(x:int, y:int, id:int)    {        this.x = x * WIDTH;        this.y = y * WIDTH;        this.id = id;                // рисуем квадрат высотой и шириной WIDTH        graphics.beginFill(0xffffff);        graphics.lineStyle(1);        graphics.drawRect(0, 0, WIDTH, WIDTH);                // слушаем клик        addEventListener(MouseEvent.CLICK, onClick);    }        private function onClick(e:MouseEvent):void    {        removeEventListener(MouseEvent.CLICK, onClick);        e.stopPropagation();                if (putCross)        {            content = 1;                        // рисуем крестик            graphics.moveTo(0, 0);            graphics.lineTo(WIDTH, WIDTH);            graphics.moveTo(WIDTH, 0);            graphics.lineTo(0, WIDTH);        }        else        {            content = 2;                        // рисуем нолик            graphics.drawCircle(WIDTH / 2, WIDTH / 2, WIDTH / 2);        }                putCross = !putCross;                // Проверяем, нужно ли заканчивать игру                var f:Array = Main(parent).fields, s:String, t:TextField, b:Boolean;                if (f[0].content && f[0].content == f[1].content && f[1].content == f[2].content ||            f[3].content && f[3].content == f[4].content && f[4].content == f[5].content ||            f[6].content && f[6].content == f[7].content && f[7].content == f[8].content ||            f[0].content && f[0].content == f[3].content && f[3].content == f[6].content ||            f[1].content && f[1].content == f[4].content && f[4].content == f[7].content ||            f[2].content && f[2].content == f[5].content && f[5].content == f[8].content ||            f[0].content && f[0].content == f[4].content && f[4].content == f[8].content ||            f[2].content && f[2].content == f[4].content && f[4].content == f[6].content)        {            s = (content == 1 ? 'Крестики' : 'Нолики') + ' выиграли';            b = true;        }        else if (f.every(function(item:Field, index:int, array:Array):Boolean{return Boolean(item.content);}))        {            s = 'Ничья';            b = true;        }                if (b)        {            t = new TextField();            t.autoSize = TextFieldAutoSize.LEFT;            t.y = WIDTH * 4;            t.text = s + '\nКликните, чтобы сыграть заново';            parent.addChild(t);            parent.mouseChildren = false;            stage.addEventListener(MouseEvent.CLICK, Main(parent).createFields);        }    }}
Писал очень быстро, так что могут быть ошибки. https://dl.dropbox.com/u/78886477/other ... -cross.swf
Alazaur
Разработчик
Разработчик
Сообщения: 1001
Зарегистрирован: 16 окт 2011, 20:25

Re: Criss-Cross или научите быть не быдло кодером

Сообщение Alazaur »

gpv123, дайош мультиплеер, будем гамать всем форумом! Изображение Изображение Изображение
UPD: И ставки обязательно чтоб прикрутить. А еще блэкджек и ш, а это я уже не туда попер. :D
Ответить