Игра “Крестики-нолики”.
I. Структура программы.
Основное обрабатываемое событие, как и в предыдущей игре, это нажатие клавиши мыши т. е. ход игрока. Но вместе с тем необходима обработка и настроек игры.Исходя от этих условий, апплет состоит из трех классов. В классе game_x просто происходит инициализация и размещение игрового поля, класс DrawPanel в нем просчитываются и рисуются все ходы, класс DrawControls рисуются и орабатываются кнопки панели
II. Основные структуры и типы данных.
Все основные переменные определены в классе DrawPanel, в массиве field[][] хранится всё игровое поле (крестик в виде 1, пустая клетка –1, нолик 0), массив my_ver[][] понадобился для выбора хода компьютера.
public int[][] field=new int[i_max][j_max];
public float[][] my_ver=new float[i_max][j_max];
public int i_0=0,i_1=0,j_0=0,j_1=0;
public int imax=0,imin=i_max,jmin=j_max,jmax=0;
Переменные imax, imin, jmin, jmax хранят границы области сканирования.
- Поиск ходов компьютера.
Алгоритм, на мой взгляд, не идеален, т. к. компьютер всё еще может проиграть, но и для победы игроку надо подумать. Как уже говорилось используется массив my_ver в нем хранятся “длины” серий .
Слово длины не случайно в кавычках т.к. это не длина в обычном понимании, которая на рисунке(да это тоже алгоритм но он слишком прост). Итак, найдя максимум в массиве my_ver (my_ver[0][2]==3) и поставив нолик в “эту ячейку”(field[0][2]=0), мы закроем самую длинную серию. Но поиграв в эту игру, стало понятно, что мне “одиночным сканированием” поля не обойтись.
Мною использован следующий алгоритм:
1. Нахождение максимума построкам.
2. Нахождение максимума постолбцам.
3. Нахождение максимума подиагоналям (по очереди).
(для нахождения максимума: путем сканирования заполняется массив my_ver , ищем в нем максимум (сравниваем с ранее найденными, если больше запоминаем) , обнуляем массив my_ver)
4. Нахождение максимума в пересечениях:
а) по строкам и столбцам:
Сканирую строки, заполняя массив my_ver, далее сканирую стобцы занося начения в my_ver, но если в ячеике уже что-то записано, то добавляю величину серии и вычитаю 0,51.(почему 0,51, во-первых что-то надо вычесть иначе вместо 2,47 запишем 4, что неверно, если серия ограничена с одной стороны то вычитаю 0,5)
б) по строкам и главной диагонали
в) по строкам и диагонали
г) по столбцам и главной диагонали
в) по столцам и диагонали
д) по диагоналям
Итак ( это наверно можно отнести к минусам ) в сумме получилось 4 сканиравания, но мы сканируем не все поле, а только ту часть где есть крестики.
IV. Графический интерфейс.
Все кнопки выводятся стандартными средствами Java, само же игровое поле рисуется в классе drawPanel, аналогично предыдущей игре.
на главную | к играм | наш университет | написать письмо |