Is anyone Willing and able to help me out here a little bit. I got my code I am converting over from DBPro to C++ Using DarkGDK but my C++ is rusty to say the least being about 15 years or so since I have used it and even then the last time I had used it was TURBO C++ so my windows programming is almost non-existant. I know the basics but DarkGDK makes alot of that easier since I don't have to deal with Window Management and Device Context.
However I am coming up with a few issues when attempting to convert it. The program runs... But its off. First of all I am not passing my values correctly I don't think because my int _MAKE_CREATURES() function is producing totally random results that I do not understand.
int _MAKE_CREATURE(int X ,int Y ,int HEALTH, int ANGLE ,bool SEX,int SPEED,DWORD COLOR){
NUM_CREATURES++;
int count = 1;
while(CREATURES[count].EXIST){count++;}
CREATURES[count].X = X;
CREATURES[count].Y = Y;
CREATURES[count].HEALTH = HEALTH;
CREATURES[count].ANGLE = ANGLE;
CREATURES[count].COLOR = COLOR;
CREATURES[count].EXIST = TRUE;
CREATURES[count].SEX = SEX;
CREATURES[count].SPEED = SPEED;
CREATURES[count].AGE = 1;
return count;
}
On top of that the value EXIST in my Struct on every single element keeps getting set to TRUE and I don't really know why. That is causing me serious issues. Its odd because non of the other Values are getting changed. I initialize Half of the Array from the start but when I attempt to add more to it this function above does not work. I am assuming its a glaring error on my part.
I am calling it from my _BREED() function like this
int X = _WRAPX(CREATURES[creature1].X + (rand()%3) - 1);
int Y = _WRAPY(CREATURES[creature1].Y + (rand()%3) - 1);
int COUNT = _MAKE_CREATURE(X,Y, 1000, ANGLE,(rand() % 2),SPEED,COLOR);
My other functions, on the surface anyway seem to be passing the correct values so what am I doing wrong here and how does EXIST always go to TRUE... Is it because of my testing method
int count = 1;
while(CREATURES[count].EXIST){count++;}
I do this to find a free ID in my ARRAY because I am going to be adding and Deleting elements rather fast. I KNOW there is faster and better ways to do this in C++ that I will find in time but Im currently just trying convert this over word for word at the moment yet any suggestions would be awesome.
Also.... I do not know how to print using Dark GDK. COUT<< does not show up nor does PrintF... only the dbPrint() command does but I keep getting issues trying to do so telling me no override function for this. I mainly just want to know of a way to use Printf or Cout normally.
Hmmm What else....
Oh.... there seems to be no dbLockPixel command so I wonder if LockBits can do the same and if so how?
I know down the line I should Convert all my creatures over to a class object with there own methods for handling all this data but I am not at that point yet. I just want to get this working. It currently Starts but they end up dying on me and are not moving around yet. Im sure I will have them doing that by the end of tonight though.
PLEASE Everyone I need help getting back on this horse, I seem to be seriously messing up on data handling here but am just not 100% sure how. I know I use to pass variable as pointers in functions but really dunno what I am doing anymore.
Thanks for Anything, I am all ears, take a minute to glance over my source and any comments will be helpful I am sure.
Full DBPro Source Code
SYNC ON:GLOBAL SCREENX = 1024: GLOBAL SCREENY =800:SET DISPLAY MODE SCREENX,SCREENY,32
Rem Project: ALife
Rem Created: Monday, November 20, 2017
Rem ***** Main Source File *****
COLOR BACKDROP RGB(255,255,255)
SET WINDOW POSITION 0,0
Global hit
#constant MAX_AGE 100
#constant MAX_HEALTH 1
#constant MAX_CREATURES 1000
#constant WORLD_WIDTH SCREENX
#constant WORLD_HEIGHT SCREENY
#constant LEFT_BOUNDS 0
#constant TOP_BOUNDS 0
#constant MALE 0
#constant FEMALE 1
#constant _PI 3.14159
#constant NUM_NEURONS 2
#constant NUM_RESPONSES 4
#constant NORTHING 0
#constant ENEMY 1
#constant MATE 2
#constant MUTATION_RATE (RND(100)-50)
#constant TRUE 1
#constant FALSE 0
GLOBAL DEBUG = 1
GLOBAL WRAPX
GLOBAL WRAPY
Wrapx =LEFT_BOUNDS + (WORLD_WIDTH)
Wrapy =LEFT_BOUNDS + (WORLD_HEIGHT)
TYPE LIFE
X AS float
Y AS float
HEALTH AS INTEGER
ANGLE AS float
COLOR AS INTEGER
HANDLE AS INTEGER
AGE AS INTEGER
LAST_BREED as integer
EXIST as integer
SEX AS INTEGER
SPEED AS INTEGER
ENDTYPE
GLOBAL FPS
GLOBAL NUM_CREATURES
GLOBAL HANDLES
GLOBAL DEATHS
GLOBAL BIRTHS
GLOBAL MAIN_LOOP_SPEED
GLOBAL NUM_OF_COLLISIONS
GLOBAL CAMERA_X
GLOBAL CAMERA_Y
DIM BRAINS(MAX_CREATURES,NUM_NEURONS,NUM_RESPONSES)
//STRUCT{MAXCREATURES->BRAINSEES->ACTION}
//BRAINSEES-NOTHING-
// ENEMY-
// MATE-NOTHING
// -LEFT
// -RIGHT
// -FORWARD
// -BACKWARDS
DIM WORLD(SCREENX+1,SCREENY+1) AS INTEGER
DIM SEE_WORLD(SCREENX+1 * SCREENY+1) AS INTEGER
DIM CREATURES(MAX_CREATURES+1) AS LIFE
DIM COLLISIONS(8)
DIM _COS(360) AS FLOAT
DIM _SIN(360) AS FLOAT
//=========INITIALIZE STARTING CREATURES
FOR ANGLE# = 0 TO 360 STEP 1.0
ANGLE = ANGLE#
_COS(ANGLE) = COS(ANGLE#)
_SIN(ANGLE) = SIN(ANGLE#)
NEXT ANGLE#
for X= 0 to screenx
for Y = 0 to screeny
WORLD(X,Y) = 0
next
next
FOR COUNT = 0 TO MAX_CREATURES / 2
CREATURES(COUNT).X =(rnd(WORLD_WIDTH))
CREATURES(COUNT).Y =(rnd(WORLD_HEIGHT))
CREATURES(COUNT).COLOR = RGB(RND(255),RND(255),RND(255))
CREATURES(COUNT).HANDLE =count
CREATURES(COUNT).age = rnd(Max_age)
CREATURES(COUNT).exist = 1
CREATURES(COUNT).ANGLE = RND(360)
CREATURES(COUNT).SEX = RND(1)
CREATURES(COUNT).HEALTH = RND(MAX_HEALTH)
CREATURES(COUNT).SPEED = RND(5)
INC NUM_CREATURES
DOT CREATURES(COUNT).X, CREATURES(COUNT).Y
FOR SEES_OBJECT = 0 TO NUM_NEURONS
FOR RESPONSE = 0 TO NUM_RESPONSES
BRAINS(COUNT,SEES_OBJECT,RESPONSE) = RND(10000)
NEXT
NEXT
NEXT
//=====================================================================================================================
// MAIN GAME LOOP
// DATE: 11/22/17
// DEPENDANCIES: NONE
//=====================================================================================================================
WHILE KEYSTATE(1) = 0
MAIN_LOOP_SPEED = PERFTIMER()
SPEED2 = HITIMER()
INC DAYS
_MOVE_CREATURES()
//=======================DISPLAY DEBGUG INFO======================
SET CURSOR 0,0
PRINT "FPS: ";SCREEN FPS();" ";"SPEED: ";PERFTIMER() - MAIN_LOOP_SPEED;"m/s"; " DAYS(cycles): ";days
PRINT HITIMER() - SPEED2
PRINT "NUMBER OF CREATURES: "; NUM_CREATURES
PRINT "DEATHS: ";DEATHS;" BIRTHS: ";BIRTHS
print
PRINT
PRINT "____________________"
PRINT "X:";INT(CREATURES(1).X );" Y:";INT(CREATURES(1).Y); " ANGLE:"; CREATURES(1).ANGLE
PRINT CREATURES(1).age
PRINT CREATURES(1).HEALTH
PRINT NUM_OF_COLLISIONS
PRINT "___ODDS of CREATURE PERFORMING ACTION ____"
print "0: ";
PRINT BRAINS(1,0,1);" ";
PRINT BRAINS(1,0,2);" ";
PRINT BRAINS(1,0,3);" ";
PRINT BRAINS(1,0,4)
print "1: ";
PRINT BRAINS(1,1,1);" ";
PRINT BRAINS(1,1,2);" ";
PRINT BRAINS(1,1,3);" ";
PRINT BRAINS(1,1,4)
print "2: ";
PRINT BRAINS(1,2,1);" ";
PRINT BRAINS(1,2,2);" ";
PRINT BRAINS(1,2,3);" ";
PRINT BRAINS(1,2,4)
PRINT _SIGHT(1,10)
print "_________________________________"
print "X:"; Mousex();" y:";MouseY()
print world(Mousex(),Mousey()) - 1
IF UPKEY() = 1 THEN INC FPS;SYNC RATE FPS:print "FPS:";fsp
IF DOWNKEY() = 1 THEN DEC FPS;SYNC RATE FPS:print "FPS:";fsp
//========================================================
SYNC
CLS
ENDWHILE
END //========== TERMINATE PROGRAM
FUNCTION _MOVE_CREATURES()
LOCK PIXELS
FOR COUNT = 0 TO MAX_CREATURES
NUM_OF_COLLISIONS=0
IF CREATURES(COUNT).exist = 1
INC CREATURES(COUNT).AGE
INC CREATURES(COUNT).LAST_BREED
OLDX# = CREATURES(COUNT).X:OLDY# = CREATURES(COUNT).Y
X# = CREATURES(COUNT).X: Y# = CREATURES(COUNT).Y
WORLD(INT(X#),INT(Y#)) = 0
//-----------Check Bounds and Wrap Creatures----------------------------------------------------------------
// WORLD(X,Y) = 0
SEES = _SIGHT(COUNT, 10)
IF SEES <> 0
IF CREATURES(SEES).SEX = CREATURES(COUNT).SEX
_SIGHT_HANDLER(COUNT,ENEMY)
ENDIF
IF CREATURES(SEES).SEX <> CREATURES(COUNT).SEX
_SIGHT_HANDLER(COUNT,MATE)
ENDIF
ENDIF
IF SEES = 0 THEN _SIGHT_HANDLER(COUNT,0)
//================= CHECK COLLISIONS =============================================================================
HIT = _OBJECT_HIT(COUNT)
WORLD(INT(X#),INT(Y#)) = 0
IF HIT <> 0
//================= BREED ===================================================================================
IF CREATURES(HIT).SEX <> CREATURES(COUNT).SEX
IF CREATURES(COUNT).LAST_BREED > 1 THEN CREATURES(COUNT).LAST_BREED = 0: _BREED(COUNT,HIT)
ENDIF
//================= FIGHT ==================================================================================
IF CREATURES(HIT).SEX = CREATURES(COUNT).SEX
DEC CREATURES(COUNT).HEALTH,500
ENDIF
CREATURES(COUNT).X = OLDX#: CREATURES(COUNT).Y = OLDY#
WORLD(INT(OLDX#) ,INT(OLDY#)) = COUNT
if NUM_OF_COLLISIONS > 7 THEN _KILL_CREATURE(COUNT)
ENDIF
X# = CREATURES(COUNT).X: Y# = CREATURES(COUNT).Y
IF HIT = 0 THEN WORLD(INT(X#),INT(Y#)) = COUNT//:WORLD(INT(OLDX#),INT(OLDY#)) = COUNT
//================= DEATH =====================================================================================
IF CREATURES(COUNT).AGE > MAX_AGE THEN DEC CREATURES(COUNT).HEALTH,10
IF CREATURES(COUNT).HEALTH < 0
_KILL_CREATURE(COUNT)
ENDIF
//----------------- Draw Creature----------------------------------------------------------------------------
IF CREATURES(COUNT).EXIST <> 0
DOT CREATURES(COUNT).X,CREATURES(COUNT).Y, CREATURES(COUNT).color
//CIRCLE CREATURES(COUNT).X,CREATURES(COUNT).Y,5
ENDIF
ENDIF//<-- IF CREATURE EXIST CHECK
// _SET_PLAYER_POSITION(COUNT)
NEXT //<--MAIN CREATURE LOOP
//_DRAW_SCALED(0,0,SCREENX,SCREENY)
// FOR Y = 0 TO SCREENY
// FOR X = 0 TO SCREENX
// IF WORLD(X,Y) > 0 THEN DOT X,Y,RGB(0,255,0) /// ONLY TO TEST THE WORLD BUFFER IS CLEARING AND MOVING CORRECTLY
// NEXT
// NEXT
UNLOCK PIXELS
ENDFUNCTION
function _MOVE_OBJECT(OBJ AS INTEGER,SPEED AS float )
angle# = CREATURES(OBJ).ANGLE
newx# = _WRAPX#(CREATURES(OBJ).X + SPEED * COS(angle#))
newy# = _WRAPY#(CREATURES(OBJ).y + SPEED * SIN(ANGLE#))
if WORLD(int(newx#),int(NEWY#)) = 0
CREATURES(OBJ).X = newx#
CREATURES(OBJ).Y = newY#
ENDIF
endfunction
FUNCTION _BREED(creature1,creature2)
if NUM_CREATURES => MAX_CREATURES then exitfunction
inc BIRTHS
X = _WRAPX#(CREATURES(creature1).X + RND(2) - 1)
Y = _WRAPY#(CREATURES(creature1).Y + RND(2) - 1)
ANGLE = RND(355)
SPEED = RND(5)
COLOR = CREATURES(creature1).color + (rnd(1000) - 500)
CREATURES(count).HEALTH = 1000
COUNT = _MAKE_CREATURE(X,Y,HEALTH, ANGLE,RND(1),SPEED,COLOR)
// X = CREATURES(COUNT).X
// Y = CREATURES(COUNT).Y
//
FOR SEES_OBJECT = 0 TO NUM_NEURONS
FOR RESPONSE = 0 TO NUM_RESPONSES
BRAINS(COUNT,SEES_OBJECT,RESPONSE) = BRAINS(CREATURE1,SEES_OBJECT,RESPONSE) + MUTATION_RATE
NEXT
NEXT
ENDFUNCTION
function _MAKE_CREATURE(X ,Y ,HEALTH, ANGLE ,SEX,SPEED,COLOR)
INC NUM_CREATURES
count = 1
while CREATURES(count).EXIST = 1
INC COUNT
endwhile
CREATURES(count).X = X
CREATURES(count).Y = Y
CREATURES(count).HEALTH = HEALTH
CREATURES(count).ANGLE = ANGLE
CREATURES(count).COLOR = COLOR
CREATURES(count).EXIST = TRUE
CREATURES(count).SEX = SEX
CREATURES(count).SPEED = SPEED
CREATURES(count).AGE = 1
endfunction COUNT
FUNCTION _KILL_CREATURE(OBJ)
CREATURES(OBJ).AGE = 0
CREATURES(OBJ).COLOR = 0
CREATURES(OBJ).HANDLE = 0
CREATURES(OBJ).SEX = 0
CREATURES(OBJ).HEALTH = 0
CREATURES(OBJ).EXIST = 0
world(int(CREATURES(OBJ).x),int(CREATURES(OBJ).y)) = 0
FOR SEES_OBJECT = 0 TO NUM_NEURONS
FOR RESPONSE = 0 TO NUM_RESPONSES
BRAINS(OBJ,SEES_OBJECT,RESPONSE) = 0
NEXT
NEXT
DEC NUM_CREATURES
INC DEATHS
ENDFUNCTION
function _OBJECT_HIT(OBJ AS INTEGER)
RET = 0
X# = CREATURES(OBJ).X
Y# = CREATURES(OBJ).Y
// CHECK = _CHECK_SPACE(X,Y+1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X-1,Y):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X-1,Y+1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X-1,Y-1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X+1,Y):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X+1,Y+1):IF CHECK <> 0 THEN RET = CHECK :INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X+1,Y-1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS:exitfunction RET
// CHECK = _CHECK_SPACE(X,Y-1):IF CHECK <> 0 THEN RET = CHECK :INC NUM_OF_COLLISIONS:exitfunction RET
if DEBUG
DOT X,Y+1,rgb(255,0,0)
DOT X+1,Y+1,rgb(255,0,0)
DOT X+1,Y,rgb(255,0,0)
DOT X+1,Y-1,rgb(255,0,0)
DOT X-1,Y-1,rgb(255,0,0)
DOT X,Y-1,rgb(255,0,0)
DOT X-1,Y+1,rgb(255,0,0)
DOT X-1,Y,rgb(255,0,0)
endif
//
ANGLE# = CREATURES(OBJ).ANGLE - 90.0
DIST# = 1.0
world(int(x#),int(y#))= 0
FOR A# = ANGLE# TO ANGLE# + 180 STEP 40
SKIP:
X1# = X# + DIST# * _COS(INT(WRAPVALUE(A#)))
Y1# = Y# + DIST# * _SIN(INT(WRAPVALUE(A#)))
DOT X1#,Y1#,RGB(255,0,0)
HIT = WORLD(INT(_WRAPX#(X1#)),INT(_WRAPY#(Y1#)))
IF HIT <> 0 and HIT <> OBJ THEN RET = HIT:EXITFUNCTION RET
NEXT
endfunction RET
function _ROTATE_OBJECT(OBJ AS INTEGER,ANGLE AS FLOAT)
CREATURES(OBJ).ANGLE = WRAPVALUE(CREATURES(OBJ).ANGLE + ANGLE)
endfunction
function _SIGHT(OBJ AS INTEGER, SIGHT_DIST AS FLOAT)
X# = CREATURES(OBJ).X: Y# = CREATURES(OBJ).Y
ANGLE = WRAPVALUE(CREATURES(OBJ).ANGLE)
FOV = 30
for A = -FOV TO FOV STEP 10
INC rc_x,1
FOR DIST = 2 TO SIGHT_DIST STEP 1
ANG = INT(WRAPVALUE(ANGLE + A))
XX# = X# + DIST * _COS(ANG)
YY# = Y# + DIST * _SIN(ANG)
if DEBUG THEN
dot XX#,YY#,RGB(0,255,0)
VALUE = WORLD(INT(_WRAPY#(XX#)),INT(_WRAPY#(YY#)))
IF VALUE <> 0 THEN EXITFUNCTION VALUE
NEXT
//LINE RC_X,500 - DIST,RC_X,500 + DIST //CREATURES(VALUE).COLOR
NEXT
ret = 0
endfunction ret
function _SIGHT_HANDLER(OBJ AS INTEGER, SIGHT AS INTEGER)
TURN_SPEED = 15
SELECT SIGHT
CASE 0: // NOTHING
TRIGGER = RND(10000):IF BRAINS(OBJ,0,1) > TRIGGER THEN _ROTATE_OBJECT(OBJ,-TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,0,2) > TRIGGER THEN _ROTATE_OBJECT(OBJ,TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,0,3) > TRIGGER THEN _MOVE_OBJECT(OBJ,1)
TRIGGER = RND(10000):IF BRAINS(OBJ,0,4) > TRIGGER THEN _ROTATE_OBJECT(OBJ,180):_MOVE_OBJECT(OBJ,1)
ENDCASE
CASE 1: // ENEMY
TRIGGER = RND(10000):IF BRAINS(OBJ,1,1) > TRIGGER THEN _ROTATE_OBJECT(OBJ, -TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,1,2) > TRIGGER THEN _ROTATE_OBJECT(OBJ,TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,1,3) > TRIGGER THEN _MOVE_OBJECT(OBJ,1)
TRIGGER = RND(10000):IF BRAINS(OBJ,1,4) > TRIGGER THEN _ROTATE_OBJECT(OBJ,180):_MOVE_OBJECT(OBJ,1)
ENDCASE
CASE 2: // MATE
TRIGGER = RND(10000):IF BRAINS(OBJ,2,1) > TRIGGER THEN _ROTATE_OBJECT(OBJ, -TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,2,2) > TRIGGER THEN _ROTATE_OBJECT(OBJ, TURN_SPEED)
TRIGGER = RND(10000):IF BRAINS(OBJ,2,3) > TRIGGER THEN _MOVE_OBJECT(OBJ,1)
TRIGGER = RND(10000):IF BRAINS(OBJ,2,4) > TRIGGER THEN _ROTATE_OBJECT(OBJ,180):_MOVE_OBJECT(OBJ,1)
ENDCASE
ENDSELECT
endfunction
function _NEWX#(X# as FLOAT, ANGLE# as FLOAT, DIST# as FLOAT)
NX# = X# + DIST# * COS(ANGLE#)
endfunction NX#
function _NEWY#(Y#, ANGLE#, DIST#)
NY# = Y# - DIST * SIN(ANGLE#)
endfunction NY#
function _WRAPX#(VALUE AS float)
IF VALUE < LEFT_BOUNDS THEN VALUE = WRAPX + VALUE
IF VALUE > WORLD_WIDTH THEN VALUE = VALUE - (WORLD_WIDTH)
endfunction VALUE
function _WRAPY#(VALUE AS float)
IF VALUE < TOP_BOUNDS THEN VALUE = WRAPY + VALUE
IF VALUE > WORLD_HEIGHT THEN VALUE = VALUE - (WORLD_HEIGHT)
endfunction VALUE
function _CHECK_SPACE(X AS INTEGER,Y AS INTEGER)
A = WORLD(int(_WRAPX#(X)),INT(_WRAPY#(Y)))
endfunction A
function _SET_PLAYER_POSITION(OBJ)
CREATURES(OBJ).X = _WRAPX#(CREATURES(OBJ).X)
CREATURES(OBJ).Y = _WRAPY#(CREATURES(OBJ).Y)
CREATURES(OBJ).ANGLE = WRAPVALUE(CREATURES(OBJ).ANGLE)
endfunction
function _FLOAT#(VALUE as INTEGER)
LOCAL RET# AS FLOAT
RET# = VALUE
endfunction RET
function _FIND_QUAD(OBJ)
ANGLE = CREATURES(OBJ).ANGLE
IF ANGLE < 360 THEN RET = 8
IF ANGLE < 315 THEN RET = 7
IF ANGLE < 270 THEN RET = 6
IF ANGLE < 225 THEN RET = 5
IF ANGLE < 180 THEN RET = 4
IF ANGLE < 135 THEN RET = 3
IF ANGLE < 90 THEN RET = 2
IF ANGLE < 45 THEN RET = 1
endfunction RET
function _QUADX(OBJ)
FOR COUNT = 1 to 8
NEXT
endfunction
function _QUADY(OBJ)
FOR COUNT = 1 to 8
NEXT
endfunction
function _MOVE_CAMERA()
endfunction
function _DRAW_SCALED(X,Y,NEWX,NEWY)
WSCALEX = NEWX - X // 400
WSCALEY = NEWY - Y // 400
SCALEX = SCREENX / WSCALEX // 2.5
SCALEY = SCREENY / WSCALEY //2.5
Y1 = X
X1 = X
FOR A = 0 TO SCREENY STEP SCALEY
Y1 = Y1 + 1
X1 = X
FOR B = 0 TO SCREENX STEP SCALEX
X1 = X1 + 1
INDEX = WORLD(X1,Y1)
DOT B,A,CREATURES(INDEX).COLOR
NEXT
NEXT
endfunction
//===========================LINE 316 _OBJECT_HIT
// IF WORLD(_WRAPX(X+1),_WRAPY(Y)) <> 0 THEN RET = WORLD(_WRAPX(X+1),_WRAPY(Y))
// IF WORLD(_WRAPX(X+1),_WRAPY(Y+1)) <> 0 THEN RET = WORLD(_WRAPX(X+1),_WRAPY(Y+1))
// IF WORLD(_WRAPX(X+1),_WRAPY(Y-1)) <> 0 THEN RET = WORLD(_WRAPX(X+1),_WRAPY(Y-1))
// IF WORLD(_WRAPX(X),_WRAPY(Y-1)) <> 0 THEN RET = WORLD(_WRAPX(X),_WRAPY(Y-1))
//
// IF WORLD(_WRAPX(X),_WRAPY(Y+1)) <> 0 THEN RET = WORLD(_WRAPX(X),_WRAPY(Y+1))
// IF WORLD(_WRAPX(X-1),_WRAPY(Y)) <> 0 THEN RET = WORLD(_WRAPX(X-1),_WRAPY(Y))
// IF WORLD(_WRAPX(X-1),_WRAPY(Y+1)) <> 0 THEN RET = WORLD(_WRAPX(X-1),_WRAPY(Y+1))
// IF WORLD(_WRAPX(X-1),_WRAPY(Y-1)) <> 0 THEN RET = WORLD(_WRAPX(X-1),_WRAPY(Y-1))
//=======================11/28 LINE 314 COLLISION DETECTION LAST BEFORE SWITCHING TO ANGULAR COLLISION
// CHECK = _CHECK_SPACE(X,Y+1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X-1,Y):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X-1,Y+1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X-1,Y-1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
//
// CHECK = _CHECK_SPACE(X+1,Y):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X+1,Y+1):IF CHECK <> 0 THEN RET = CHECK :INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X+1,Y-1):IF CHECK <> 0 THEN RET = CHECK:INC NUM_OF_COLLISIONS
// CHECK = _CHECK_SPACE(X,Y-1):IF CHECK <> 0 THEN RET = CHECK :INC NUM_OF_COLLISIONS
VC++ Code Using DarkGDK
#include<DarkGDK.h>
#include<iostream>
#define SCREENX 800
#define SCREENY 600
#define MAX_AGE 100
#define MAX_HEALTH 1000
#define MAX_CREATURES 100
#define WORLD_WIDTH SCREENX
#define WORLD_HEIGHT SCREENY
#define LEFT_BOUNDS 0.0f
#define TOP_BOUNDS 0.0f
#define MALE 0
#define FEMALE 1
#define _PI 3.14159
#define NUM_NEURONS 2
#define NUM_RESPONSES 4
#define NORTHING 0
#define ENEMY 1
#define MATE 2
#define MUTATION_RATE (RND(100)-50)
#define TRUE 1
#define FALSE 0
struct LIFE{
float X;
float Y;
int HEALTH;
float ANGLE;
DWORD COLOR;
int AGE;
int LAST_BREED;
bool EXIST;
bool SEX ;
int SPEED;
};
int hit;
bool DEBUG = 1;
int WRAPX;
int WRAPY;
int WX =LEFT_BOUNDS + (WORLD_WIDTH);
int WY =LEFT_BOUNDS + (WORLD_HEIGHT);
int FPS;
int NUM_CREATURES;
int DEATHS;
int BIRTHS;
int MAIN_LOOP_SPEED;
int NUM_OF_COLLISIONS;
int CAMERA_X;
int CAMERA_Y;
int DAYS;
LIFE CREATURES[MAX_CREATURES+1] ={0};
int BRAINS[MAX_CREATURES][NUM_NEURONS][NUM_RESPONSES];
int WORLD[SCREENX+1][SCREENY+1] = {0};
float _COS[360],_SIN[360];
void _MOVE_CREATURES();
void _ROTATE_OBJECT(int OBJ,float ANGLE);
void _SET_PLAYER_POSITION(int OBJ);
void _KILL_CREATURE(int OBJ);
void _SIGHT_HANDLER(int OBJ,int SIGHT);
void _BREED(int creature1,int creature2);
int _SIGHT(int OBJ,float SIGHT_DIST);
int _OBJECT_HIT(int OBJ);
int _CHECK_SPACE(int X,int Y);
int _MAKE_CREATURE(int X ,int Y ,int HEALTH, int ANGLE ,bool SEX,int SPEED,DWORD COLOR);
float _NEWX(float X, float ANGLE,float DIST);
float _NEWY(float Y,float ANGLE,float DIST);
float _WRAPX(float VALUE);
float _WRAPY(float VALUE);
using namespace std;
void DarkGDK()
{
for(int WTF = 0;WTF < MAX_CREATURES;WTF++){CREATURES[WTF].EXIST = 0;}
for(int ANGLE = 0; ANGLE < 360;ANGLE++){
_COS[ANGLE] = cos((float)ANGLE);
_SIN[ANGLE] = sin((float)ANGLE);
}
int ID;
for(int count = 0;count < MAX_CREATURES / 2;count++){
NUM_CREATURES++;
CREATURES[count].X = rand() % WORLD_HEIGHT;
CREATURES[count].Y = rand() % WORLD_WIDTH;
CREATURES[count].HEALTH = rand() % MAX_HEALTH ;
CREATURES[count].ANGLE = rand() % 360;
CREATURES[count].COLOR = dbRgb(rand() % 255,rand() % 255,rand() % 255);
CREATURES[count].EXIST = 1;
CREATURES[count].SEX = rand() % 2;
CREATURES[count].SPEED = rand() % 10;
CREATURES[count].AGE = 1;
for(int SEES_OBJECT = 1;SEES_OBJECT < NUM_NEURONS;SEES_OBJECT++){
for(int RESPONSE = 1;RESPONSE < NUM_RESPONSES;RESPONSE++){
BRAINS[count][SEES_OBJECT][RESPONSE] = rand()%10000;}}
dbDot(CREATURES[count].X,CREATURES[count].Y,CREATURES[count].COLOR);
}
dbSyncOn();
dbSyncRate(60);
dbSetDisplayMode(SCREENX,SCREENY,32);
//=====================================================================================================================
// MAIN GAME LOOP
// DATE: 11/22/17
// DEPENDANCIES: DarkGDK.lib
// DDraw.lib
// DirectX 9.0
//=====================================================================================================================
int MAIN_LOOP_SPEED;
while(LoopGDK()){
dbCLS();
MAIN_LOOP_SPEED = GetTickCount();
//-----------------------------Print Various Debug Information --------------------------------------------------------------
dbSetCursor(0,0);
cout << GetTickCount() - MAIN_LOOP_SPEED << endl;
cout << (NUM_CREATURES) << " DEATHS: " << DEATHS << " Number of Births" << BIRTHS << endl;
cout << BRAINS[1][0][1] << " " << BRAINS[1][0][2] << BRAINS[1][0][3] << " " << BRAINS[1][0][4] << endl;
cout << BRAINS[1][1][1] << " " << BRAINS[1][1][2] << BRAINS[1][1][3] << " " << BRAINS[1][1][4] << endl;
cout << BRAINS[1][2][1] << " " << BRAINS[1][2][2] << BRAINS[1][2][3] << " " << BRAINS[1][2][4] << endl;
cout << " ______________________________________" << endl;
cout << "X:" << dbMouseX() << " Y:" << dbMouseY() << endl;
//----------------------------------------------------------------------------------------------------------------------------
int h= MAIN_LOOP_SPEED - GetTickCount();
dbPrint(dbStr(h));
_MOVE_CREATURES();
dbDot(100,100, dbRGB(255,0,0));
dbSync();
//if (dbEscapeKey()==1){break;} // If program Ends
}
dbPrint("Done");
dbWaitKey();
}
//
//
//
int _MAKE_CREATURE(int X ,int Y ,int HEALTH, int ANGLE ,bool SEX,int SPEED,DWORD COLOR){
NUM_CREATURES++;
int count = 1;
while(CREATURES[count].EXIST){count++;}
CREATURES[count].X = X;
CREATURES[count].Y = Y;
CREATURES[count].HEALTH = HEALTH;
CREATURES[count].ANGLE = ANGLE;
CREATURES[count].COLOR = COLOR;
CREATURES[count].EXIST = TRUE;
CREATURES[count].SEX = SEX;
CREATURES[count].SPEED = SPEED;
CREATURES[count].AGE = 1;
return count;
}
void _MOVE_CREATURES(){
// NEEDED: FIND A DBLOCK PIXEL COMMAND.... C++ LOCKBITS MIGHT WORK
cout << "1" <<endl;
for(int COUNT = 1;COUNT < MAX_CREATURES;COUNT++){
NUM_OF_COLLISIONS = 0;
if(CREATURES[COUNT].EXIST = TRUE){
CREATURES[COUNT].AGE++;
CREATURES[COUNT].LAST_BREED++;
float OLDX = CREATURES[COUNT].X, OLDY = CREATURES[COUNT].Y;
WORLD[int(OLDX)][(int)(OLDY)] = 0;
int SEES = _SIGHT(COUNT,10);
if(SEES != 0){
if(CREATURES[SEES].SEX = CREATURES[COUNT].SEX){
_SIGHT_HANDLER(COUNT,ENEMY);
}
if(CREATURES[SEES].SEX != CREATURES[COUNT].SEX){
_SIGHT_HANDLER(COUNT,MATE);
}
}
if( SEES = 0) _SIGHT_HANDLER(COUNT,0); // OPTIMIZE THIS AS AN ELSE STATMENT ON THE if SEE NOT = TO 0 CHECK
int HIT = _OBJECT_HIT(COUNT);
if(HIT != 0){
//============++++++++++++===== BREED ===================================================================================
if(CREATURES[HIT].SEX != CREATURES[COUNT].SEX && CREATURES[COUNT].LAST_BREED>1){ CREATURES[COUNT].LAST_BREED = 0; _BREED(COUNT,HIT);}
//============================= FIGHT ==================================================================================
if(CREATURES[HIT].SEX = CREATURES[COUNT].SEX) CREATURES[COUNT].HEALTH -= 500;
CREATURES[COUNT].X = OLDX; CREATURES[COUNT].Y = OLDY;
}
if(HIT = 0)WORLD[(int)CREATURES[COUNT].X][(int)CREATURES[COUNT].Y] = COUNT;
// if NUM_OF_COLLISIONS > 7 THEN _KILL_CREATURE(COUNT) // THIS LINE OF CODE IS MORE THEN LIKELY GOING TO KILL OFF ALL CREATURES UNLESS A PROPER DELTA IS FOUND FOR THE COLLISION CHECK
//============================= DEATH =====================================================================================
if(CREATURES[COUNT].AGE > MAX_AGE) {
CREATURES[COUNT].HEALTH -=10;
if(CREATURES[COUNT].HEALTH < 0)_KILL_CREATURE(COUNT);}
if(CREATURES[COUNT].EXIST != 0 )dbDot(CREATURES[COUNT].X,CREATURES[COUNT].Y, CREATURES[COUNT].COLOR);
_SET_PLAYER_POSITION(COUNT);
} //<--- creature exist
}
//UNLOCK PIXELS, NEED TO FIND THE LOCK FUNCTIONS OR SEE IF UNLOCK BITS IS COMPATABLE WITH DARKGDK
return;}
void _MOVE_OBJECT(int OBJ,float SPEED){
float ANGLE = CREATURES[OBJ].ANGLE;
float NEWX = _WRAPX(CREATURES[OBJ].X + SPEED * cos(ANGLE));
float NEWY = _WRAPY(CREATURES[OBJ].Y + SPEED * sin(ANGLE));
if( WORLD[int(NEWX)][int(NEWY) ]= 0){
CREATURES[OBJ].X = NEWX; CREATURES[OBJ].Y = NEWY;
}
}
void _BREED(int creature1,int creature2){
if(NUM_CREATURES >= MAX_CREATURES) return;
BIRTHS++;
int X = _WRAPX(CREATURES[creature1].X + (rand()%3) - 1);
int Y = _WRAPY(CREATURES[creature1].Y + (rand()%3) - 1);
int ANGLE = rand()%360;
int SPEED = rand()%6;
DWORD COLOR = CREATURES[creature1].COLOR + ((rand()% 1000) - 500);
int COUNT = _MAKE_CREATURE(X,Y, 1000, ANGLE,(rand() % 2),SPEED,COLOR);
CREATURES[COUNT].HEALTH = 1000;
for(int SEES_OBJECT = 0;SEES_OBJECT < NUM_NEURONS;SEES_OBJECT++){
for(int RESPONSE = 0;RESPONSE < NUM_RESPONSES;RESPONSE++){
BRAINS[COUNT][SEES_OBJECT][RESPONSE] = rand()%10000 ;}}
}
void _KILL_CREATURE(int OBJ){
CREATURES[OBJ].AGE = 0;
CREATURES[OBJ].COLOR = 0;
CREATURES[OBJ].SEX = 0;
CREATURES[OBJ].HEALTH = 0;
CREATURES[OBJ].EXIST = 0;
WORLD[(int)CREATURES[OBJ].X][(int)CREATURES[OBJ].Y] = 0;
for(int SEES_OBJECT = 0;SEES_OBJECT < NUM_NEURONS;SEES_OBJECT++){
for(int RESPONSE = 0;RESPONSE < NUM_RESPONSES;RESPONSE++){
BRAINS[OBJ][SEES_OBJECT][RESPONSE] = 0;}}
NUM_CREATURES--;
DEATHS++;
return;
}
float NEWX(float X, float ANGLE,float DIST){
float NX = X + DIST * cos(ANGLE) ;
return NX;}
float NEWY(float Y,float ANGLE,float DIST){
float NY = Y - DIST * sin(ANGLE);
return NY;
}
float _WRAPX(float VALUE){
if (VALUE < LEFT_BOUNDS) VALUE = WX + (int)VALUE;
if (VALUE > WORLD_WIDTH) VALUE = VALUE - (WORLD_WIDTH);
return VALUE;}
float _WRAPY(float VALUE){
if (VALUE < TOP_BOUNDS) VALUE = WY + (int)VALUE;
if (VALUE > WORLD_HEIGHT) VALUE = VALUE - (WORLD_HEIGHT);
return VALUE;
}
int _CHECK_SPACE(int X,int Y){
int A = WORLD[(int)_WRAPX(X)][(int)(_WRAPY(Y))];
return A;
}
void _ROTATE_OBJECT(int OBJ,float ANGLE){
CREATURES[OBJ].ANGLE = dbWrapValue(CREATURES[OBJ].ANGLE + ANGLE);
return;}
void _SET_PLAYER_POSITION(int OBJ){
CREATURES[OBJ].X = _WRAPX(CREATURES[OBJ].X);
CREATURES[OBJ].Y = _WRAPY(CREATURES[OBJ].Y);
CREATURES[OBJ].ANGLE = dbWrapValue(CREATURES[OBJ].ANGLE);
return;
}
int _OBJECT_HIT(int OBJ){
int RET = 0;
int HIT;
float X = CREATURES[OBJ].X;
float Y = CREATURES[OBJ].Y;
float NX,NY,A,ANGLE;
float DIST = 1.0;
ANGLE = CREATURES[OBJ].ANGLE - 90.0;
WORLD[(int)X][(int)Y]= 0;
for( A = ANGLE;A < ANGLE + 180;A +=10){ // 10 IS THE THETA FIX THIS
NX = X + DIST * cos(A);
NY = Y + DIST * sin(A);
//dbDot( NX,NY,dbRGB(255,0,0));
HIT = WORLD[(int)_WRAPX(NX)][(int)_WRAPY(NY)];
if(HIT != 0 && HIT != OBJ){RET = HIT;return RET;}
}
return RET;
}
int _SIGHT(int OBJ,float SIGHT_DIST){
float X = CREATURES[OBJ].X;
float Y = CREATURES[OBJ].Y;
float ANGLE = dbWrapValue(CREATURES[OBJ].ANGLE);
float XX,YY;
int FOV = 30;
int VALUE;
int DIST;
int ANG;
for(int A = -FOV; A < FOV; A += 10){
for(DIST = 2; DIST < SIGHT_DIST; DIST++){
ANG = (int)dbWrapValue(ANGLE + A);
XX = X + DIST * _COS[ANG];
YY = Y + DIST * _SIN[ANG];
//dbDot(XX,YY, dbRGB(0,255,0) );
XX = _WRAPX(XX);
YY = _WRAPY(YY);
VALUE = WORLD[(int)XX][(int)YY];
if(VALUE != 0)return VALUE;
}
}
return 0;
}
void _SIGHT_HANDLER(int OBJ,int SIGHT){
int TURN_SPEED = 15;
int TRIGGER;
switch (SIGHT){
case 0: // NOTHING
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][0][1] > TRIGGER) {
_ROTATE_OBJECT(OBJ,-TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][0][2] > TRIGGER) {
_ROTATE_OBJECT(OBJ,TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][0][3] > TRIGGER) {
_MOVE_OBJECT(OBJ,1);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][0][4] > TRIGGER){
_ROTATE_OBJECT(OBJ,180);
_MOVE_OBJECT(OBJ,1);}
break;
case 1: // ENEMY
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][1][1] > TRIGGER) {
_ROTATE_OBJECT(OBJ, -TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][1][2] > TRIGGER) {
_ROTATE_OBJECT(OBJ,TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][1][3] > TRIGGER){
_MOVE_OBJECT(OBJ,1);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][1][4] > TRIGGER) {
_ROTATE_OBJECT(OBJ,180);
_MOVE_OBJECT(OBJ,1);}
break;
case 2: // MATE
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][2][1] > TRIGGER){
_ROTATE_OBJECT(OBJ, -TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][2][2] > TRIGGER) {
_ROTATE_OBJECT(OBJ, TURN_SPEED);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][2][3] > TRIGGER) {
_MOVE_OBJECT(OBJ,1);}
TRIGGER = (rand() % 10001);
if( BRAINS[OBJ][2][4] > TRIGGER){
_ROTATE_OBJECT(OBJ,180);
_MOVE_OBJECT(OBJ,1);}
break;
default:
cout << "Third Object" << endl;
}
return;
}
Sphere sphere = new Sphere(0.5f);
InsanelyRedundantJava insanelyredundantjava = new InsanelyRedundantJava(Redundancy1, Redundancy2);