Worm v1.0 (BETA)

Listopad 17, 2009

Beta je konacno vani 🙂

Dugo je trajalo ali se isplatilo!
Vise procitajte na Worm stranici, (link povise)

Worm v0.3

Listopad 13, 2009

Worm lijepo napreduje, dosli smo do faze #3!
U ovoj fazi primarni cilje je bio napraviti rast crva i skupljanje hrane. Uz ove primarne ciljeve dodano je jos i
– primitivno racunanje bodova
– promijenjena je boja crva

Ovo je prva verzija koja ima gameplay ali je jako siromasan i ima jedan bug koji ce biti ispravljen u sljedecoj verziji.

Znani bugovi:
– kad se krecete u jednom smjeru i pritisnete strelicu za drugi igra se prekida

Ako nadete jos koji bug komentirajte ili me obavjestite mail-om.

Eh da skoro zaboravih

Kod

import pygame
import random

class Worm:
    def __init__(self, surface):
        self.surface = surface
        self.x = surface.get_width() / 2
        self.y = surface.get_height() / 2
        self.length = 1
        self.grow_to = 50
        self.vx = 0
        self.vy = -1
        self.body = []
        self.crashed = False
        self.color = (255,255,0)

    def eat(self):
        self.grow_to = 25

    def event(self, event):
        if event.key == pygame.K_UP:
            self.vx = 0
            self.vy = -1
        elif event.key == pygame.K_DOWN:
            self.vx = 0
            self.vy = 1
        elif event.key == pygame.K_LEFT:
            self.vx = -1
            self.vy = 0
        elif event.key == pygame.K_RIGHT:
            self.vx = 1
            self.vy = 0

    def move(self):
        self.x += self.vx
        self.y += self.vy

        if (self.x, self.y) in self.body:
            self.crashed
= True

        self.body.insert(0, (self.x, self.y))

        if (self.grow_to > self.length):
            self.length
+= 1

        if len(self.body) > self.length:
            self.body.pop()

    def draw(self):
        for x, y in self.body:
           
self.surface.set_at((x,y), self.color)

    def position(self):
        return self.x, self.y

class Food:
    def __init__(self, surface):
        self.surface = surface
        self.x = random.randint(0,
surface.get_width())
        self.y = random.randint(0,
surface.get_height())
        self.color = (255,255,255)

    def draw(self):
        self.surface.set_at((self.x, self.y),
self.color)

    def position(self):
        return self.x, self.y

w = 500
h = 500

screen = pygame.display.set_mode((w, h))
clock = pygame.time.Clock()

score = 0
worm = Worm(screen)
food = Food(screen)
running = True

while running:
    screen.fill((0,0,0))
    worm.move()
    worm.draw()
    food.draw()

    if worm.crashed:
        running = False
    elif worm.x <= 0 or worm.x >= w – 1:
        running = False
    elif worm.y <+ 0 or worm.y >= h – 1:
        running = False
    elif worm.position() == food.position():
        score += 1
    worm.eat()
    print "Score: %d" %score
    food = Food(screen)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running =
False
        elif event.type == pygame.KEYDOWN:
            worm.event(event)

    pygame.display.flip()
    clock.tick(30)

Linije 2

Listopad 13, 2009

Linije su me pocele sve vise i vise impresionirati, prijee nisam ni znao da se tako nesto da napraviti linijama 🙂
Kako mi je obicna zica promjenila zivot. Opet novi rad, napredniji od dosadasnjih. Jos planiram dodati animaciju tako da ovo jos nije gotovo. Neka vas ne zbuni osjecaj oblosti, rad je nacinjen samo od ravnih linija 🙂
Kod pronadite ispod screenshota.
Screenshot
Free Image Hosting at www.ImageShack.us

<

Kod
import pygame

w = h = 500
screen = pygame.display.set_mode((w+1, h+1))
clock = pygame.time.Clock()
running = True
size = 250
step = 10
color = (255,255,255)

for x in range(0, size+1, step):
    pygame.draw.line(screen, color, (0, size-x), (x, 0))
    pygame.draw.line(screen, color, (w – (size-x), 0), (w, x))
    pygame.draw.line(screen, color, (w, h – (size-x)), (w-x, h))
    pygame.draw.line(screen, color, (250-x, h), (0, h-x))

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running =
False
    pygame.display.flip()
    clock.tick()

😉

Worm [Python+PyGame] v0.2

Listopad 12, 2009

Faza 2

U ovoj sam se verziji pozabavio self collisionom. Sto se ispostavilo kao ne tako pretesko i brzo je bio zavrseno!
Ostao je jedan bug koji cu rijesiti uskoro :). Ovaj zadatak je rijesen a u sljedecoj verziji cu pokusati malo optimizirati kod…
Evo koda
_________________________________
import pygame

class Worm:
    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False

    def key_event(self, event):

        if event.key == pygame.K_UP:
            self.dir_x = 0
            self.dir_y = -1
        elif event.key == pygame.K_DOWN:
            self.dir_x = 0
            self.dir_y = 1
        elif event.key == pygame.K_LEFT:
            self.dir_x = -1
            self.dir_y = 0
        elif event.key == pygame.K_RIGHT:
            self.dir_x = 1
            self.dir_y =

    def move(self):

        self.x += self.dir_x
        self.y += self.dir_y

        r, g, b, a = self.surface.get_at((self.x, self.y))
        if (r, g, b) != (0,0,0):
            self.crashed = True

        self.body.insert(0, (self.x, self.y))

        if len(self.body) > self.length:
            self.body.pop()

    def draw(self):
        for x, y in self.body:
           
self.surface.set_at((x, y), (255, 255, 255))

width = 640
height = 480

screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
running = True

w = Worm(screen, width/2, height/2, 200)

