Basicbot 0.2.2: Added "static variables" (no, not a contradiction ;) and "static random variables" (I won't even try...)

This commit is contained in:
qfox 2006-08-28 23:16:10 +00:00
parent dd126e30e5
commit 24288cd015
4 changed files with 98 additions and 6 deletions

View File

@ -37,7 +37,7 @@
// go up each time something is released to the public, so you'll // go up each time something is released to the public, so you'll
// know your version is the latest or whatever. Version will be // know your version is the latest or whatever. Version will be
// put in the project as well. // put in the project as well.
static char BBversion[] = "0.2.1"; static char BBversion[] = "0.2.2";
static HWND hwndBasicBot = 0; // qfox: GUI handle static HWND hwndBasicBot = 0; // qfox: GUI handle
static bool BotRunning = false; // qfox: Is the bot computing or not? I think... static bool BotRunning = false; // qfox: Is the bot computing or not? I think...
@ -131,6 +131,19 @@ float AverageScore[4]; // qfox: keep the average scores in here. to prevent
// this is not a total, but the average is computed after // this is not a total, but the average is computed after
// every attempt and put back in here. this shouldn't // every attempt and put back in here. this shouldn't
// affect accuracy. // affect accuracy.
int X,Y,Z,P,Prand,Q,Qrand; // qfox: static variables (is this a contradiction?) and
// probabilities. XYZ remain the same, PQ return randomly a
// number in the range of 0-P or 0-Q. They can be used in
// the code like any other command ("5+X echo"). The button
// above their input fields will update these values only (!)
// The rand values are updated after each frame. This results
// in all the P and Q values being equal in every usage, but
// random for each frame.
// The values are only evaluated when reading them from the
// GUI (so when starting a new run or when refreshing). This
// means you can use any code here, but the static won't be
// updated every frame. This is the intention of the variable.
static void SeedRandom(uint32 seed) static void SeedRandom(uint32 seed)
{ {
@ -152,7 +165,14 @@ static unsigned int NextRandom(void)
rand3 = (((rand3 & 4294967280U) << 17) ^ b); rand3 = (((rand3 & 4294967280U) << 17) ^ b);
return (rand1 ^ rand2 ^ rand3); return (rand1 ^ rand2 ^ rand3);
} }
/**
* qfox: this is the way we use it anyways
*/
static int GetRandom(int n)
{
if (n == 0) return n; // qfox: zero devision exception catch :)
return (int) (NextRandom() % n);
}
/** /**
* qfox: All syntax-errors lead here. Some gui notification should be * qfox: All syntax-errors lead here. Some gui notification should be
@ -233,6 +253,15 @@ static int EvaluateFormula(char * formula)
return ParseFormula(false); return ParseFormula(false);
} }
/**
* qfox: fetch the contents of a textfield, evaluated it, return the result
*/
static int EvaluateTextfield(int fieldID)
{
char TempCode[BOT_MAXCODE];
GetDlgItemText(hwndBasicBot, fieldID, TempCode, BOT_MAXCODE);
return EvaluateFormula(TempCode);
}
/** /**
* Parse one level of a string, return the value of the right most number * Parse one level of a string, return the value of the right most number
* - ret indicates whether the function should return as soon as it determines a number, * - ret indicates whether the function should return as soon as it determines a number,
@ -991,6 +1020,25 @@ static int ParseFormula(bool ret)
} }
if (ret) return value; if (ret) return value;
break; break;
case 'P':
case 'Q':
// qfox:these values will not change for each usage
// but be changed to a random number in 0-P and
// 0-Q after each frame. This way you can vary
// the value of some number while using this
// number more then once.
value = (*GlobalCurrentChar == 'P') ? Prand : Qrand;
++GlobalCurrentChar;
if (ret) return value;
break;
case 'X':
case 'Y':
case 'Z':
// qfox: the XYZ makes using statics easier.
value = (*GlobalCurrentChar == 'X') ? X : ((*GlobalCurrentChar == 'Y') ? Y : Z);
++GlobalCurrentChar;
if (ret) return value;
break;
default: default:
// qfox: Unknown characters should error out from now on. You can use spaces. // qfox: Unknown characters should error out from now on. You can use spaces.
BotSyntaxError(12001); BotSyntaxError(12001);
@ -1059,6 +1107,9 @@ void UpdateBasicBot()
memset(BotCounter, 0, BOT_MAXCOUNTERS*4); // qfox: sets all the counters to 0. *4 because memset(BotCounter, 0, BOT_MAXCOUNTERS*4); // qfox: sets all the counters to 0. *4 because
// memset writes bytes and the counters are // memset writes bytes and the counters are
// ints (4 bytes! :) // ints (4 bytes! :)
// qfox: update the P and Q values to something new
Prand = GetRandom(P);
Qrand = GetRandom(Q);
} }
else else
{ {
@ -1203,7 +1254,7 @@ void UpdateBasicBot()
// random number, the button is pressed :) // random number, the button is pressed :)
for(i=0;i<16;i++) for(i=0;i<16;i++)
{ {
if((int) (NextRandom() % 1000) < EvaluateFormula(Formula[i])) if(GetRandom(1000) < EvaluateFormula(Formula[i]))
{ {
// qfox: button flags: // qfox: button flags:
// button - player 1 - player 2 // button - player 1 - player 2
@ -1501,6 +1552,8 @@ static void FromGUI()
GetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP], BOT_MAXCODE); GetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP], BOT_MAXCODE);
GetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode, BOT_MAXCODE); GetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode, BOT_MAXCODE);
UpdateStatics();
} }
UpdateFromGUI = false; UpdateFromGUI = false;
} }
@ -1525,6 +1578,13 @@ static void ToGUI()
SetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP]); SetDlgItemText(hwndBasicBot, 1009, Formula[CODE_STOP]);
SetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode); SetDlgItemText(hwndBasicBot, GUI_BOT_EXTRA, ExtraCode);
SetDlgItemInt(hwndBasicBot, GUI_BOT_X, X, TRUE);
SetDlgItemInt(hwndBasicBot, GUI_BOT_Y, Y, TRUE);
SetDlgItemInt(hwndBasicBot, GUI_BOT_Z, Z, TRUE);
SetDlgItemInt(hwndBasicBot, GUI_BOT_P, P, TRUE);
SetDlgItemInt(hwndBasicBot, GUI_BOT_Q, Q, TRUE);
} }
} }
@ -1549,6 +1609,21 @@ static void InitVars()
Formula[CODE_STOP][4] = 'e'; Formula[CODE_STOP][4] = 'e';
Formula[CODE_STOP][5] = '='; Formula[CODE_STOP][5] = '=';
Formula[CODE_STOP][6] = '1'; Formula[CODE_STOP][6] = '1';
X = Y = Z = P = Prand = Q = Qrand = 0;
}
/**
* qfox: behaves like FromGUI(), except only for XYZPQ
*/
static void UpdateStatics()
{
// qfox: these "statics" are only evaluated once
// (this also saves me looking up stringtoint functions ;)
X = EvaluateTextfield(GUI_BOT_X);
Y = EvaluateTextfield(GUI_BOT_Y);
Z = EvaluateTextfield(GUI_BOT_Z);
P = EvaluateTextfield(GUI_BOT_P);
Q = EvaluateTextfield(GUI_BOT_Q);
} }
/** /**
@ -1623,9 +1698,15 @@ static BOOL CALLBACK BasicBotCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
break; break;
case GUI_BOT_RUN: case GUI_BOT_RUN:
if(BotRunning) if(BotRunning)
{
StopBasicBot(); StopBasicBot();
FCEU_SetBotMode(0);
}
else else
{
FCEU_SetBotMode(1);
StartBasicBot(); StartBasicBot();
}
break; break;
case GUI_BOT_CLEAR: case GUI_BOT_CLEAR:
StopSound(); StopSound();
@ -1655,6 +1736,10 @@ static BOOL CALLBACK BasicBotCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
// refresh the variables with the data from gui, without stopping. // refresh the variables with the data from gui, without stopping.
UpdateFromGUI = true; UpdateFromGUI = true;
break; break;
case GUI_BOT_U:
// qfox: the small update button above the static variables ("U"),
// only update the statics.
UpdateStatics();
default: default:
break; break;
} }

View File

@ -4,12 +4,13 @@
void UpdateBasicBot(); void UpdateBasicBot();
void CreateBasicBot(); void CreateBasicBot();
extern char *BasicBotDir; extern char *BasicBotDir;
static int EvaluateFormula(char * formula, char **nextposition, bool ret); static int EvaluateFormula(char * formula);
static int ParseFormula(bool ret); static int ParseFormula(bool ret);
static void StopBasicBot(); static void StopBasicBot();
static void StartBasicBot(); static void StartBasicBot();
static void debug(int n); static void debug(int n);
static void error(int n); static void error(int n);
static void FromGUI();\ static void FromGUI();
static void UpdateStatics();
void UpdateExternalButton(); void UpdateExternalButton();
#endif // _BASICBOT_H_ #endif // _BASICBOT_H_

Binary file not shown.

View File

@ -5,15 +5,20 @@
#define GUI_BOT_CLOSE 1 #define GUI_BOT_CLOSE 1
#define IDI_ICON1 101 #define IDI_ICON1 101
#define IDI_ICON2 102 #define IDI_ICON2 102
#define GUI_BOT_X 1010
#define GUI_BOT_SAVE 1014 #define GUI_BOT_SAVE 1014
#define GUI_BOT_LOAD 1015 #define GUI_BOT_LOAD 1015
#define GUI_BOT_RUN 1016 #define GUI_BOT_RUN 1016
#define GUI_BOT_Y 1018
#define GUI_BOT_KEYS 1019 #define GUI_BOT_KEYS 1019
#define GUI_BOT_EXTRA 1020 #define GUI_BOT_EXTRA 1020
#define GUI_BOT_BEST 1021 #define GUI_BOT_BEST 1021
#define GUI_BOT_Z 1022
#define GUI_BOT_CHECK 1023 #define GUI_BOT_CHECK 1023
#define GUI_BOT_UPDATE 1024 #define GUI_BOT_UPDATE 1024
#define GUI_BOT_BOTMODE 1025 #define GUI_BOT_BOTMODE 1025
#define GUI_BOT_P 1026
#define GUI_BOT_Q 1027
#define GUI_BOT_P1 1035 #define GUI_BOT_P1 1035
#define GUI_BOT_CLEAR 1036 #define GUI_BOT_CLEAR 1036
#define GUI_BOT_ATTEMPTS 1037 #define GUI_BOT_ATTEMPTS 1037
@ -21,6 +26,7 @@
#define GUI_BOT_FRAMES 1049 #define GUI_BOT_FRAMES 1049
#define GUI_BOT_BESTRESULT 1050 #define GUI_BOT_BESTRESULT 1050
#define GUI_BOT_LAST 1051 #define GUI_BOT_LAST 1051
#define GUI_BOT_U 1052
#define GUI_BOT_AVGMAX 1053 #define GUI_BOT_AVGMAX 1053
#define GUI_BOT_AVGTIE1 1054 #define GUI_BOT_AVGTIE1 1054
#define GUI_BOT_AVGTIE2 1056 #define GUI_BOT_AVGTIE2 1056
@ -41,7 +47,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40013 #define _APS_NEXT_COMMAND_VALUE 40013
#define _APS_NEXT_CONTROL_VALUE 1050 #define _APS_NEXT_CONTROL_VALUE 1053
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif