Java



           

Java наконец-то стала Mobile - часть 2


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

Типичный класс Canvas выглядит так:

  pr
public class MyCanvas extends Canvas implements CommandListener {
  public MyCanvas() {
    // Инициализация необходимых переменных происходит
    // здесь. Например, мы хотим создать еще одну команду
    // меню:
     addCommand(new Command("Exit", Command.EXIT, 1));

  }

  public void commandAction(Command command, Displayable displayable) {
    // Здесь происходит обработка команд меню.
  }

  protected synchronized void keyPressed(int keyCode) {
    // Здесь происходит перехват нажатий клавиш управления
    // телефона
  }

otected void paint(Graphics g) {
    // Рисуем здесь
  }
} // end of class

Для получения более детальной информации обратитесь к исходному коду приложения на компакт-диске. Для того чтобы помочь вам разобраться с исходным кодом, ниже мы разместили некоторые комментарии.

Логика игры реализована в классе Engine. Алгоритм игры достаточно прост, мы обходим все варианты комбинаций в двумерном массиве, отражающем текущее состояние игрового поля. При этом, анализируя массив из трех полей — сечение (две диагонали, три вертикали и три горизонтали), мы расставляем приоритеты. Если приоритет встретившейся комбинации выше приоритета текущей комбинации, то встретившаяся комбинация становится текущей.

Ниже, c краткими пояснениями, приведено тело функции, которая является сердцем алгоритма:

  protected boolean analaize()
  {
    // считаем,сколько в одном ряду крестиков, ноликов, пустых мест:
    int x_counter = 0;
    int o_counter = 0;
    int e_counter = 0;
    for (int i = 0; i < buffer.size(); i++)
    {
      Cell cell = (Cell)buffer.elementAt(i);
      if (cell.value == STATE.E)
      {
        e_counter++;
      }
      if (cell.value == STATE.O)
      {
        o_counter++;
      }
      if (cell.value == STATE.X)
      {
        x_counter++;
      }
    }
// В зависимости от количества крестиков, ноликов или пустых
// мест определяем комбинацию (тип состояния) — searchState
    int _searchState = SEARCH_STATE.ANY;
    // user win
    if (x_counter == 3)
    {
      _searchState = SEARCH_STATE.X_X_X;
      this.gameState = GAMESTATE.USERWIN;
      return true;
    }
    // engine can win :
    if ((o_counter == 2)&&(e_counter == 1))
    {
      _searchState = SEARCH_STATE.O_O_E;
    }
    // danger - user can win :
    if ((x_counter == 2)&&(e_counter == 1))
    {
      _searchState = SEARCH_STATE.X_X_E;
    }
    // good combination :
    if ((o_counter == 1)&&(e_counter == 2))
    {
      _searchState = SEARCH_STATE.O_E_E;
    }
    // also good combination :
    if (e_counter == 3)
    {
      _searchState = SEARCH_STATE.E_E_E;
    }
    // Если приоритет новой комбинации больше приоритета
    // текущей комбинации,определяем новую комбинацию как
    // текущую и запоминаем ее в переменных класса:
    if (this.searchState < _searchState)
    {
      this.searchState = _searchState;
      this.searchBuffer = new Vector();
      // copy vector:
      for (int i = 0; i < this.buffer.size(); i++)
      {
        this.searchBuffer.addElement(this.buffer.elementAt(i));
      }
    }
    return false;
  }




Содержание  Назад  Вперед