Игра “Подкидной дурак”.
I. Структура программы.
Программа является диалоговой, и все деиствия исходят от ползователя (игрока), а именно от нажатия клавиш мыши. При инициализации запускаются так называемые классы слушатели
...
addMouseListener(this);
addMouseMotionListener(this);
...
и при нажатии клавиши происходит событие определенное в Java как mouseReleased(MouseEvent e) (нажатие и отпускание клавиши), в этом методе считыватся координаты курсора и передаются в метод step(int x, int y), который по сути и является основным. В нем в зависимости от значения переменной proces и x,y выполняются необходимые проверки по сравнению карт и методы заполняющие массивы on_k, on_t, my, comp т. е. происходит просто очередной ход (step-шаг, ход) игры.
II. Основные структуры и типы данных.
Апплет представляет собой один java класс. В программе заведено четыре массива содержащие номера карт:
int comp[]=new int [37]; // карты компьютера
int my[]=new int [37]; // карты игрока
int on_t[]=new int [7]; // “кинутые на стол” (те которые кроют)
int on_k[]=new int [7]; // “на картах” (те которыми бьют)
int koloda[]=new int [37];// колода
сами же картинки(карты) заносятся определённым образом при инициализации апплета в массив:
Image img[]=new Image [45];
III. Сравнение карт.
В массиве img[](содержит рисунки) первые 36 элементов карты остальное кнопочки и фон. Карты заносятся по мастям (сначала все одной масти, затем другой) а также в каждой масти по ворастанию. Заполнив, таким образом массив (т. е. мы тем самым пронумеровали рисунки, и будем сравнивать естественно номера карт) довольно легко определить как масть, так и величину карты:
public int get_mast(int k)
{ return((k/9)+1); }
Так в моей программе буби имеют номер один (т. е. они занесены в массив первыми с индексами от 0 до 8), но мне важно не узнавать название масти, а проверять их на равенство. Для сравнения двух карт с учетом масти: проверяем равенство их мастей и сравниваем их номера. В случае же, когда игрок подкидывает карты, требуется не совпадение мастей, а равенство карт “по величине” (9 буби и 9 крести), т. к. они хранятся по возрастанию и по масти, а вмасти 9 карт то величина карты есть остаток от деления на 9:
((my[i]%9)==(on_k[j]%9))
Проверяем равенство j-ой карты “на столе” и i-ой игрока.
IV. Графический интерфейс.
Вывод графических объектов в Java осуществляется с помощью метода paint(), который обращается к методу update(). При рисовании выводятся карты из массивов comp (только рубашки), on_t, on_k и my. В связи стем, что приходится перерисовывать всё игровое поле(600x400) возник эффект мерцания, который удалось устранить методом двойной буферизации. Неэкранный буфер организован с помощью класса Image (создается рисунок, в который выводятся все объекты, а затем он на экран).
public void update(Graphics g2)
{
Image offImg=createImage(600,400);//создали Буфер
Graphics g=offImg.getGraphics();
//получили его графический контекст
...
//заполняем фоновым изоражением
g.drawImage(img[42],0,0,600,400,this);
for(int i=1; i<=com_kol; i++)
{ g.drawImage(img[36],10+st,10,w,h,this);
st+=st_h;
}
st=0;
for(int i=1; i<=on_t_kol; i++)
{ g.drawImage(img[on_t[i]],10+st,20+h,w,h,this);
st+=(w+2);
}
st=0;
for(int i=1; i<=on_k_kol; i++)
{ g.drawImage(img[on_k[i]],10+st,40+h,w,h,this);
st+=(w+2);
}
st=0;
for(int i=1; i<=my_kol; i++)
{ g.drawImage(img[my[i]],10+st,50+2*h,w,h,this);
st+=st_h;
}
...
g2.drawImage(offImg,0,0,this);
}
public void paint(Graphics g){update(g);}
Но несмотря на все эти ухищрения в Win98 имеются графические артефакты, которых нет в WinNT.
на главную | к играм | наш университет | написать письмо |