Игра Подкидной дурак”.

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.


на главную к играм наш университет написать письмо
1