//************************************************* // WORLD FUNCTION wf2() // // AUTHOR: G.Doeben-Henisch // First: 25.Nov.2013 // Last: 11.Dez.2013 //************************************************* // // IDEA // // The world function as part of the WORLD computes all // necessary changes in a world within one WORLD CYCLE. // // wf: W ---> W // // The wf() manages possible changes according to the actual GRID, the content // of the WIB and according to some world laws. // // wf1 = newPOS o newACT o newSOUND // // The change of the images happens associated with the newMOVE or nmove operations // // - 'F' can 'disappear' by changing into '.' // - '.' can change to 'F' by 'growing' // - '*i' can change the 'positon' by a 'move' // // LAWS // // - Only one object at a position at one time. This means, if a system will move to a position (X,Y) // and at this position is already an object 'O', 'F' or '*j', then this move is not possible. // It will result in a 'collision message'. // // - If more than one system plans to move at a point of time t, then the order of moves will be 'random' // //********************************************************** // wf1-HELPER FUNCTIONS // // insertPOP() := at start time this will place the systems from POP into the GRIDSPC once // // newPOS() := takes the move-command from WIB and computes a new position (as well as // the non-move actions in random test cases) // // newPOSPOS() := checks randomly whether the new position is possible; if yes then this will be realized // (as well as the non-move actions in random test cases) // // newSOUND() := realizes a SAY and a coded SOUND. // //*************************************************************** // insertPOP() // // Takes the list POP and inserts these // systems into the GRIDSPC // Comment: // Additional possible images will only be shown either via the ainp()-Function // or by a special VIEWER-Client (which is not yet part of this software project) function [GRIDSPC]=insertPOP(GRIDSPC,POP) [r,c]=size(POP) for i=1:r //for every element of the list Y=eval(POP(i,3)) X=eval(POP(i,4)) GRIDSPC(Y,X)=POP(i,2) end endfunction //************************************************* // newPOS() // // Having the OLD position from POP and the intended movement as DIR from WIB // the function computes the NEW Pos // // XO, YO := old X-Y-Position // DIR := direction of move // XN, XN := new X-Y-Position // // The results will be stored in POP as NEWPOS // // ATTENTION : scilab counts Y from 'top = north' downwards to 'down = south' // Thus to move to the 'north' with '01' you have to subtract '1' // The same with a move from 'right = east' to the 'left = west' // function [POP] =newPOS(POP, WIB) [r,c]=size(POP) //assumes that POP and WIB have the same systems //in the same order ! for i=1:r //Get new move DIR=bin2dec(WIB(i,2)) //Get old position YO = eval(POP(i,3)) XO =eval(POP(i,4)) //Compute coordinates for possible new position if DIR == 0 then XN=XO, YN=YO // no move elseif DIR == 1 then YN=YO-1, XN=XO elseif DIR==2 then YN=YO-1, XN=XO+1 elseif DIR==3 then YN=YO, XN=XO+1 elseif DIR==4 then YN=YO+1, XN=XO+1 elseif DIR==5 then YN=YO+1, XN=XO elseif DIR==6 then YN=YO+1, XN=XO-1 elseif DIR==7 then YN=YO, XN=XO-1 elseif DIR==8 then YN=YO-1, XN=XO-1 else printf("mover:ERROR WITH MOVEMENT AT = (YO,XO) = ( %d,%d)\n",YO,XO) end// End of one element of POP list //Write possible new position POP(i,5)=sci2exp(YN) POP(i,6)=sci2exp(XN) end endfunction //**************************************** // findFOOD() // // This function checks for a random system whether there is some food around // If yes this food is consumed // It checks in clockwise order all positions // But does only one uptake out of all // // i := index of system in POP // YO, XO := actual position // POP := list of systems in the world // GRIDSPC := actual grid space of the world function [POP]=updateENERGY(i,YO,XO,POP,GRIDSPC,SHOW) if SHOW==2 then printf('updateEnergy: POSITION (Y,X) = %d %d\n',YO,XO), end //Compute coordinates for possible new position with food // Proceeds in clockwise order for DIR=1:8 if DIR == 1 then YN=YO-1, XN=XO, if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==2 then YN=YO-1, XN=XO+1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==3 then YN=YO, XN=XO+1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==4 then YN=YO+1, XN=XO+1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==5 then YN=YO+1, XN=XO if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==6 then YN=YO+1, XN=XO-1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==7 then YN=YO, XN=XO-1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end elseif DIR==8 then YN=YO-1, XN=XO-1 if isequal(GRIDSPC(YN,XN),'F') then POP(i,8)='100',end end// End of one element of POP list end// End of search if SHOW==2 then NEWENERGY=eval(POP(i,8)), printf('updateEnergy: NEWENERGY = %d\n',NEWENERGY), end endfunction //************************************************* // newPOSPOS() // // Having the OLD position from POP and the intended NEW position // // Proceed in random order // // If system intends 'eat'-action check for food // // If system intends a move one has to check // whether the new position is free, then move system to new position // otherwise do nothing function [POP,GRIDSPC] =newPOSPOS(POP,GRIDSPC,SHOW) [r,c]=size(POP) //assumes that POP and WIB have the same systems //in the same order ! if SHOW==1 then disp('BEFORE FLAGS TO ZERO'), end for i=1:r, POP(i,7)='0', end //Set flag to zero while (sum(eval(POP(:,7))) < r), //as long as not all systems have been processed if SHOW==1 then disp('BEFORE SYSRND'), disp(GRIDSPC),end //Select randomly a system [SYSRND]=ceil((r)*rand()) if SHOW==1 then printf('SYSRND = %d ',SYSRND), end if (POP(SYSRND,7) == '0') then POP(SYSRND,7)='1', //if not yet processed if SHOW==1 then disp('BEFORE YN,XN'), end YN=eval(POP(SYSRND,5)), XN=eval(POP(SYSRND,6)), YO=eval(POP(SYSRND,3)), XO=eval(POP(SYSRND,4)), //Check 'eat'-action //Check food //If food intake has been done set back to '0' in WIB if isequal(WIB(SYSRND,3),'1001') then [POP]=updateENERGY(SYSRND,YO,XO,POP,GRIDSPC,SHOW), end if SHOW==1 then disp('BEFORE isequal'), printf('YN = %d ',YN), printf('XN= %d ',XN),end //Check movement //If free '.' go on //Otherwise no move if isequal(GRIDSPC(YN, XN),'.') then if SHOW==1 then disp('BEFORE DELETE SYSTEM'), printf('YO = %d ',YO), printf('XO= %d ',XO),end GRIDSPC(YO,XO)='.' //Delete old system if SHOW==1 then disp(GRIDSPC), end if SHOW==1 then disp('BEFORE UPDATE OLD YO XO'), end POP(SYSRND,3)=sci2exp(YN) //Update Y-X-coordinates POP(SYSRND,4)=sci2exp(XN) if SHOW==1 then disp('BEFORE NEW PLACEMENT OF SYSTEM'), end GRIDSPC(YN,XN)=POP(SYSRND,2),//Place system at new position end end end endfunction