Bert Here's the pseudocode: Information about object: controller
Sprite: <no sprite> Solid: false Visible: true Depth: 0 Persistent: false Parent: <no parent> Mask: <same as sprite> Create Event: set Alarm 0 to 7 set variable foodnumber to 0 set variable bugnumber to 0 execute code: show_info() set variable depth to -500 set variable writetofile to 0 set variable displayanything to 2 Alarm Event for alarm 0: create instance of object food at position (10+ random(room_width-20),10+ random(room_height-20)) set Alarm 0 to 7 Alarm Event for alarm 1: execute code: //this alarm is set by the f key file_write_string(string(foodnumber) +", " +string(bugnumber)) file_writeln() alarm[1]=50 //save every 50th step to file Keyboard Event for <Escape> Key: execute code: // if info boxes are displayed close them, otherwise quit the simulation numbershowing=0 with(bug) { controller.numbershowing+=showstats showstats=0 depth=1000 } if expression numbershowing=0 is true if displayanything is equal to 2 set variable displayanything to 1 else if the player does say yes to the question: Quit? end the game Other Event: Game End: execute code: file_close() Draw Event: if displayanything is larger than 0 set the font for drawing text to font0 and align left set the drawing color to 16777215 draw rectangle with vertices (0,0) and (displayanything*170-90,displayanything*80-50), filled set the drawing color to 0 draw rectangle with vertices (0,0) and (displayanything*170-90,displayanything*80-50), outline at position (0,0) draw text: " food " +string(foodnumber) at position (0,10) draw text: " bugs " +string(bugnumber) if displayanything is larger than 1 at position (0,20) draw text: p pause at position (0,30) draw text: c de-select all at position (0,40) draw text: a select all at position (0,50) draw text: d display detail, affects speed at position (0,60) draw text: f save population stats to comma separated file at position (0,70) draw text: left click select bug at position (0,80) draw text: F1 help at position (0,90) draw text: esc return to simulation Key Press Event for A-key Key: execute code: // show info boxes for all with(bug) { showstats=1 depth=-1000 } displayanything=2 Key Press Event for C-key Key: execute code: //close all info boxes with(bug) { showstats=0 depth=1000 } Key Press Event for D-key Key: if displayanything is equal to 0 set variable displayanything to 2 else if displayanything is equal to 1 set variable displayanything to 0 else if displayanything is equal to 2 set variable displayanything to 1 Key Press Event for F-key Key: if writetofile is equal to 0 if the player does say yes to the question: Save population stats to smartbug.txt? execute code: alarm[1]=1 writetofile=1 file_open_write("smartbug.txt") file_write_string("foodnumber, bugnumber") file_writeln() room_caption=room_caption +" (statistics are being saved to file)" Key Press Event for P-key Key: execute code: keyboard_wait(); // waits until user presses a key io_clear(); // clears all keyboard and mouse states Information about object: bug Sprite: sprite1 Solid: false Visible: true Depth: 0 Persistent: false Parent: <no parent> Mask: <same as sprite> Create Event: set variable showstats to 0 set variable controller.bugnumber relative to 1 set variable bughealth to 500 execute code: // initialise the input, gene and output arrays for (i=0 ;i<20; i+=1) { input[i]=0 for (j=0;j<12; j+=1) { gene[i,j]= random(100)-50 } } for (j=0;j<12; j+=1) { output[j]= 0 } set variable depth to 1000 Step Event: set variable bughealth relative to -1 if bughealth is smaller than 0 destroy the instance set variable controller.bugnumber relative to -1 execute code: input[0]= sign(instance_position(x+15,y,food)) input[1]= sign(instance_position(x-15,y,food)) input[2]= sign(instance_position(x,y+15,food)) input[3]= sign(instance_position(x,y-15,food)) input[4]= sign(instance_position(x+25,y,food)) input[5]= sign(instance_position(x-25,y,food)) input[6]= sign(instance_position(x,y+25,food)) input[7]= sign(instance_position(x,y-25,food)) for (i=8; i<20; i+=1) { input[i] = sign(output[i-8]) } for (j=0 ;j<12; j+=1) { output[j]=0 for (i=0;i<20; i+=1) { output[j]= output[j] + gene[i,j]* input[i] } } vspeed=0 hspeed=0 if (output[0]>0)hspeed-=1 if (output[1]>0)hspeed+=1 if (output[2]>0)vspeed-=1 if (output[3]>0)vspeed+=1 Collision Event with object food: set variable bughealth relative to 150 for other object: destroy the instance if bughealth is larger than 1000 execute code: bughealth=500 newid=instance_create(x+20,y+20,bug) //copy over the parent genes for (i=0 ;i<20; i+=1) { for (j=0;j<12; j+=1) { newid.gene[i,j]= gene[i,j] } } // mutate one gene newid.gene[random(20),random(12)]=random(100)-50 Mouse Event for Left Button: if showstats is equal to 0 set variable showstats to 1 set variable depth to -1000 set variable controller.displayanything to 2 else set variable showstats to 0 set variable depth to 1000 Other Event: Outside Room: if x is larger than room_width set variable x to 0 if x is smaller than 0 set variable x to room_width if y is larger than room_height set variable y to 0 if y is smaller than 0 set variable y to room_height Draw Event: at relative position (0,0) draw image -1 of sprite sprite1 if controller.displayanything is larger than 0 at relative position (0,10) draw text: "" +string(bughealth) if showstats is not equal to 0 execute code: draw_line(x,y,x+30,y+30) draw_set_color(c_white) draw_rectangle(x+30,y+30,x+420,y+200,false) draw_set_color(c_black) draw_rectangle(x+30,y+30,x+420,y+200,true) displaystring= "input " for (i=0; i<20; i+=1) displaystring=displaystring + string(sign(input[i])) + " " draw_text(x+35,y+30,displaystring) draw_text(x+35,y+40,"gene") for (j=0; j<12; j+=1) { displaystring= "" for (i=0; i<20; i+=1) { displaystring=displaystring + string (round(gene[i,j])) + " " } draw_text(x+35,y+50+10*j,displaystring) } displaystring= "output " for (j=0; j<12; j+=1) displaystring=displaystring + string(sign(output[j])) + " " draw_text(x+35,y+170,displaystring) //draw food sensors, red if food sensed if(instance_position(x+15,y,food)= noone) draw_sprite(sprite2,-1,x+15,y) else draw_sprite(sprite3,-1,x+15,y) if(instance_position(x-15,y,food)= noone) draw_sprite(sprite2,-1,x-15,y) else draw_sprite(sprite3,-1,x-15,y) if(instance_position(x+25,y,food)= noone) draw_sprite(sprite2,-1,x+25,y) else draw_sprite(sprite3,-1,x+25,y) if(instance_position(x-25,y,food)= noone) draw_sprite(sprite2,-1,x-25,y) else draw_sprite(sprite3,-1,x-25,y) if(instance_position(x,y+15,food)= noone) draw_sprite(sprite2,-1,x,y+15) else draw_sprite(sprite3,-1,x,y+15) if(instance_position(x,y-15,food)= noone) draw_sprite(sprite2,-1,x,y-15) else draw_sprite(sprite3,-1,x,y-15) if(instance_position(x,y+25,food)= noone) draw_sprite(sprite2,-1,x,y+25) else draw_sprite(sprite3,-1,x,y+25) if(instance_position(x,y-25,food)= noone) draw_sprite(sprite2,-1,x,y-25) else draw_sprite(sprite3,-1,x,y-25) Information about object: food Sprite: sprite0 Solid: false Visible: true Depth: 0 Persistent: false Parent: <no parent> Mask: <same as sprite> Create Event: set variable controller.foodnumber relative to 1 set variable depth to 1000 Destroy Event: set variable controller.foodnumber relative to -1 _______________________________________________ IAEP -- It's An Education Project (not a laptop project!) IAEP@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/iaep