Page 1 of 5

Игра ЯЙЦА

Posted: Mon Dec 21, 2015 6:33 am
by Фант
Тему поднятую Tantrixx решил вывести в отдельную тему. Игра с открытым кодом. Желающие могут посмотреть, пйоучиться и подкорректировать программу.
Игра ЯЙЦА.
[code]'установочные команды
GRAPHICS
'SET TOOLBAR OFF
PAGE 2 SET
PAGE 2 COLOR 1,0,0,.7
PAGE 2 HIDE
PAGE 1 SET
SET ORIENTATION LANDSCAPE
RANDOMIZE
OPTION BASE 1
OPTION ANGLE DEGREES
OPTION TEXT POS CENTRAL
OPTION SPRITE POS CENTRAL
OPTION IMAGE POS CENTRAL
SET LISTS CUSTOM
SET BUTTONS CUSTOM
OPTION SORT DESCENDING
REFRESH OFF
maxx=SCREEN_WIDTH()
maxy=SCREEN_HEIGHT()
kof=maxy/768
kof1=maxx/1024
SHADOW OFFSET 2*.kof,2*.kof
DRAW FONT SIZE 40*.kof
'ввод переменных
c=40*.kof
x(1)=c ! x(2)=maxx-c ! x(3)=c ! x(4)=maxx-c
y(1)=c ! y(2)=c ! y(3)=5*c ! y(4)=5*c

'графика
SPRITE 0 BEGIN 8*c,20*.kof
GRAPHICS CLEAR 0,0,1
SPRITE END
SPRITE 0 AT 3*c,4*c ANGLE 45
SPRITE 0 STAMP
SPRITE 0 AT 3*c,8.9*c ANGLE 45
SPRITE 0 STAMP
SPRITE 0 AT maxx-3*c,4*c ANGLE 135
SPRITE 0 STAMP
SPRITE 0 AT maxx-3*c,8.9*c ANGLE 135
SPRITE 0 STAMP
DRAW LINE 0,maxy-100*.kof TO maxx,maxy-100*.kof
DRAW LINE 0,maxy-200*.kof TO maxx,maxy-200*.kof
DRAW LINE maxx/2,maxy-200*.kof TO maxx/2,maxy
FOR i=1 TO 3
DRAW CIRCLE maxx/2-200*.kof+100*.kof*i,100*.kof SIZE 25*.kof,40*.kof
NEXT i
REFRESH
SPRITE 0 DELETE
FILL COLOR .8,.8,.8


'создаем и размещаем на экране скрытые спрайты
FOR i=1 TO 24
SPRITE i BEGIN 50*.kof,50*.kof
FILL CIRCLE 25*.kof,25*.kof SIZE 25*kof,15*.kof
SPRITE END
ang+=15
k+=1
IF k%3=0 THEN dob+=c
IF k=1 THEN ! x(1)+=c ! SPRITE i AT x(1)-c/2,y(1)+dob ANGLE ang ! ENDIF
IF k=2 THEN ! x(2)-=c ! SPRITE i AT x(2)+c/2,y(2)+dob ANGLE ang ! ENDIF
IF k=3 THEN ! x(3)+=c ! SPRITE i AT x(3)-c/2,y(3)+dob ANGLE ang ! ENDIF
IF k=4 THEN ! x(4)-=c ! SPRITE i AT x(4)+c/2,y(4)+dob ANGLE ang ! ENDIF
IF k=4 THEN k=0
NEXT i
'спрайт корзинка
DRAW COLOR 0,0,0
SPRITE "kor" BEGIN 160*.kof,80*.kof
FILL COLOR 1,1,0
FILL CIRCLE 80*.kof,0 SIZE 80*.kof
SPRITE END
SPRITE "kor" AT -500,-500
SPRITE "kor" SHOW

