Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # -*- coding:Utf-8 -*-
- import pygame
- import random
- ###############################################################################
- class Life ():
- """The process"""
- #--------------------------------------
- def __init__ (self, screen, size=(800,600), perfection=19, maxval=8, atomsum=85):
- """Initializes the process with the screen size, perfect number value, maximum value, and atom range"""
- self.screen = screen
- self.size = self.w, self.h = size
- self.perfection = perfection
- self.maxval = maxval
- self.atomsum = atomsum
- self.atomlist = []
- self.axis0 = self.h / 2 - (self.maxval * 2 + self.solution(self.maxval, self.maxval)) / 2
- self.axis1 = self.axis0 + self.maxval
- self.axis2 = self.axis1 + self.maxval
- self.axis3 = self.axis2 + self.solution(self.maxval, self.maxval)
- self.xshft = 0
- self.pagenum = 1
- self.refresh = True
- #--------------------------------------
- def solution (self, x, y):
- """The verification formula to finish process"""
- return (x + y) + (x * y)
- #--------------------------------------
- def run (self):
- """Process' main routine"""
- # fill the atom list (id sorted)
- for i in range(self.atomsum):
- a = Atom(i,random.randint(0, self.maxval))
- self.atomlist.append(a)
- # atom dict (id -> val)
- d = {}
- for a in self.atomlist:
- d[a] = a.getval()
- # atom values dict (val -> id)
- d1 = {}
- for a in d.items():
- if a[1] not in d1:
- x = [a[0]]
- else:
- x = d1[a[1]]
- x.append(a[0])
- d1[a[1]] = x
- # sorted atom list (value sorted)
- j = 0
- del self.atomlist[:]
- for k, v in d1.items():
- for i in v:
- self.atomlist.insert(j, i)
- j +=1
- # here start the main process
- x = 0
- values = [0,0,0]
- done = False
- while done is False:
- choosen = random.choice(self.atomlist)
- values[0]=choosen.getval()
- for a in self.atomlist:
- # here is the main code
- compat = a.love(choosen)
- values[1]=a.getval()
- values[2]=compat
- print "(%s)%s op (%s)%s =%s" %\
- (a.getid(), a.getval(),\
- choosen.getid(), choosen.getval(),\
- compat)
- # check succed
- if compat is self.perfection:
- self.printval(x, values, 0xFF0000)
- # finished the job
- print "Finish !"
- while pygame.event.wait().type is not pygame.QUIT:
- done = True
- break
- # else...
- elif compat is False:
- self.printval(x, values, 0x009900)
- else:
- self.printval(x, values, 0xFFFFFF)
- x += 1
- print "Merci !"
- return True
- #--------------------------------------
- def printval (self, x, values, color):
- """Display all lines and dots on the screen"""
- if x / self.w is self.pagenum:
- self.pagenum += 1
- self.xshft += self.w
- self.screen.fill(0x000000)
- self.refresh = True
- if self.refresh is True:
- for i in range(self.w):
- self.screen.set_at((i, self.axis0), 0x333333)
- self.screen.set_at((i, self.axis1), 0x333333)
- self.screen.set_at((i, self.axis2), 0x333333)
- self.screen.set_at((i, self.axis3), 0x333333)
- self.refresh = False
- for i in range(0, self.w, 4):
- self.screen.set_at((i, self.axis2+self.perfection), 0x999999)
- self.screen.set_at((x-self.xshft, self.axis0 + values[0]), color)
- self.screen.set_at((x-self.xshft, self.axis1 + values[1]), color)
- self.screen.set_at((x-self.xshft, self.axis2 + values[2]), color)
- if color == 0xFF0000:
- for i in range(0, self.w, 4):
- self.screen.set_at((i, self.axis0 + values[0]), 0x666666)
- self.screen.set_at((i, self.axis1 + values[1]), 0x666666)
- pygame.display.flip()
- ###############################################################################
- class Atom (Life):
- """A single atom"""
- #--------------------------------------
- def __init__ (self, id, val):
- """Initializes an atom with an id and a value"""
- self._id = id
- self._val = val
- self._lovers = []
- #--------------------------------------
- def getid (self):
- """Returns atom id"""
- return self._id
- #--------------------------------------
- def getval (self):
- """Returns atom value"""
- return self._val
- #--------------------------------------
- def taste (self, atom):
- """Check if another atom is known or himself. Returns True if succed"""
- atomid = atom.getid()
- if atomid is self._id:
- return False
- if len(self._lovers) is not 0:
- try:
- self._lovers.index(atomid)
- except:
- return False
- else:
- self._lovers.append(atom.getval())
- return True
- #--------------------------------------
- def love (self, atom):
- """Check another atom and make love with. Returns the love value to be compared with the perfection ;)"""
- if self.taste(atom) is False:
- return False
- else:
- return Life.solution(self, self._val, atom.getval())
- ###############################################################################
- def main ():
- """The main routine"""
- pygame.init()
- size = (1024, 600)
- screen = pygame.display.set_mode(size)
- pygame.display.set_caption("Algo Genetique")
- l = Life(screen,size)
- done = False
- while done is False:
- for event in pygame.event.get():
- if event.type is pygame.QUIT:
- done = True
- if l.run() is True:
- done = True
- if __name__ == "__main__": main()
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement