Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите написать крестики-нолики (http://www.flasher.ru/forum/showthread.php?t=107386)

GreatRash 31.01.2008 16:08

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

Опишу что должно быть:
1. поле размером 300 на 300 пикселей (одна клетка будет 100х100 пикселей)
2. пока без анимации и прочих прибамбасов

На данный момент написан следующий код:
Код:

var user = null;
var computer = null;

/*
function rand(min:Number, max:Number):Number {
        var randRange:Number = Math.round(Math.random()*(max-min))+min;
        return randRange;
}
*/

function setPlayer() {
        if (Math.round(Math.random()) == 0) {
                user = "krestik_mc";
                computer = "nolik_mc";
        } else {
                user = "nolik_mc";
                computer = "krestik_mc";
        }
}
setPlayer();

function setEmpty() {
        for (var i=0; i<=2; i++) {
                for (var j=0; j<=2; j++) {
                        _root["cell_"+i+j] = 1;
                        //_root["cell_"+i+j] = 1 - пустая клетка
                        //_root["cell_"+i+j] = 2 - юзер
                        //_root["cell_"+i+j] = 3 - комп
                }
        }
}
setEmpty();

var listener:Object = new Object();
Mouse.addListener(listener);

listener.onMouseUp = function() {
        var x_num:Number = Math.round((_xmouse-50)/100);
        var y_num:Number = Math.round((_ymouse-50)/100);
       
        if (_root["cell_"+x_num+y_num] == 1) {
                var row:Number = (Math.round((_xmouse-50)/100)*100)+50;
                var col:Number = (Math.round((_ymouse-50)/100)*100)+50;
                var clip:MovieClip = _root.attachMovie(user, user+getNextHighestDepth(), getNextHighestDepth());
                clip._x = row;
                clip._y = col;
                _root["cell_"+x_num+y_num] = 2;
        }
        compTurn();
}

function compTurn() {
       
}

Не могу допереть как реализовать ход компьютера... жду советов. Всем заранее спасибо.

Fernando Costa 31.01.2008 16:13

http://www.google.com.ua/search?q=%D...L_enUA216UA217

GreatRash 31.01.2008 16:27

Да алгоритм у них не слишком сложный, а вот как его реализовать...
Вероятно надо как-то обойти все клетки и посмотреть где значения равны 2 (т.е. клетка занята юзером). Ну это можно сделать 2-ия циклами for, а вот как хранить полученные данные?
Потом надо как-то научить комп понимать, что если юзер занял 2 клетки, то 3-ю надо срочно закрыть...
Вот как все это сделать?

Fernando Costa 31.01.2008 16:45

про научить комп я вам ссылку дал. данные о каждой ячейке можно хоанить в массиве с 9 элементами, в чем проблема?

GreatRash 31.01.2008 17:02

Спасибо, буду вникать.

GreatRash 31.01.2008 17:23

По вашей ссылке нашел следующий алгоритм:
Цитата:

1)проверить доску, и посчитать количество знаков на каждой диагонали.
2)если есть диагональ, содержащая только одну пустую клетк, ход делается на неё. Если таких несколько (трудно представить, как до такого могло дойти, но мало ли) - на общую пустую клетку либо на случайную.
3)если есть есть несколько диагоналей с двумя пустыми клетками, ход делается на клетку, которую пересекает наибольшее число диагоналей этого типа. (с одной занятой клеткой).
4)если все предыдущеие пункты не срабатывают, ход делается на центральную клетку, или (если хотите дать шанс на победу) - на случайную.
Сразу застопорился на первом пункте. А именно непонятно как узнать, что 2 клетки на одной диагонали заняты?
Попутно возник вопрос как в AS создать массив вида array(key=>value)

Fernando Costa 31.01.2008 17:28

Код:

var arr:Array = new Array();
arr[0]='X'
arr[1]='0'
arr[2]=' '
arr[3]='0'

и так до 8. а посчитать какие из них диагональные я думаю не проблема :)

GreatRash 31.01.2008 17:43

Ниче не получается... мож я изначально неправильно делаю просто?
Код:

var arr:Array = new Array();

function compTurn() {
        for (var i=0; i<=2; i++) {
                for (var j=0; j<=2; j++) {
                        arr["cell_"+i+j] = _root["cell_"+i+j];
                }
        }
        trace(arr); //ничего, даже ошибок не выдает :(((
}

и не понятно как потом считать какие из них диагональные...

Fernando Costa 31.01.2008 18:20

блин, нарисуй решетку - пронумеруй ее, слева-направо пронумеруй от 0 до 8, и посмотри какие ячейки диагональные.

Что должен делать твой код?

GreatRash 31.01.2008 18:28

Мой код должен записать массив такого вида:
arr(cell_00=1, cell_01=1, cell_02=1, cell_10=1, cell_11=1, ...);
и получать доступ к элементу массива я хочу так:
trace(arr["cell_00"]);
ну типа как ассоциативный массив в PHP

А решетка у меня и так пронумерована, это происходит в самом начале кода (см. первый пост).
Выглядит так:

cell_00|cell_01|cell_02
----------------------
cell_10|cell_11|cell_12
----------------------
cell_20|cell_21|cell_22


Часовой пояс GMT +4, время: 18:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.