Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Ta-183

Pages: 1 2 [3] 4 5 ... 7
31
Interesting behaviour bots / Red queen
« on: July 27, 2009, 03:13:43 PM »
So all I do is just run this by itself, no other veggies or other bots? Sounds rather interesting. Also, It's nice to see a bot under development that ISN'T mine. Development of SF2.2, by the way, has pretty much stalled to nothing. I'm thinking of just optimizing 2.1 a bit more and adding in eyebots system. Not as involved or integrated as I would prefer, but I'm interested to see how it performs. I also tacked out a fairly effective anti-virus method yesterday in my spare time. The bot was dismal, but the antivirus worked like a charm.

32
Off Topic / Read on the origin of species
« on: July 24, 2009, 01:46:13 PM »
Quote from: ikke
Holiday season. I had time and saw on the origin of species ant my brother in law's so I read it. It is a nice read. If you like biology, history or evolution, I would reccomend reading it. It is fascinating to realise the thouroughness of the research he did to support his statements. At several points he explicity states If you reject this you reject my theory. 150 years later creationists have not come up with a single additional argument to support their cause, and consistently fail to mention that the rebuttal was already provided by Darwin

And for those of you who thought Darwin invented the theory: it starts with an overview of his predecessors, amongst them his grandfather. At several points he also acnowledged contemporary work in support of the theory.
Interesting, I'll have to have a go at it next time I have a chance. Hell, I read War and Peace in middle school because I had nothing better to do.

33
Off Topic / My first C++ Program
« on: July 23, 2009, 01:53:02 PM »
As a few of you know, I'm taking courses on programming in C++ at the community college while I'm still in high school (with a crazy mother of a discount, $40 a class!) and I've always had a bit of an interest in a certain programming 'sport', if you will, that was played back around a decade ago. Competitive rock paper scissors. Programmers build bots that go against one another for god knows how many rounds and use a sophisticated ranking system to see who wins. Some of the systems that were developed were out of this freaking world, including some incredible behavioral analysis routines that were just about spot on. About six months ago, I had implemented my own version of such a sport in TI-BASIC on my TI-84. I lost said systems to a random RAM reset (and was VERY pissed off). Now, I've finished my first program in C++ that I've built myself from the bottom up, and replicated an early version of my main bot. If any of you guys know your C++, please take a look over my source code. Comments and criticism are welcomed. It doesn't use any funky libraries, so just about any compiler will launch it pretty quickly. If you have no compiler, I've included the executable for those who just wanna dink around with it.

[code]//Rock-Paper-Scissors v1.1.1
//By Ta-183
//Written in C++ in Bloodshed Dev-C++ 4.9.9.2 IDE