'установки уровня игры-их необходимо регулировать в главном цикле в зависимости от задач игры
ur=5 'частота появления яиц. с каждым уровнем надо уменьшать на 1.
t=1 ' определяет скорость движения яиц-постепенно должна уменьшаться.

tim=TIME()
PAGE 1 SHOW

' главный цикл
LOOP:
' считываем касание кнопок экрана
GET TOUCH 0 AS xx,yy
IF xx<=maxx/2 AND xx>-1 AND yy>maxy-100*.kof THEN kor=23
IF xx<=maxx/2 AND xx>-1 AND yy<maxy-100*.kof AND yy>maxy/2 THEN kor=21
IF xx>maxx/2 AND yy>maxy-100*.kof THEN kor=24
IF xx>maxx/2 AND yy<maxy-100*.kof AND yy>maxy/2 THEN kor=22
'устанавливаем корзинку в нужное место
IF kor=21 THEN SPRITE "kor" AT maxx/2-6*c, c*7
IF kor=23 THEN SPRITE "kor" AT maxx/2-6*c, c*12
IF kor=22 THEN SPRITE "kor" AT maxx/2+6*c, c*7
IF kor=24 THEN SPRITE "kor" AT maxx/2+6*c, c*12
'по истечении заданного времени (время определяющее скорость яиц) производим подсветку нужного яйца
IF TIME()>tim+t THEN
katS
'сравниваем последнее на дощечке яйцо с переменной касания кнопки.
FOR i=21 TO 24
i$=i
IF SPRITE_VISIBLE (i$)=1 THEN
IF kor=i THEN
'совпадение
korS
n+=1
t-=.005 ' изменение установочного параметра скорости
IF n=5 THEN ur-=1 ' изменение уровня появления нового яйца
IF n%20=0 AND ur>2 THEN ur-=1
'пишем на корзинке количество собранных яиц
SPRITE "kor" BEGIN
FILL COLOR 1,1,0
FILL CIRCLE 80*.kof,0 SIZE 80*.kof
DRAW TEXT n AT 80*.kof,40*.kof
SPRITE END
ELSE
'ошибка-яйцо разбилось
nn+=1
FOR ii=1 TO 10
IF ii%2=0 THEN PAGE 2 HIDE ELSE PAGE 2 SHOW
piskS
PAUSE .1
NEXT ii
FILL COLOR 1,0,0
FILL CIRCLE maxx/2-200*.kof+100*.kof*nn,100*.kof SIZE 25*.kof,40*.kof
REFRESH
'конец игры
IF nn=3 THEN
GRAPHICS CLEAR .2,.2,.2
PAGE 1 HIDE
DRAW FONT SIZE 60*.kof
DRAW TEXT "КОНЕЦ ИГРЫ" AT .maxx/2,.maxy/2-100*.kof
DRAW FONT SIZE 40*.kof
DRAW TEXT "Собранные ЯЙЦА: "&n AT .maxx/2,.maxy/2
DRAW RECT .maxx/2,.maxy/2+200 SIZE 100*.kof,50*.kof
DRAW TEXT "OK" AT .maxx/2,.maxy/2+200
REFRESH
PAUSE 1
nazh
loo:
GET TOUCH 0 AS xx,yy
IF xx>-1 THEN RUN "Яйца.txt"
GOTO loo
ENDIF
ENDIF
SPRITE i HIDE
ENDIF
NEXT i
'мигание экрана(появление красной пустой страницы
FOR i=20 TO 1 STEP -1
i$=i
IF SPRITE_VISIBLE (i$)=1 THEN ! SPRITE i HIDE ! SPRITE i+4 SHOW ! GET SPRITE i+4 POS x1,y1 ! ENDIF
NEXT i
tim=TIME()
'появление нового яйца на случайной дощечке
IF k%ur=0 THEN
sl=RND(4)+1
SPRITE sl SHOW
ENDIF
k+=1
ENDIF
GOTO LOOP

'функция касания
DEF nazh
LOOP:
IF NOT x>-1 THEN LOOP
END DEF

'звук попадания яйца в корзину
DEF korS
NOTES MIDI 0,12,115
k=40+.i
NOTES MIDI 0,9,k,127
END DEF

'звук движения яйца
DEF katS
NOTES MIDI 1,12,120
NOTES MIDI 1,9,61,127
END DEF

'звук ошибки
DEF piskS
k=RND(7)+60
NOTES MIDI 2,12,123
NOTES MIDI 2,9,k,127
END DEF[/code]

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 1:33 pm
by Фант
Не много усовершенствовал программу:
[code]'установочные команды
GRAPHICS
'SET TOOLBAR OFF
PAGE 2 SET
PAGE 2 COLOR 1,0,0,.7
PAGE 2 HIDE
PAGE 1 SET
SET ORIENTATION LANDSCAPE
RANDOMIZE
OPTION BASE 1
OPTION ANGLE DEGREES
OPTION TEXT POS CENTRAL
OPTION SPRITE POS CENTRAL
OPTION IMAGE POS CENTRAL
SET LISTS CUSTOM
SET BUTTONS CUSTOM
OPTION SORT DESCENDING
REFRESH OFF
maxx=SCREEN_WIDTH()
maxy=SCREEN_HEIGHT()
kof=maxy/768
kof1=maxx/1024
SHADOW OFFSET 2*.kof,2*.kof
DRAW FONT SIZE 40*.kof
DRAW FONT NAME "AmericanTypewriter-Light"
DRAW COLOR 0,0,.5
'ввод переменных
c=40*.kof
x(1)=c ! x(2)=maxx-c ! x(3)=c ! x(4)=maxx-c
y(1)=c ! y(2)=c ! y(3)=5*c ! y(4)=5*c

'графика
kletka
SPRITE 0 BEGIN 8*c,20*.kof
GRAPHICS CLEAR 0,0,1
DRAW RECT 4*c,10*.kof SIZE 4*c,10*.kof
SPRITE END
SPRITE 0 ALPHA .8
SPRITE 0 AT 3*c,4*c ANGLE 45
SPRITE 0 STAMP
SPRITE 0 AT 3*c,8.9*c ANGLE 45
SPRITE 0 STAMP
SPRITE 0 AT maxx-3*c,4*c ANGLE 135
SPRITE 0 STAMP
SPRITE 0 AT maxx-3*c,8.9*c ANGLE 135
SPRITE 0 STAMP
DRAW LINE 0,maxy-100*.kof TO maxx,maxy-100*.kof
DRAW LINE 0,maxy-200*.kof TO maxx,maxy-200*.kof
DRAW LINE maxx/2,maxy-200*.kof TO maxx/2,maxy
DRAW TEXT "ЛЕВО-ВЕРХ" AT .maxx/4,.maxy-150*.kof
DRAW TEXT "ЛЕВО-НИЗ" AT .maxx/4,.maxy-50*.kof
DRAW TEXT "ПРАВО-ВЕРХ" AT .maxx-.maxx/4,.maxy-150*.kof
DRAW TEXT "ПРАВО-НИЗ" AT .maxx-.maxx/4,.maxy-50*.kof
FOR i=1 TO 3
DRAW CIRCLE maxx/2-200*.kof+100*.kof*i,100*.kof SIZE 25*.kof,40*.kof
NEXT i
REFRESH
SPRITE 0 DELETE
FILL COLOR .95,.8,.7


