Игра «горячо-холодно»

После некоторого баловства с графическими функциями Icon в голову пришла дикая, но вместе с тем совершенно крутая идея — написать на Icon старую, но местами занятную игрушку «горячо-холодно».

Суть игры в следующем: на поле m*n пикселей спрятана некая фигура (при этом поле выглядит абсолютно пустым), а пользователь должен ее найти, нажимая левой клавиши мыши на участки поля, где по его мнению спрятана фигура.

Поскольку, фигура по размеру довольно небольшая, то поиски без каких-либо ориентиров довольно занудны и непрактичны сами по себе. Поэтому в качестве ориентира можно использовать расстояние (в геометрической интерпретации) от точки по которой кликнул пользователь до точки в которой находиться сокрытая фигура. Используя, расстояние в качестве ориентира нетрудно обнаружить местоположение фигуры за небольшое количество кликов (20 кликов — достаточное количество для новичка).

Сама программа довольно тривиальна: сначала создается прямоугольник с совершенно случайными координатами на поле 500*500 пикселей и закрашивается белым цветом (стандартный цвет фона), а затем создается бесконечный цикл repeat для отлова событий (в нашем случае щелчок левой клавишей мыши и нажатие на некоторые другие клавиши).

В цикле repeat c помощью функции Event() из библиотеки IPL graphics будем отслеживать событие &lpress (щелчок левой клавиши мыши) — и как только пользователь щелкнет в какой-либо точке игрового поля, программа зафиксирует координаты точки щелчка (стандартные переменные &x и &y) и передаст их в процедуру detect(), которая вычислит попадают ли координаты точки, указанной пользователем в координаты скрытой фигуры (т.е. принадлежит ли точка, указанная пользователем скрытой фигуре).

В случае попадания точки в область расположения фигуры — программа отобразит саму фигуру (т.е. окрасит ее в черный цвет) и выведет окно с надписью «You win!!!» (Вы победили !!!). Однако, если точка не попадет в область фигуры, то в левом верхнем углу после надписи «Score:» будет выведено расстояние до скрытой фигуры.

В общем, сама программа:

link graphics,random
global x,y,a,b,s
procedure main()
local W
W:=WOpen("size=500,500")
randomize()
x:=?500
y:=?500
a:=20
b:=10
s:=0
DrawString(0,10,"Score:"||s)
Fg("white")
FillRectangle(x,y,a,b)
repeat {
case Event() of {
"q" : exit()
"f" : {
	Fg("black")
	FillRectangle(x,y,a,b)
 	}
"c" : {
	Fg("white")
	FillRectangle(x,y,a,b)
	}
	&lpress : detect()
	&rpress : write(&x,",",&y)
	}
}
WDone()
end

procedure detect()
if x<=&x<=(x+a) & y<=&y<=(y+b) then {
Fg("white")
FillRectangle(0,0,110,20)
Fg("black")
FillRectangle(x,y,a,b)
Notice("You win !!!")
WDelay(20)
exit()
}
else {
Fg("white")
FillRectangle(0,0,110,20)
s:=sqrt(((x-&x)^2)+(y-&y)^2)
WDelay(5)
Fg("black")
DrawString(0,10,"Score:"||s)
}
end

Управление:
q — закрыть программу;
f — отобразить скрытую фигуру (но это уже читерство);
c — спрятать фигуру.

Кроме того, не обращайте внимание на событие &rpress (щелчок правой клавишей мыши) — оно введено для отладки и выводит в консоль координаты точки по которой щелкнули правой клавишей мыши).

Скриншоты получившейся игры:

game1_0_o

game2_0_o

game3_0_o

Добавить комментарий