#include <iostream>
#include <ctime>
using std::cout;
using std::cin;
using std::endl;
int computerRESP(int, int, int[3][99]);
int computerRARAY(int, int, int[3][99]);
int computerRAND();
int humanPlayer();
int main()
{
    int player1 = 0;
    int player2 = 0;
    int p1mode = 0;
    int p2mode = 0;
    int win = 0;
    int fail = 0;
    int draw = 0;
    int count = 0;
    int exit = 0;
    int mode = 0;
    char displog = ' ';
    int logArray[3][99] = {0};
    int rounds = 0;
    //NOTE; Row 0 is win/loss logging. 1=player 1 win, 2=player 2 win, 3=tie
    //Row 1 Is player 1 logging. Same selection scheme as rest of program.
    //Row 2 is player 2 logging.
    // 1 = Rock, 2 = Paper, 3 = Scissors
    //Vaguely considering switching to a string array. Interger based logging is a holdover from my experience using TI-BASIC.

    const int mintypes = 1;
    const int maxtypes = 4;
    srand(int(time(0)));

    do
    {
        cout << "\nSelect Player 1 control.";
        cout << "\n1. Human Player";
        cout << "\n2. Computer (Random Generator)";
        cout << "\n3. Computer (Counter Bot)";
        cout << "\n4. Computer (ResponderC++)\nPlayer 1: ";
        cin >> p1mode;
        if (p1mode < mintypes || p1mode > maxtypes)
        {
                   cout << "\n\nThe valid choices are " << mintypes << " through " << maxtypes << ".\n\n";
        }
    } while (p1mode < mintypes || p1mode > maxtypes);
      do
    {
        cout << "\nSelect Player 2 control.";
        cout << "\n1. Human Player";
        cout << "\n2. Computer (Random Generator)";
        cout << "\n3. Computer (Counter Bot)";
        cout << "\n4. Computer (ResponderC++)\nPlayer 2: ";
        cin >> p2mode;
        if (p2mode < mintypes || p2mode > maxtypes)
        {
                   cout << "\n\nThe valid choices are " << mintypes << " through " << maxtypes << ".\n\n";
        }
    } while (p2mode < mintypes || p2mode > maxtypes);
    do
    {
        cout << "\n\nEnter number of rounds to be played. (Must be between 1 and 99)\nNumber of rounds: ";
        cin >> rounds;
        if (rounds < 1 || rounds > 99)
        {
                   cout << "\nThe number of rounds must be between 1 and 99.";
        }
    } while (rounds < 1 || rounds > 99);

    for (int count = 0; count <= (rounds - 1); count = count + 1)
    {
        mode = 1;
        switch (p1mode)
        {
               case 1: player1 = humanPlayer();
               break;
               case 2: player1 = computerRAND();
               break;
               case 3: player1 = computerRARAY(mode, count, logArray);
               break;
               case 4: player1 = computerRESP(mode, count, logArray);
               break;
        }

        mode = 2;
        switch (p2mode)
        {
               case 1: player2 = humanPlayer();
               break;
               case 2: player2 = computerRAND();
               break;
               case 3: player2 = computerRARAY(mode, count, logArray);
               break;
               case 4: player2 = computerRESP(mode, count, logArray);
               break;
        }      
            if ((player1 == 1 && player2 ==2) || (player1 == 2 && player2 == 3) || (player1 == 3 && player2 == 1))
            {
                 fail = fail + 1;
                 logArray[0][count] = 2;
                 logArray[1][count] = player1;
                 logArray[2][count] = player2;
            }
            else if ((player1 == 2 && player2 ==1) || (player1 == 3 && player2 == 2) || (player1 == 1 && player2 == 3))
            {
                 win = win + 1;
                 logArray[0][count] = 1;
                 logArray[1][count] = player1;
                 logArray[2][count] = player2;
            }
            else if (player1 == player2)
            {
                 draw = draw + 1;
                 logArray[0][count] = 3;
                 logArray[1][count] = player1;
                 logArray[2][count] = player2;
            }//End ifs
            //Text output for human players
            if (p1mode == 1 || p2mode == 1)
            {
                switch (player1)
                {
                       case 1: cout << "\nPlayer 1 chose Rock.";
                       break;
                       case 2: cout << "\nPlayer 1 chose Paper.";
                       break;
                       case 3: cout << "\nPlayer 1 chose Scissors.";
                       break;
                }//End Switch
                switch (player2)
                {
                       case 1: cout << "\nPlayer 2 chose Rock.";
                       break;
                       case 2: cout << "\nPlayer 2 chose Paper.";
                       break;
                       case 3: cout << "\nPlayer 2 chose Scissors.";
                       break;
                } //End Switch
                switch (logArray[0][count])
                {
                       case 1: cout << "\nPlayer 1 Wins!\n";
                       break;
                       case 2: cout << "\nPlayer 2 Wins!\n";
                       break;
                       case 3: cout << "\nDraw!\n";
                       break;
                }//End Switch
            }//End if
        player1 = 0;
     } //endfor
     cout <<"\n\n------ENDGAME------";
     cout << "\nPlayer 1: " << win << endl << "Player 2: " << fail << endl << "Draw: " << draw;
     cout << "\n\nDisplay game log? Y/N: ";
     cin >> displog;
     //Begin Endgame Log Display
     while (displog == 'y' || displog == 'Y')
     {
           cout << "\nRound   Player 1   Player 2   Result\n";
           for (int count = 0; count <= (rounds - 1); count = count + 1)
           {
               cout << endl;
               //Slight aesthetic fix, makes output ine up better.
               if (count <= 8)
               {
                         cout << "0";
               }
               cout << (count + 1) << ":     ";
               switch (logArray[1][count])
               {
                      case 1: cout << "rock       ";
                      break;
                      case 2: cout << "paper      ";
                      break;
                      case 3: cout << "scissors   ";
                      break;
                      default: cout << "ERROR      ";
                      break;
               }
               switch (logArray[2][count])
               {
                      case 1: cout << "rock       ";
                      break;
                      case 2: cout << "paper      ";
                      break;
                      case 3: cout << "scissors   ";
                      break;
                      default: cout << "ERROR      ";
               }
               switch (logArray[0][count])
               {
                      case 1: cout << "P1 Wins";
                      break;
                      case 2: cout << "P2 Wins";
                      break;
                      case 3: cout << "Draw";
                      break;
               }
           } //End for
           displog = ' ';
     } //End While
     cout << "\n\nEnter 1 to end program.";
     cin >> exit;
     return 0;
}//end of main

