1

Одно время в App Store была доступна версия Color Lines от Piston Games. Они дают совет: Для того, чтобы сэкономить на разработке прототипа, можно купить несколько пачек M&Ms и попробовать игру в оффлайне.

На данном этапе у нас стоит задача построить математическую модель игры. Поэтому вы можете воспользоваться тем, чем вам удобней и привычней решать задачи, ручкой и листком бумаги, M&Ms или шахматной доской и шашками, либо сразу писать код.

Причем здесь математика? К примеру, мы глядя на приведенную выше фотографию, можем различить цвета, лежащих на листе конфет. А как это сделает процессор, для которого мы пишем программу? Процессор умеет работать с числами, если быть точнее, то только с двумя, нулем и единицей (двоичная система исчислений, используемая нами в коде программы десятичная, при компиляции переводится в двоичную). Все что мы видим на экране устройств, является следствием операций вычислений чисел. Поэтому первое что приходит в голову это поставить соответствие нашему игровому полю массив целочисленных значений, где числу 0 соответствует пустая клетка, а числам от 1 до 7 цветные шарики.

unsigned int cells[9][9];

Прежде чем продолжить, предлагаю самостоятельно решить несколько задач:

  1. В целочисленном массиве 9 на 9, элементами которого являются числа от 0 до 7, выбрать произвольно три нулевых элемента (другими словами на игровом поле произвольно найти три пустые клетки)
  2. Присвоить элементу в строке i и столбце j значение k и проверить получилась ли хотябы одна линия по горизонтали, вертикали или диагонали, состоящая не менее 5 значений k и проходящая через данную ячейку (другими словами в заданную клетку игрового поля положить шарик заданного цвета и проверить завершится ли хотя бы одна одна линия)
  3. Даны две координаты двух ячеек массива, проверить можно ли попасть из одной ячейки в другую передвигаясь по соседним нулевым ячейкам (другими словами, проверить можно ли из одной клетки игрового поля попасть в другую передвигаясь по пустым клеткам)

Для решения задачи 1, т.е. для поиска нулевых элементов, нам потребуется задать массив. Напишем метод initGame. Вы наверное уже обратили внимание, Xcode постоянно пытается нам помочь, я только ввел первые буквы оператора for, а Xcode уже догадался о моем намерении и предложил полную конструкцию

мне остается только нажимать клавишу Tab и заполнять необходимыми мне значениями. Получили:

- (void) initGame {
    int i, j;
    for (i=0; i<9; i++) {
        for (j=0; j<9; j++) {
            cells[i][j]=random()%8;
        }
    }
}

т.е. мы заполнили игровое поле шариками произвольных цветов. random()%8 дает значения от 0 до 7. А вызов [self initGame]; добавим в метод initWithCoder:. Метод drawRect перепишем следующим образом

- (void)drawRect:(CGRect)rect
{
    int i, j;
    CGRect imageRect;
    CGContextRef context=UIGraphicsGetCurrentContext();
    int cellSize=self.frame.size.height/9;
    imageRect.size = CGSizeMake(cellSize, cellSize);
    
    for (i=0; i<9; i++) {
        for (j=0; j<9; j++) {
            imageRect.origin = CGPointMake(cellSize*j, cellSize*i);
            CGContextDrawImage(context, imageRect, image[0]);
            if (cells[i][j]>0) {
                CGContextDrawImage(context, imageRect, image[cells[i][j]]);
            }
        }
    }
    for (i=0; i<9; i++) {
        for (j=0; j<9; j++) {
            if (cells[i][j]==0) {
                CGContextSetLineWidth(context, 3.0);
                CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
                imageRect.origin = CGPointMake(cellSize*j, cellSize*i);
                CGContextAddRect(context, imageRect);
                CGContextStrokePath(context);
            }
        }
    }
}

теперь наш метод выводит на экран массив cells, находит нулевые элементы и обводит их желтой линией

Ваша задача, сделать так, чтоб он обвел не все пустые клетки, а только три произвольных. Свои решения присылайте по адресу Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра..

Для решения второй задачи добавим метод:

- (int) dropBallToI:(int) ii AndJ:(int) jj WithColor:(int) cc {
    int k=0;
    cells[ii][jj]=cc;
    return k;
}

т.е. присвоим элементу массива с координатами ii и jj значение cc. Изменим

- (void) initGame {
    int i, j;
    for (i=0; i<9; i++) {
        for (j=0; j<9; j++) {
            cells[i][j]=0;
        }
    }
}

теперь он будет обнулять массив cells. Уберем код, который обводит желтым пустые клетки.

Для того, чтобы созданные нами методы были доступны другим классам, добавим в CLGameFieldView.h

- (void) initGame;
- (int) dropBallToI:(int) ii AndJ:(int) jj WithColor:(int) cc;

Изменим метод

- (IBAction)restartButton:(UIButton *)sender {
    [_gameFieldView initGame];
    [_gameFieldView setNeedsDisplay];
}

Перепишем

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    int i, j;
    UITouch *touch = [touches anyObject];
    if ([touch view]==_gameFieldView) {
        int cellSize=_gameFieldView.frame.size.height/9;
        CGPoint P1 = [touch locationInView:_gameFieldView];
        i=P1.y/cellSize;
        j=P1.x/cellSize;
        [_gameFieldView dropBallToI:i AndJ:j WithColor:1];
        [_gameFieldView setNeedsDisplay];
    }
}

Что это нам даст? Теперь мы можем прикоснуться к любой клетке игрового поля и выставить туда красный шарик. А так же можем очистить игровое поле нажав на кнопку Reset.

На рисунке 8 линий по 4 шарика, если поставить шарик по середине, то все линии должны исчезнуть!

Ваша задача дополнить метод dropBallToI: AndJ: WithColor: проверкой завершает ли этот шарик линию и если да, то возвратить количество шариков и присвоить очки игроку.

Свои решения присылайте по адресу Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра..

Продолжение следует…