Aller au contenu

[python]graphismes


momo

Messages recommandés

bon je suis toujours aussi nul mais je me suis lancé dans un projet à la con un genre de rangeur de pixels ( on prend un pixel et on le lache à côté d'un autre puis on se déplace au hasard)

le problème est que pour ça, j'aimerai un genre de canvas de tkinter mais sans tout le baratin d'objets : après tout je vais juste mettre et enlever des pixels ....

le problème est que j'ai énormément de mal à trouver un truc qui semble faire ça simplement.

bon, c'est vrai qu'en utilisant Canvas.create_rectangle et la fonction after, ça marche mais c'est lent : plus de 5 min pour afficher 64000 "pixels" ... :D

donc si quelqu'un a une solution ...

Lien à poster

Carambar> à rien.

quand je programme, ça ne sert absolument à rien, sinon je cours le risque de creer un programme populaire et je programme comme un pied.

UniKorn> :/

toi aussi ? le truc, c'est de ne pas chercher à comprendre, apres, il y a comme une sous couche de logique ...

randomize timer:cls
maxx=640
maxy=480
dot=10000
dim tabl(maxx+1,maxy+1)
dim term(10,3)
dim coul(10)
coul(0)=&hFF0000
coul(1)=&h00FF00
coul(2)=&h0000FF
coul(3)=&hFFFF00
coul(4)=&hFF00FF
coul(5)=&h00FFFF
coul(6)=&hAA00FF
coul(7)=&hFF00AA
coul(8)=&hFFAA00
coul(9)=&h00FFAA
'main init

for x=0 to dot
   a=int(rnd*maxx)
   b=int(rnd*maxy)
   tabl(a,=1
   pset a,b,0
next
for a=0 to 9
   term(a,0)=int(rnd*maxx)
   term(a,1)=int(rnd*maxy)
   term(a,3)=0
next
'main 
randomize timer
while 1
   for index=0 to 9
       termite index
    next
randomize timer
wend
end
'sub
sub termite(number)
   tx=term(number,0)
   ty=term(number,1)
   tc=term(number,2)
   cc=0
   for a=-1 to 1
       for b=-1 to 1
           cx=(tx+a)
           cy=(ty+
           if cx>=0 and cy>=0 and cx<=maxx and cy=1 and tabl(tx,ty)=0 then
       tabl(tx,ty)=1
       tc=0
       pset tx,ty,-coul(number)
   endif 
   dirx=1-int(rnd*2)
   diry=1-int(rnd*2)
   tx=tx+dirx
   ty=ty+diry
   if tx<0 then tx=maxx
   if ty<0>maxx then tx=0
   if ty>maxy then ty=0 
   if tabl(tx,ty)=1 and tc=0 then
       tc=1
       tabl(tx,ty)=0
       pset tx,ty,-&hFFFFFF
   endif      
   term(number,0)=tx
   term(number,1)=ty
   term(number,2)=tc
   locate number+1,100 : color -coul(number): print "term: ",number," X: ",tx," Y: ",ty, :if tc=1 then print "Carry" else print "     "
end

c'est moche, hein ?

Lien à poster

import pygame
from pygame.locals import *
from random import randrange
dirs=[[-1,-1],[0,-1],[+1,-1],[-1,0],[+1,0],[-1,+1],[0,+1],[+1,+1]]
dots=10000
swidth=640
sheight=480
numterm=24
#init "screen"
pygame.init()
display1=pygame.display.set_mode((swidth,sheight))
scre=[]
for i in range(swidth+1):
scre.append([])
for e in range(sheight+1):
	scre[i].append(0)


term=[]

#check if movement is valid
def check(min,coord,max):
tc=coord
if coordmax:
	tc=min
return tc
#check if there is stuff around those coords
def check_around(x,y):
tt,tx,ty=0,0,0
for index in range(7):
	nx=x+dirs[index][0]
	ny=y+dirs[index][1]
	tx=check(0,nx,swidth)
	ty=check(0,ny,sheight)
	if nx==tx and ny==ty:
		tt+=scre[tx][ty]
if tt>0:
	return 1
else:	
	return 0
# init termites "memory"
for i in range(numterm):
term.append([])
term[i].append(randrange(swidth))
term[i].append(randrange(sheight))
term[i].append(0)

#define termite actions

def termite(arg):
x=arg[0]
y=arg[1]
c=arg[2]
# pickup something ?
if c==0 and scre[x][y]>0:
	c=1
	scre[x][y]=0
#move 
e=randrange(8)
nx=x+dirs[e][0]
ny=y+dirs[e][1]
x=check(0,nx,swidth)
y=check(0,ny,sheight)
# drop something ?
if c>0 and scre[x][y]==0 and check_around(x,y):
	scre[x][y]=1
	c=0
#move 
e=randrange(8)
nx=x+dirs[e][0]
ny=y+dirs[e][1]
x=check(0,nx,swidth)
y=check(0,ny,sheight)
return [x,y,c]



# init game
def init():

for index in range(dots):
	a=randrange(640)
	b=randrange(480)
	scre[a][b]=1
print "done init"
#show screen
def shows():
for a in range(swidth):
	for b in range(sheight):
		tt=scre[a][b]
		if tt==0:
			display1.set_at((a,,(0,0,0))
		else:	
			display1.set_at((a,,(255,255,255))

pygame.display.flip()

#main screen turn on
init()
shows()
quitt=0
while quitt==0:
for event in pygame.event.get():
   		if event.type == QUIT:
		quitt=1
	if event.type == MOUSEBUTTONDOWN:
		print term
for a in range(2000):
	for index in range(numterm):
		term[index]=termite(term[index])
shows()

bon, j'ai pas fini le debuggage ( je ferais ça à tête reposée) mais ça a l'air de marcher ...

et c'est vachement plus rapide du coup :/

Lien à poster

import pygame
from pygame.locals import *
from random import randrange
dirs=[[-1,-1],[0,-1],[+1,-1],[-1,0],[+1,0],[-1,+1],[0,+1],[+1,+1]]
dots=10000
swidth=640
sheight=480
numterm=24
colors=[]

for index in range(numterm+1):
colors.append([])
colors[index].append(randrange(255))
colors[index].append(randrange(255))
colors[index].append(randrange(255))
colors[0]=[255,255,255]
print colors
#init "screen"
pygame.init()
display1=pygame.display.set_mode((swidth,sheight))
scre=[]
for i in range(swidth+1):
scre.append([])
for e in range(sheight+1):
	scre[i].append(0)


term=[]

#check if movement is valid
def check(min,coord,max):
tc=coord
if coordmax:
	tc=min
return tc
#check if there is stuff around those coords
def check_around(x,y):
tt,tx,ty=0,0,0
for index in range(7):
	nx=x+dirs[index][0]
	ny=y+dirs[index][1]
	tx=check(0,nx,swidth)
	ty=check(0,ny,sheight)
	if nx==tx and ny==ty:
		tt+=scre[tx][ty]
if tt>0:
	return 1
else:	
	return 0
# init termites "memory"
for i in range(numterm):
term.append([])
term[i].append(randrange(swidth))
term[i].append(randrange(sheight))
term[i].append(0)

#define termite actions

def termite(arg,col):
x=arg[0]
y=arg[1]
c=arg[2]
# pickup something ?
if c==0 and scre[x][y]>0:
	c=1
	scre[x][y]=0
#move 
e=randrange(8)
nx=x+dirs[e][0]
ny=y+dirs[e][1]
x=check(0,nx,swidth)
y=check(0,ny,sheight)
# drop something ?
if c>0 and scre[x][y]==0 and check_around(x,y):
	scre[x][y]=col
	c=0
#move 
e=randrange(8)
nx=x+dirs[e][0]
ny=y+dirs[e][1]
x=check(0,nx,swidth)
y=check(0,ny,sheight)

return [x,y,c]




# init game
def init():

for index in range(dots):
	a=randrange(640)
	b=randrange(480)
	scre[a][b]=1
print "done init"
#show screen
def shows():
for a in range(swidth):
	for b in range(sheight):
		tt=scre[a][b]
		if tt==0:
			display1.set_at((a,,(0,0,0))
		else:	
			display1.set_at((a,,colors[tt-1])
pygame.display.flip()

#main screen turn on
init()
shows()
quitt=0
while quitt==0:
for event in pygame.event.get():
   		if event.type == QUIT:
		quitt=1
	if event.type == MOUSEBUTTONDOWN:
		print "X is the key"
for a in range(2000):
	for index in range(numterm):
		term[index]=termite(term[index],index+1)
shows()

version finale en couleur qui semble marcher suffisamment bien ...

comme ça, si ça interesse quelqu'un à part moi, il pourra essayer ce truc inutile.

Lien à poster

donc une explication :

ce truc est composé d'agents des "termites" dont les role est de déplacer des pixels selon des règles simples :

- si elle se trouve sur un pixel et qu'elle n'en transporte pas, elle le prend

- elle se déplace au hasard

- si elle transporte un pixel et qu'elle se trouve à la proximité d'un autre, elle le pose et se barre.

ces règles simples font que l'ensemble des agents bossent à regrouper ces pixels et j'ai juste ajouté un code couleur en fonction de quel agent l'a posé.

Lien à poster

TeKa> pas difficile : je codes toujours plus propre en python ...

thev> merci, mais il me faudrai modifier le programme et 3-4 heures pour qu'il me sorte ça de maniere correcte ...

( pas compliqué mais la flemme : en gros je sort chaque image sur le disque )

Lien à poster

boh, c'est plutôt simple ... ( si c'était compliqué, je n'y arriverais pas :/ )

à la base, ce genre de programme est une démonstration de la complexité pouvant emerger de la simplicité, d'où la ressemblance ( de loin ) avec le Conway's game of life ou les fourmis de langton ...

Lien à poster
×
×
  • Créer...