//------------------------------------------------------------------------------------------
//------------------------------------------------------------ResponderC++ v1.1
//------------------------------------------------------------------------------------------
//Complete rebuild of ResponderTI in C++.
//Does not require or utilize the complicated addons and equipment routines that ResponderTI used.
int computerRESP(int posit, int turn, int movelog[][99])
{
    //Initialize internal variables
    int internCounterRES = 0;
    double didntwinRES = 0.0;
    int lpincRES = 0;
    int listCounterRES = 0;
    int nmeLastMoveRES = 0;
    int myLastMoveRES = 0;
    int myMoveRES = 0;
    int rockResponseRES = 0;
    int paperResponseRES = 0;
    int scissorsResponseRES = 0;
    int highAvgRES = 0;
    //Begin Responder code ------(Position 1)------
    if (posit == 1 && turn >= 2)
    {
              myLastMoveRES = movelog[1][turn - 1];
    //Begin Average Response Computation
    //Responses to 'Rock'
              if (movelog[1][turn - 1] == 1)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[1][internCounterRES] == 1)
                            {
                                    switch (movelog[2][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Rock responses
    //Responses to 'Paper'
              if (movelog[1][turn - 1] == 2)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[1][internCounterRES] == 2)
                            {
                                    switch (movelog[2][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Paper responses
    //Responses to 'Scissors'
              if (movelog[1][turn - 1] == 3)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[1][internCounterRES] == 3)
                            {
                                    switch (movelog[2][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Scissors responses
    }//End if
    //End Position 1 Responder code
//Begin Responder code ------(Position 2)------
    if (posit == 2 && turn >= 2)
    {
              myLastMoveRES = movelog[2][turn - 1];
    //Begin Average Response Computation
    //Responses to 'Rock'
              if (movelog[2][turn - 1] == 1)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[2][internCounterRES] == 1)
                            {
                                    switch (movelog[1][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Rock responses
    //Responses to 'Paper'
              if (movelog[2][turn - 1] == 2)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[2][internCounterRES] == 2)
                            {
                                    switch (movelog[1][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Paper responses
    //Responses to 'Scissors'
              if (movelog[2][turn - 1] == 3)
              {
                      //Loop for average responses
                      for (internCounterRES = 0; internCounterRES <= (turn - 1); internCounterRES = internCounterRES + 1)
                      {
                            if (movelog[2][internCounterRES] == 3)
                            {
                                    switch (movelog[1][(internCounterRES + 1)])
                                    {
                                           case 1: rockResponseRES = rockResponseRES + 1;
                                           break;
                                           case 2: paperResponseRES = paperResponseRES + 1;
                                           break;
                                           case 3: scissorsResponseRES = scissorsResponseRES + 1;
                                           break;
                                    }//End switch
                            }//End if
                      }//End for
                      //Find most common response
                      if (rockResponseRES >= paperResponseRES && rockResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 1;
                      }
                      else if (paperResponseRES >= rockResponseRES && paperResponseRES >= scissorsResponseRES)
                      {
                            highAvgRES = 2;
                      }
                      else if (scissorsResponseRES >= rockResponseRES && scissorsResponseRES >= paperResponseRES)
                      {
                            highAvgRES = 3;
                      }//End ifs
              }//End if
              //End Scissors responses
 

34
Newbie / Some Newbie DB Questions
« on: July 21, 2009, 01:58:41 PM »
Welcome to the forum.

What I can tell you is that yeah, the learning curve is quite a bit steep. What I found easiest to do is go through the bare bottom tutorial, and follow along typing up the code as it goes along. That's how I did it. Now, I have a neat bot in (relatively stalled) development that I just on the verge of making top 5 in F3. Just take it one step at a time. I was planning on writing a DNA assembler interpreter in C++, but I found out today we're skipping the chapter on sequential access files.  AT least my rock-paper-scissors program works.

35
Darwinbots3 / 1 year anniversary
« on: July 15, 2009, 02:09:19 PM »
Great job landing in a spot with Havok! Maybe you can help make it a bit more realistic, Gmod could really use it....

Anyway, I'm well on my way to learning C++ with my current classes at the community college, maybe I'll pick up C# and lend a hand in development.

36
Bug reports / Global mutation rate multiplier not working
« on: July 07, 2009, 10:57:37 AM »
Welcome to the forums.


Anyway, the mutation rates are definately bugged. There are more busted bits of code than we know about right now, and with a running build of DB3 just around the bend, I don't think anyone is going to try and fix that. Try running it with fresh installs on other machines if you can, if not, change the rates individually on a single progenetor bot or change the rates before you start the sim if you aren't already.

37
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: June 25, 2009, 11:03:44 AM »
Well my limited computer acess has slowed down development considerably. But during my C++ class, I've started to knock out some IPO charts for the system. Today, I tried to punch out some DNA.



Holy CRAP this is getting complicated FAST.


All I've tried to do so far is initialize the eye list. That wasn't TOO hard, but its a bit outside my comfort zone. When I got to the first bits of code regarding the actual focuseye.... My head asplode. The fact of the matter is that it is incredibly hard to read a sequence of numbers and set the focuseye to said number. I had to scrap it all and try again later.


Now that I've actually gotten back to writing in DNA assembly again, I suddenly remembered why I wanted to write an interpreter in C++. The complications of doing a simple conditional system are popping up all over the place. It's overwhelming. X_X


I'm gonna need to have some practice on the boolean stack.

38
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: June 08, 2009, 12:12:50 PM »
Pre-production work on the vision system for SF2.2, codenamed 'Walleye', has started. Rough outlines for the code are being laid down with early variables. The switching system is beginning to take a preliminary shape, and is starting to look like a vision system. This is going to take a while to get the actual functional code down and working, and even longer to integrate into SF2.2. The other behaviors are secondary to the new eyes, but will rely on them all the same. The switching system will be simplified a bit, relying on gene order and condition setting. This is just so I can have the patience to code the bot. KISS comes to mind.







And in case you gents havent caught on yet, Slam Funk was a name chosen by taking two random words from the top of my head. It's not pretty, nor does it have anything to do with the bot's behavior. 'Walleye' sounds a lot better, and I think that's what I'm gonna call it now, with the full name being SF2.2-'Walleye'. Has a neat ring to it.

39
Darwinbots3 / Free 12-month XNA Creators Club trial membership
« on: June 08, 2009, 11:49:21 AM »
Cool. I might be getting back my X=box soon, it would be neat to run DB on it. My C++ class at the community college starts tomorrow, too. I might knock out some DNA in my spare time.

40
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: June 03, 2009, 06:12:05 PM »
Yeah, basically what it does is when it activates the scan feature, it stops checking weather or not to activate it (so it does not reset the list of eyes to check) and builds a list of eyes, using an incrementing counter to store 1 to up to eight memvars, starting by storing the number of eyes to check and building the list by looking at what eyes are nonzero and storing the eye number to the next empty list slot, building the list by checking each nonzero eye in the order that it would check EVERY eye, (5-6-5-4) excluding eye5 and any zero eye, putting those ID's in the 'list' and then it begins to actually DO crap. It starts out by doing whatever all I'm going to make it do at each eye on eye5, (IFFF readings, bot status, enemy count, etc) then changes the focuseye to the next eye in the list. It increments a counter to look to the next list position, as long as the counter does not exceed the number of eyes to check. Next cycle, it does the same thing to the first nonzero eye on the list, then switches back to eye5.  Of course, each cycle it checks every nonzero eye on the list to make sure that *.eyeX hasn't changed too much so that it can tell if it needs to knock an eye off the list or put a new one in the queue. This won't be the ONLY vision system used on the bots I make that have it. SF2.1's eye system works VERY effectively when it needs to track fast moving or irregular targets, or if energy becomes dangerously low and the scanning-eye system becomes too costly to use. I may also throw in a 'frustration' variable, that goes up if it has to adjust the eye list. The more it has to update (meaning shit's REALLY flying) the more frustrated it gets, and after a certain level it just kinda goes "FUCK IT!" and reverts to the old eyes until stuff cools down, relying on other SF's (like they already do) for food and enemy locations that might be juuuuust out of sight.

Also, I like the idea of a bot that can get pissed off.

41
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: May 31, 2009, 07:33:52 PM »
I'm sorry, but I can't exactly read what it's doing. I need to go back and look at mod again, I still don't know exactly what it does. I get frustrated when I don't know something. I am also more comfortable with boolean logic than math, so I was thinking more along the lines of using a single gene with multiple 'if exeX greater than 0 and eyetimer is odd and if switchedeyealready is 0 then switch focuseye to X' statements. The 'front-and-next-and' bit is to make sure that fast moving bots do not escape SF's vision, like Aim does to Beholder.

Again, I'm going for simple behavior, complex gene, simple code. I'm used to programming a calculator with a built in BASIC stamp. But don't get me wrong, the calculator itself allowed me to use complex math and trigonometry. I miss my slow-to-a-crawl 3D engine. Damn random RAM resets.

42
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: May 30, 2009, 03:17:35 PM »
It's funny you should mention eyebot, it was suggested a few times back when I was building SF1. But I didn't know as much about DNA then so it looked pretty dang complicated, and I didn't use it. Next time I get the chance I'll go over it again and try commenting the system. But because of the level of integration I'm trying to acheive between the various behaviors, and as a learning exercise (especially in the boolean stack and inline conditions) I will be writing my own system, which will act quite similar to the fashion you discribed, switching focuseye every cycle between each nonzero eye and eye5 to keep track of what's in front of it, for example it starts at eye5 and goes 5-4-5-6-5-3-5-7 ad nausium. Another thing I ought to address is the retreating and retaliation functions, which act more like addons than functions of the bot, sometimes causing a conflicting action which leaves it turning back and forth. This will be solved by expanding the scope of SF's situational parameters to include nothing, fighting, eating, and now, running. I find that the more I tie each action to the main parametric system, the better the bot works. Once I work on the new advance vision, I will expand the parameter sets to health, situation, and tactical, which will integrate IFFF readings, swarm densities, average enemy velocity and body size, and if need be, specific enemy bot species. I think that with SF2's superb dogfighting capabilites, the addition of a diagnostic system to counter info shots, poison, and venom (which I have been thinking up for a while) could make it a deadly F2 contender. And with a robust, nearly unfoolable antivirus system I've been thinking up, it might even get into the low F1 standings.


But first I want to get this bot to work exactly the way I want it, THEN I'll start building crossover variants. But yeah. Expect me to have a status update in one-two weeks or so.

43
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: May 29, 2009, 09:08:02 PM »
Thanks, man. I already know how to run leagues, my computer just doesn't work doing it anymore. Don't try to help fix it, I've tried everything already. Anyway, I already have a good idea on how to beat alpha. But I decided that the work I'd done was enough for one release. It's impressive performance stems from two things. One SF2's main feature is that it uses relatively simple behaviors, that actualy require moderately complex code. The second thing is that there was a single, fatal syntax error in the body regulation system that made it impossible to beat Beholder until I found and fixed it. But, I spent so much time and effort on adding subtle new behaviors and optimising values to give it enough of an edge to beat it, that once I found and fixed the syntax it shot up the ladder like a rocket.

My plan for beating alpha has two possible routes; one, improve upon the existing jumpstart repro gene (which was added to kill alpha in the first place, IIRC) and get it off the get-go. The second is a bit trickier. This path requires a sophisticated vision and swarm-tracking gene set that allows SF to gain a relatively simple behavior; back off of big ones until the group it's with is big enough. This requires not only a vision system that can rapidly change the focuseye to I.D. adjacent bots while it does other things, but also requires a way for each bot to tell each other fellow SF-bot how many friendlies it sees. This could be done with a simple ref variable stating how many Friend IFFF pings it sees by storing it to some location. But to keep pace with quick bots and combat, once fighting starts or if the average .refvel of Foe pings exceeds a threshold, it reverts to the current eye system. During trials I noticed some bots getting the shit kicked out of them while eating, and got killed before they could run. Such a vision system might fix this.


But for now I don't think I can strong-arm SF's technology any higher than 5th. I watch the top four fight and it's as if I see the screen fill with top-condition bots nearly instantly, they just start too fast. But 5th place isn't something to complain about. Now, to get passed Alpha (reliably)...

44
F3 bots / Slam_Funk2.1(F3)(Ta-183)-5.27.09
« on: May 27, 2009, 08:09:48 PM »
ROBOT TOO BIG TO FIT!

Here you go guys, as promised. I got it to beat Beholder, and once it did, it shot to the top 5. (With a little hitch at Alpha..... You can just ignore the results of that match. It beats it... Sometimes.....)

45
F3 bots / Slam_Funk2.0(F3)(Ta-183)-4.26.09
« on: May 27, 2009, 06:37:55 PM »
VICTORY!!!!!

It beats Beholder! Now I just have to do some final tweaking, look over it for errors, and make sure everything is set where it should be. Then I'll (try to) run it in the leagues.

It gets all the way to alpha, but they each seem very evenly matched, with the edge leaning to alpha. It CAN beat alpha, but it just needs to get at it quicker. A few tweaks on the repro (and to that end I already put in an early-game blitz feature!) and it ought to be were I need it.

EDIT: It can get all the way past Defence. I'm so giddy I can barely type. It looses against Diversa Reflexum. Expect a release in two minutes.

Pages: 1 2 [3] 4 5 ... 7