Portál AbcLinuxu, 2. května 2025 13:40
Pravděpodobně všichni znáte Python. Jde o objektově orientovaný programovací jazyk s velmi čistým zápisem. Python má už v základní instalaci spoustu modulů, pro vše možné, nicméně kde to pokulhává, to je grafika a grafické uživatelské rozhraní. Zde je dostupné pouze Tk, které má ale své nedostatky, kupříkladu nevypadá nic moc (chápej, vypadá jinak než GTK+). To se dá řešit rozšířením PyGTK nebo jiným, nicméně pokud chceme psát hry, tak to stále nebude ono.
V tomto případě jistě sáhneme po rozšíření PyGame, to zpřístupňuje funkce knihovny SDL a doplňuje k ní několik dalších užitečných prvků. Výsledek je kombinací jednoduchosti a lehkosti Pythonu a možností SDL.
Abych si to vyzkoušel, pustil jsem si Moonsorrow a zkusil napsat malé přistání na měsíci (nebo na čemkoliv jiném). Výsledek je zatím dost k ničemu, jsou v něm chyby, je neúplné a tak podobně. Přesto, něco to dělá a to na padesáti řádkách a během půl hodiny. Což není vůbec zlý výsledek
Na malém obrázku vidíte jak to vypadá Běží to v okně, i když fullscreen pygame zvládne taky. Rovněž je to natrvdo ve velikosti 640x480, ale opět, to je jen pro moji lenost. Raketka je představována jediným červeným pixelem (opět, šlo by to udělat hezčeji, ale zase by to byla práce navíc
), vlevo máte údaje o vaši výšce, palivu a rychlosti. Brzdit můžete mezerníkem. Pohybujete se pouze a jedině nahoru a dolů, přičemž program nekompromisně končí po dosažení nulové výšky, pak už jenom vypíše konečnou rychlost.
Vzhledem k tomu jak je to krátké, tak si můžu dovolit sem dát celý zdroják Předpokládám, že tam je pár chyb a dost věcí udělaných nic moc, ale pak už se mi chtělo moc spát…
#!/usr/bin/python import pygame from pygame.locals import * grav = 1 def keyboard (rocket): engine = 0 for event in pygame.event.get (KEYDOWN): keys = pygame.key.get_pressed () engine = keys [K_SPACE] if engine: rocket.burn = 0.01 class rocket: a = 0 burn = 0 def chpos (self, grav): if (self.burn > self.fuel): self.burn = self.fuel burna = (self.burn * 1000) / (self.mass + self.fuel) self.a = self.a + grav - burna self.pos[1] = self.pos[1] + self.a self.fuel = self.fuel - self.burn self.burn = 0 def draw (self, surface): surface.lock () surface.set_at ([self.pos[0]/100, self.pos[1]/100], [255,0,0,0]) surface.unlock () def __init__(self): self.pos = [32000,0] self.fuel = 2.0 self.mass = 1.0 disp = pygame.display surf = disp.set_mode ([640,480]) pygame.init () pygame.key.set_repeat (50,30) x = rocket () Fnt = pygame.font.Font (None, 40) while (x.pos[1] < 48000): if not pygame.time.get_ticks () % 30: surf.fill ([0,0,0,0]) keyboard (x) x.chpos (grav) x.draw (surf) osd = Fnt.render (str(48000 - x.pos[1])+' '+str(x.fuel)+' '+str(x.a), 0, [0,255,0,0]) surf.blit (osd, [0,0]) disp.update () print x.a
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.