После некоторого баловства с графическими функциями 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 (щелчок правой клавишей мыши) — оно введено для отладки и выводит в консоль координаты точки по которой щелкнули правой клавишей мыши).
Скриншоты получившейся игры: