Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
5 лет назад

48 FreeBASIC. Программируем "Жизнь". Расстанавливаем клетки мышью.

Для отладки программы в её тексте мы заполнили 7 клеток подряд единицей, можно было бы и дале так заполнять массив вручную, в тексте программы. Но было бы хорошо сделать редактор - расстановку клеток жизни на поле,например мышью.

Команды работы с мышью указаны в уроках 35, 36.

Но как по экранным координатам занести значения в массив? Точно так же как и при выводе массива-жизни на экран(расстановке кружочков, клеток жизнь).. только направив конвертацию в обратную сторону.

if life(x,y)=1 then circle(2*R*x+K,2*R*y+K),R*0.7,2:paint(2*R*x+K,2*R*y+K),2,2

В программе то что выдает GetMouse я обозначил через mx,my

Решив уравнение mx=2Rx+K найдём x=(mx-K)/2/R, возьмём целую часть... x=int((mx-K)/2/R)

Do
    mr = GetMouse (mx, my, , mb)
    If mr = 0 Then 
      If mb And 1 Then 
          x=int((mx-K)/2/R)
          y=int((my-K)/2/R)
          if lifenew(x,y)=1 then 
                lifenew(x,y)=0
                paint(2*R*x+K,2*R*y+K),0,0
                circle(2*R*x+K,2*R*y+K),R*0.7,0
             else 
                lifenew(x,y)=1
                circle(2*R*x+K,2*R*y+K),R*0.7,2
                paint(2*R*x+K,2*R*y+K),2,2
          End IF
      End If
    End If
loop while asc(inkey())<>27 and asc(inkey())<>32 

Стоит немного улучшить программу, т.к. при установке клетки она неоднокрано устанавливается и снимается. Добавим условие чтобы в обном и том же месте не устанавливалась/не снималась клетка.

Do
    mr = GetMouse (mx, my, , mb)
    If mr = 0 Then 
      If mb And 1 and (mx<>mxo or my<>myo or mb<>mbo) Then 
          x=int((mx-K)/2/R)
          y=int((my-K)/2/R)
          if lifenew(x,y)=1 then 
                lifenew(x,y)=0
                paint(2*R*x+K,2*R*y+K),0,0
                circle(2*R*x+K,2*R*y+K),R*0.7,0
             else 
                lifenew(x,y)=1
                circle(2*R*x+K,2*R*y+K),R*0.7,2
                paint(2*R*x+K,2*R*y+K),2,2
          End IF
          mxo=mx:myo=my:mbo=mb
      End If
    End If
loop while asc(inkey())<>27 and asc(inkey())<>32 
12
558.659 GOLOS
На Golos с October 2016
Комментарии (3)
Сортировать по:
Сначала старые