while running:
    screen.fill((0,0,0))
    w.draw()
    w.move()

    if w.crashed or w.x <=0 or w.x >=width-1 or w.y <=0 or w.y>=height-1:
        print "Crash!"
        running = False

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            w.key_event(event)

    pygame.display.flip()
    clock.tick(240)

__________________________________

Worm [Python+PyGame] v0.1

Listopad 12, 2009

Ok ovo sam morao prije napraviti ali nisam imao volje a sad je hvala bogu imam 😀

Radim na svojoj prvoj grafickoj igri. Ta igra je klon vrlo popularne igre ‘Zmija’ veoma zastupljene na Nokijinim mobitelima :). Za sada nemam u planu nikakve “dodatke” vec samo jednostvna kopija, skupljate tocke i rastete.

Za sada sam rijesio nesto sto ja volim zvati “movement, self-collision & border collision”. Sa self collision-om(dodirom) ima jedan bug koji mi se trenutno neda pisati ali vec u sljedecom postu ce biti ispravljen jer treba dodati samo par linija koda ;).

Pa pocnimo 🙂

Faza 1
Primarni cilj mi je bio napraviti movement, dakle, “crv” se krece povrsinom a vi ga upravljate strelicama (gore, dolje, lijevo, desno), sto mi je predstavilo malo glavolomku jer nisam znao kako rijesiti da pixel prati “glavu” sto sam nekako uspio :P. Sljedeci problem mi je bio kako napraviti da zadnja tocka nestaje,tu mi je pomogao moj vjerni prijatelj Google 🙂 i nasao sam funkciju koja brise odredene stvari na zaslonu! I sljedeci problem je bio kako napraviti provjeru dali je udareno u rub, za sto je bila dovoljna jedna if petlja :P. Ok mislim da je dosta price za prvu fazu, vas naravno zanima samo kod 😉 pa evo ga:

_______________________________
import pygame

class Worm:
    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False

    def key_event(self, event):

        if event.key == pygame.K_UP:
            self.dir_x = 0
            self.dir_y = -1
        elif event.key == pygame.K_DOWN:
            self.dir_x = 0
            self.dir_y = 1
        elif event.key == pygame.K_LEFT:
            self.dir_x = -1
            self.dir_y = 0
        elif event.key == pygame.K_RIGHT:
            self.dir_x = 1
            self.dir_y = 0

    def move(self):

        self.x += self.dir_x
        self.y += self.dir_y

        r, g, b, a = self.surface.get_at((self.x, self.y))
        if (r, g, b) != (0,0,0):
            self.crashed = True

        self.body.insert(0, (self.x, self.y))

        if len(self.body) > self.length:
            self.body.pop()

    def draw(self):
        for x, y in self.body:
            self.surface.set_at((x, y), (255, 255, 255))

width = 640
height = 480

screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
running = True

w = Worm(screen, width/2, height/2, 200)

while running:
    screen.fill((0,0,0))
    w.draw()
    w.move()

    if w.crashed or w.x <= 0 or w.x >= width-1 or w.y <= 0 or w.y >= height-1:
        print "Crash!"
        running = False

    for event in pygame.event.get():
        if event.type == pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                w.key_event(event)

    pygame.display.flip()
    clock.tick(240)
___________________________________

Linije

Listopad 10, 2009

Jučer sam dobio inspiraciju i napravio dva rada. Meni su veoma inspirativni i svaki put kad ih pogledam dobijem inspiraciju za učenje (programiranja naravno). Još je zanimljivije kad znate da cijeli program(i) od grafike imaju samo dvije linije 🙂 . Kod možete vidjeti ispod.

Prvi rad
Bilo mi je dosadno pa sam otvorio python i razmišljao… Pogledao sam kroz prozor i vidio žicu od bandere. Čudno ali ona me isnpirirala da se uhvatim posla. Napravio sam jednu vodoravnu liniju koja ide gore dolje po ekranu. I dalje mi je bilo dosadno pa sam išao dodati jednu okomitu koja ide lijevo desno po ekranu i dobio sam veoma zanimljiv rezultat 🙂 možete ga provjeriti s kodom odmah ispod ovog teksta:
_________________________________________

import pygame

y = 0
x = 0
diry = 1
dirx = 1
running = 1
width = 800
height = 600
resolution = (800,600)
screen = pygame.display.set_mode(resolution)
linecolor = (255, 0,0)
bgcolor = (0,0,0)

while running:
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        running = 0

    screen.fill(bgcolor)
    pygame.draw.line(screen, linecolor, (0, y), (width-1, y))
    pygame.draw.line(screen, linecolor, (x, 0), (x, height))

    y = y + diry
    if y == 0 or y == height-1:
        diry = -diry

    x = x + dirx
    if x == 0 or x == width:
        dirx = -dirx

    pygame.display.flip()

_____________________________________________
Drugi rad

Radi se opet samo o dvije linije koje mijenjaju sijecište i fade-aju se. Veoma ugodno oku :). također možete isprobati sa kodom i ovaj put dolje niže.

_____________________________________________

import pygame

bgcolor = (0,0,0)
blueval = 0
bluedir = 1
x = y = 0
running = 1
screen = pygame.display.set_mode((640, 480))

while running:
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        running = 0
    elif event.type == pygame.MOUSEMOTION:
        x, y = event.pos

    screen.fill(bgcolor)
    pygame.draw.line(screen, (0,0,blueval), (x, 0), (x, 479))
    pygame.draw.line(screen, (0,0,blueval), (0, y), (639, y))
    blueval += bluedir
    if blueval == 255 or blueval == 0:
        bluedir = -bluedir

    pygame.display.flip()

___________________________
Nadam se da će i vas ovo potaknuti i inspirarati da se malo prihvatite koda! 😉