Страница 2 из 7
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 26 ноя 2012, 23:54
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, но сейчас уже сплю. В другой раз, а может, и сам справишься.
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 27 ноя 2012, 00:19
Lampy
ну попробую до завтрашнего дня все сделать, как я понял, главное в программировании ставить не большие для себя задачи а потом решать их, это самый хороший способ научиться чему-то )сейчас тоже уже сплю но завтра думаю за день справлюсь и оптимизирую код)
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 27 ноя 2012, 21:02
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") ; } } } }
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 27 ноя 2012, 21:51
Alazaur
Удалять слушатели следует не с e.target, а с e.currentTarget.
e.target - тот, кто рассылает событие.
e.currentTarget - тот кто подписан на событие.
То есть e.target может вполне быть не тем, на ком висит слушатель, а одним из его детей. В результате чего слушатель по-просту не удалится. Это конечно может случиться не при всех типах событий, но например при мышиных запросто. Возьмите просто это в привычку.

Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 27 ноя 2012, 22:25
Lampy
спасибо
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 27 ноя 2012, 22:55
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; } //этот кусок кода вставить в слушатель до первого ифа}
Т.к. не очень понял алгоритм работы проверки на победу - с этим, думаю, справишься сам.
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 06 дек 2012, 04:54
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" ; } } } }
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 06 дек 2012, 14:27
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;
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 06 дек 2012, 18:52
gpv123
Не люблю разбираться в чужом коде, так что держите мой
Код: Выделить всё
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
Re: Criss-Cross или научите быть не быдло кодером
Добавлено: 06 дек 2012, 19:53
Alazaur