'создаем и размещаем на экране скрытые спрайты
FOR i=1 TO 24
SPRITE i BEGIN c*2,c*2
FILL CIRCLE c,c SIZE c,c*.6
DRAW CIRCLE c,c SIZE c,c*.6
SPRITE END
ang+=15
k+=1
IF k%3=0 THEN dob+=c
IF k=1 THEN ! x(1)+=c ! SPRITE i AT x(1)-c/2,y(1)+dob ANGLE ang ! ENDIF
IF k=2 THEN ! x(2)-=c ! SPRITE i AT x(2)+c/2,y(2)+dob ANGLE ang ! ENDIF
IF k=3 THEN ! x(3)+=c ! SPRITE i AT x(3)-c/2,y(3)+dob ANGLE ang ! ENDIF
IF k=4 THEN ! x(4)-=c ! SPRITE i AT x(4)+c/2,y(4)+dob ANGLE ang ! ENDIF
IF k=4 THEN k=0
NEXT i
'спрайт корзинка
DRAW COLOR 0,0,.5
SPRITE "kor" BEGIN 160*.kof,80*.kof
FILL COLOR 1,1,0
FILL CIRCLE 80*.kof,0 SIZE 80*.kof
DRAW CIRCLE 80*.kof,0 SIZE 80*.kof
DRAW LINE 0,0 TO 160*.kof,0
SPRITE END
SPRITE "kor" AT .maxx/2,.maxy/2
SPRITE "kor" SHOW
'спрайт кнопка
SPRITE "knop" BEGIN .maxx/2,100*.kof
FILL COLOR 0,0,0
FILL RECT .maxx/4,50*.kof SIZE .maxx/4,50*.kof
SPRITE END
SPRITE "knop" AT -500,-500
SPRITE "knop" ALPHA .1
SPRITE "knop" SHOW


'установки уровня игры-их необходимо регулировать в главном цикле в зависимости от задач игры
ur=5 'частота появления яиц. с каждым уровнем надо уменьшать на 1.
t=1 ' определяет скорость движения яиц-постепенно должна уменьшаться.

tim=TIME()
PAGE 1 SHOW

' главный цикл
LOOP:
' считываем касание кнопок экрана
GET TOUCH 0 AS xx,yy
IF xx<=maxx/2 AND xx>-1 AND yy>maxy-100*.kof THEN kor=23
IF xx<=maxx/2 AND xx>-1 AND yy<maxy-100*.kof AND yy>maxy-200*.kof THEN kor=21
IF xx>maxx/2 AND yy>maxy-100*.kof THEN kor=24
IF xx>maxx/2 AND yy<maxy-100*.kof AND yy>maxy-200*.kof THEN kor=22
IF xx>-1 THEN
IF kor=21 THEN SPRITE "knop" AT .maxx/4,.maxy-150*.kof
IF kor=23 THEN SPRITE "knop" AT .maxx/4,.maxy-50*.kof
IF kor=22 THEN SPRITE "knop" AT .maxx-.maxx/4,.maxy-150*.kof
IF kor=24 THEN SPRITE "knop" AT .maxx-.maxx/4,.maxy-50*.kof
ELSE
SPRITE "knop" AT -500,-500
ENDIF
'устанавливаем корзинку в нужное место
IF kor=21 THEN SPRITE "kor" AT maxx/2-7*c, c*7
IF kor=23 THEN SPRITE "kor" AT maxx/2-7*c, c*12
IF kor=22 THEN SPRITE "kor" AT maxx/2+7*c, c*7
IF kor=24 THEN SPRITE "kor" AT maxx/2+7*c, c*12
'по истечении заданного времени (время определяющее скорость яиц) производим подсветку нужного яйца
IF TIME()>tim+t THEN
katS
'сравниваем последнее на дощечке яйцо с переменной касания кнопки.
FOR i=21 TO 24
i$=i
IF SPRITE_VISIBLE (i$)=1 THEN
IF kor=i THEN
'совпадение
korS
n+=1
t-=.005 ' изменение установочного параметра скорости
IF n=5 THEN ur-=1 ' изменение уровня появления нового яйца
IF n%20=0 AND ur>2 THEN ur-=1
'пишем на корзинке количество собранных яиц
SPRITE "kor" BEGIN
FILL COLOR 1,1,0
FILL CIRCLE 80*.kof,0 SIZE 80*.kof
DRAW CIRCLE 80*.kof,0 SIZE 80*.kof
DRAW LINE 0,0 TO 160*.kof,0
DRAW TEXT n AT 80*.kof,40*.kof
SPRITE END
ELSE
'ошибка-яйцо разбилось
nn+=1
FOR ii=1 TO 10
IF ii%2=0 THEN PAGE 2 HIDE ELSE PAGE 2 SHOW
piskS
PAUSE .1
NEXT ii
FILL COLOR 1,0,0
FILL CIRCLE maxx/2-200*.kof+100*.kof*nn,100*.kof SIZE 25*.kof,40*.kof
REFRESH
'конец игры
IF nn=3 THEN
kletka
PAGE 1 HIDE
DRAW FONT SIZE 60*.kof
DRAW TEXT "КОНЕЦ ИГРЫ" AT .maxx/2,.maxy/2-100*.kof
DRAW FONT SIZE 40*.kof
DRAW TEXT "Собранные ЯЙЦА: "&n AT .maxx/2,.maxy/2
DRAW RECT .maxx/2,.maxy/2+200 SIZE 100*.kof,50*.kof
DRAW TEXT "OK" AT .maxx/2,.maxy/2+200
REFRESH
PAUSE 1
nazh
loo:
GET TOUCH 0 AS xx,yy
IF xx>-1 THEN RUN "Яйца.txt" ' начало новой игры
GOTO loo
ENDIF
ENDIF
SPRITE i HIDE
ENDIF
NEXT i
'мигание экрана(появление красной пустой страницы
FOR i=20 TO 1 STEP -1
i$=i
IF SPRITE_VISIBLE (i$)=1 THEN ! SPRITE i HIDE ! SPRITE i+4 SHOW ! GET SPRITE i+4 POS x1,y1 ! ENDIF
NEXT i
tim=TIME()
'появление нового яйца на случайной дощечке
IF k%ur=0 THEN
sl=RND(4)+1
SPRITE sl SHOW
ENDIF
k+=1
ENDIF
GOTO LOOP

