"""lunar lander algoritma
1-ana ekran:
score #### altitude ####
time #### Horizontal Speed ####
fuel #### vertical speed ####
ustten 24 pixel yukardaki menu için ayrilacak.
2-zemin:
128 pixel total x te var
zemin zone lara bolunecek zone=128/4 (32)
40 pixel de y de var
ilk_nokta = ilk noktayi y de 44-64 arasinda bir rassal bir sayidan basla x 0 olacak
yon = 0-100 arasi bir rassal sayi sec sayi tek ise asagi, sayi cift ise yukari yon tayini yap
basamak = 1-4 arasi bir rassal sayi daha sec bu da kac pixel boyunca secilen yone gidilecegini versin
adim = secilen sayi kadar 1-4 arasi rassal sayi sec bu da her adimda kac pixel y degeri degisecek onun için
zemine dogallik vermek için
once yon belirle-> asagi ya da yukari
sonra o yonde en az ne kadar gitmesi gerektigini belirle (basamak)
o yönde rassal adimlarla o kadar gitsin (adim)
sonra bir rassal daha uret bu duzluk olsun (tek hareket x e eklenecek cizgi cekilecek)
yeni yonu belirlerken zeminin ekrandaki konumuna bak eger fazla yukarda ya da fazla asagida ise
yonu rassal verme asagida ise yukari yukarda ise asagi dogru ver eger ortalarda ise rassal ver
siradaki_nokta=(x+=4),y+=adim
2 nokta arasina cizgi cek
alarda modulun inmesi için LZ yerleri belirlenmesi;
LZ_adet = 1-5 arasi rassal sayi
eger LZ_adet>0 ise
LZ_siklik=zone//LZ_adet
LZ=1-LZ_siklik arasi rassal sayi ver
eger tetik==1 ise 1 adim y = y yap yani 4 pixellik duz bir alan yapmis olduk
LZ_adet-=1 yap
LZler adli bir liste acýp bunu sozluge ekle daha sonra inis yaparken kordinatlari burdan kontrol edilecek
3-lander Modulu cizimi
"""
from machine import Pin,I2C
import time
import math
import ssd1306
import random
i2c=I2C(0,sda=Pin(0),scl=Pin(1),freq=2000000)
oled=ssd1306.SSD1306_I2C(128,64,i2c)
random.seed()
score1=0
zaman=0
yakit=1000
yukseklik=24
yatay_hiz=0
dikey_hiz=0
oled.fill(0)
ana_ekran={"score":score1,
"time":zaman,
"fuel":yakit,
"altitude":yukseklik,
"Horizontal_Speed":yatay_hiz,
"Vertical_Speed":dikey_hiz,
}
#ANA EKRAN OGELERI
def ana_ekran():
oled.text("SCORE",0,0)
oled.text("TIME",0,8)
oled.text("FUEL",0,16)
oled.text("ALTITUDE",80,0)
oled.text("HORZ_SPEED",80,8)
oled.text("VERT_SPEED",80,16)
#ZEMIN CIZIMI
def zemin():
x_min=0
x_max=127
x=x_min
y_min=25
y_max=63
y=random.randint(54,63)
zone=128//4
LZ_adet=random.randint(3,5)#oyunda kac LZ olacak
LZ_siklik=int((zone/LZ_adet))#LZ lerin yan yana sikliklari
yukari=0
asagi=0
duzluk=0
while True:
mutasyon=random.randint(1,3)#zemin engebe katsayisi
#LZ belirlemesi
if LZ_adet>0:
LZ=random.randint(1,LZ_siklik)#ilgili an LZ çizimi baslasin mi baslamasin mi tayini
if not LZ==1:
LZ_siklik-=1
basamak=random.randint(1,4)#kac pixel boyunca secilen yone gidilecegi
#yon tayini
yon=random.randint(1,100)%2
if yon==1 and not y>55:
yon_katsayi=1#yon asagi
asagi+=1
elif yon==1 and y>55:
yon_katsayi=-1#yon yukari
yukari+=1
elif yon==0 and not y<35:
yon_katsayi=-1#yon yukari
yukari+=1
elif yon==0 and y<35:
yon_katsayi=1#yon asagi
asagi+=1
#düzlük
if yukari>0 or asagi>0 or not LZ==1:
duzluk=random.randint(1,6)
if yukari>0: yukari=0
if asagi>0: asagi=0
else:
LZ_adet-=1
basamak=5
yon_katsayi=1
else:
basamak=random.randint(1,4)#kac pixel boyunca secilen yone gidilecegi
#yon tayini
yon=random.randint(1,100)%2
if yon==1 and not y>55:
yon_katsayi=1#yon asagi
asagi+=1
elif yon==1 and y<55:
yon_katsayi=-1#yon yukari
yukari+=1
elif yon==0 and not y<35:
yon_katsayi=-1#yon yukari
yukari+=1
elif yon==0 and y>35:
yon_katsayi=1#yon asagi
asagi+=1
#düzlük
if yukari>0 or asagi>0 or not LZ==1:
duzluk=random.randint(1,6)
if yukari>0: yukari=0
if asagi>0: asagi=0
for i in range(basamak):
if basamak==5:
adim=0
x2=x+1
else:
if duzluk==0:
adim=random.randint(1,4)#her adimda kac pixel y degeri degisecek
adim=int(adim*mutasyon)
x2=x+4
else:
x2=x+duzluk
adim=0
duzluk=0
y2=y+(adim*yon_katsayi)
if y2>63:
y2=63
elif y2<34:
y2=34
oled.line(x, y, x2, y2, 1)
if basamak==5:
oled.line(x, y+2, x2, y2+2, 1)
x=x2
y=y2
if x2>127:
return
ana_ekran()
zemin()
oled.show()