REM ЛИСТ БУМАГИ В КЛЕТКУ
DEF kletka
SHADOW ON
ord=25
GRAPHICS CLEAR .99,.99,1
x=CEIL(.maxx/ord)
y=CEIL(.maxy/ord)
DRAW ALPHA .1
FOR i=1 TO x
IF i=x-5 THEN
DRAW ALPHA .3
DRAW SIZE 3*.kof
DRAW COLOR .8,0,0
ELSE
DRAW ALPHA .1
DRAW SIZE 1*.kof
DRAW COLOR 0,0,.5
ENDIF
DRAW LINE i*ord,0 TO ord*i,.maxy
NEXT i
FOR i1=1 TO y
DRAW LINE 0,ord*i1 TO .maxx,ord*i1
NEXT i1
DRAW ALPHA 1
SHADOW OFF
END DEF

'функция касания
DEF nazh
LOOP:
IF NOT x>-1 THEN LOOP
END DEF

'звук попадания яйца в корзину
DEF korS
NOTES MIDI 0,12,115
k=40+.i
NOTES MIDI 0,9,k,127
END DEF

'звук движения яйца
DEF katS
NOTES MIDI 1,12,120
NOTES MIDI 1,9,61,127
END DEF

'звук ошибки
DEF piskS
k=RND(7)+60
NOTES MIDI 2,12,123
NOTES MIDI 2,9,k,127
END DEF[/code]

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 2:24 pm
by Tantrixx
Фант, что означают данные переменные?
IF k%3=0 THEN
IF n%20=0
IF ii%2=0 THEN
IF k%ur=0 THEN
И так далее. Процент между буквой и цифрой?
И для чего page? В неё можно скопировать экран и убрать спрайты, чтоб место не занимали в оперативке?

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 3:24 pm
by Фант
%-это остаток от деления.
Тоесть if k%3=0 означает следующее: ЕСЛИ число К разделить на три получится без остатка (обозначает 0) ТО....
Тоесть данной операцией я ищу каждое третье число К: 0,3,6,9 итак далее...
К примеру if k%2<>0 then я буду искать все нечетные числа, а if k%2=0 then... Буду искать все четные числа.
Page-это страница. Если честно она для меня оказалась сложна для понимания, пришло время-разобрался. Со страницей надо долго рабираться.
В двух словах эта штуковина позволяет работать сразу с множеством спрайтов либо объектов интерфейса: можно легко перемещать, можно прятать. Так же страницу можно закрашивать в любой цвет и применять к ней прозрачность-закрывать тем самым графическое окно или объекты интерфейса с спрайтами созданных на другой странице. Штука очень полезная

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 3:46 pm
by Tantrixx
Спасибо, Фант. Очень интересно и полезно. Я первый раз заметил проценты в программе одного форумчанина. Пример мультиспрайта.
i_sp_up = (i_sp_up + 1)%8 При нажатии кнопки вверх там к спрайту кадр 16 прибавляют i_sp_up
По механике получается, что с 17 по 24 кадр прокручивается спрайт и опять с 17 начинает. Т.е. Здесь %8 означает, что со спрайта берётся только те 8 кадров?

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 3:51 pm
by Mr. Kibernetik
Tantrixx wrote:Я первый раз заметил проценты в программе одного форумчанина.
Смотрите в документации к smart BASIC, раздел "Основы", "Выражения".

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 3:55 pm
by Фант
Tantrixx wrote:Спасибо, Фант. Очень интересно и полезно. Я первый раз заметил проценты в программе одного форумчанина. Пример мультиспрайта.
i_sp_up = (i_sp_up + 1)%8 При нажатии кнопки вверх там к спрайту кадр 16 прибавляют i_sp_up
По механике получается, что с 17 по 24 кадр прокручивается спрайт и опять с 17 начинает. Т.е. Здесь %8 означает, что со спрайта берётся только те 8 кадров?
Без понятия :D

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 4:06 pm
by Фант
Tantrixx! Не забывайте что у Вас благодаря sB в руках не просто девайс со стандартными функциями-у Вас в руках мощная вычислительная машина, которая способна решать любые математические задачи!
Если с какойто функцией у Вас проблема с восприятием-можно просто провести любой математический расчет и все сразу станет нагляднее и понятнее!
Вот пример для понимания:
a=16
5
n+=1
a=(a+1)%8
PRINT a
IF n<8 THEN GOTO 5
Можете также поэкспериментировать с другими вариантами :ugeek:

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 7:26 pm
by Tantrixx
Фант, я правильно понял, если сделать на экране отпечаток спрайта, а спрайт удалить делит, то он оперативку не кушает? Но у меня с отпечатками спрайта возникла проблема. Когда пишу stamp у меня не работает функция отражения flip 1. Получилось, что все 4 курицы смотрят в одну сторону :)

Re: Игра ЯЙЦА

Posted: Mon Dec 21, 2015 7:47 pm
by Фант
Tantrixx wrote:Фант, я правильно понял, если сделать на экране отпечаток спрайта, а спрайт удалить делит, то он оперативку не кушает? Но у меня с отпечатками спрайта возникла проблема. Когда пишу stamp у меня не работает функция отражения flip 1. Получилось, что все 4 курицы смотрят в одну сторону :)
Нет спрайта-нет ззанимаемой памяти этим спрайтом. Рисование в графическом окне практически вообще не потребляет оперативки.
Да это проблема-не желательная. Если это действительно так то надо написать в разделе ошибок нашему Верховному! :D
Думаю это надо исправить. но если это ошибка то исправится не скоро. Поэтому В настоящий момент предлагаю курицы задействовать как спрайты. Но чтобы они тупо не занимали место, К примеру, можно сделать что в момент появления первого яйца на жердочке-курица подскакивает. Тоесть делает движение вверх вниз.