Page 1 of 1

Scripting AI for pong

PostPosted: Sat Mar 25, 2006 8:41 pm
by effix
Im trying to figure out this scripting thing.. because I want to create a small AI for my Pong game.. but i cant seem to get past the pseudo stage :D hehe... I cant seem to find a tutorial for scripting in GE C-script...
If I wanted to script something like this how would I do it?

Pseudo code:
HitProcentage=30 //Level dependant.. Level 1= low HitProcentage Level 9=high HitProcentage

if random number<HitProcentage
then move paddle to location near ball
else move paddle to some other location near the ball but not tuching it..

Does it make any sense?

TIA
Regards
Effix

PostPosted: Sun Mar 26, 2006 12:43 am
by Fuzzy
I have a little function that I use that may suit your purposes. I was going to save for later and use it in a demo or tutorial, but I think this is a good place to introduce it to the GE users.

go to your global code script editor, and type this in.

int Lint(int a, int z, double j) {return (int)(a*(1-j) + z*j);}

At the bottom, there is a blank beside name. Type in something descriptful, like Useful Functions. Hit add.

Now, I know it looks a little obfuscated, but its really simple, and you dont need to know about the guts of it. Here is how you use it. (you can only access it in the script editor, it doesnt appear in the event or action menus)

You feed it three numbers, two that are integers(no decimals), and one that is a floating point number(use decimal points). When you do this, the function will return a number which is partway between the first two numbers, using the third number as a distance. It rounds down to the nearest whole number.

Thats messy, I'll give you some examples.

Pretend your AI paddle is at x=100, and the ball is heading towards x=130. You want the paddle to head that way, and hopefully intercept the ball. The AI on this level is 70% effective, or 0.7.

In the place that your paddle does its thinking, you place this line:

TargetX=Lint(100,130,0.7);

TargetX is a variable that is used to store where the paddle is headed of course. TargetX should now be equal to 121, if all goes right, and you use your draw and movement functions(like moveto()) to move the paddle there.

The nice thing about this is it removes the need to think about whether or not you want to block the ball. The third number, in conjunction with the size of the paddle determines that.

The function also saves you the problem of figuring out whether you want to move left or right; It doesnt matter if you put Lint(130,100, 0.7) or Lint(100,130,0.7). THe only thing to watch for is that the third number is not greater than 1.0.

Please reply if any of this is unclear.

Oh, Lint stands for Linear Interpolation, if you wrere wondering.

PostPosted: Sun Mar 26, 2006 12:59 pm
by effix
Thanks ThreeFingerPete it seems to be working now :) now I just have to spice it up at little so it gets increasingly difficult. :) finally my game starts to look playable :)
But fear not my firends I will return with loads and loads of questions MUHAHAHAH!! :D

PostPosted: Sun Mar 26, 2006 4:02 pm
by Fuzzy
So that worked for that application? I always worry that I dont explain myself properly, or that I fail to understand peoples needs...

PostPosted: Sun Mar 26, 2006 6:43 pm
by effix
Yes it worked.. but im trying to combine it with a randomness feature but i cant get it to work... :( guess I need som serious practice in scripting :)

PostPosted: Sun Mar 26, 2006 7:43 pm
by Fuzzy
Just use randomness in the floating point(third) number. Pick a random number from 1-10 divide it by 10, and use that. Better yet, divide by 100 and add that to a base number, such as 0.4.

Randomness.. :)

PostPosted: Wed Mar 29, 2006 1:18 pm
by effix
Yes Pete.. that would work... but its not that part of the code that I want to be random.
what I am trying to make is the following..
when the ball is on the CPU side of the level it uses the linear interpolation code you helped me with.. but when the ball is on the players side of the level the cpu_paddle moves more or less random... the idea is to make the CPU look a little more human.
Ive been trying to do it with "if else" but that didnt work.. so for now im trying to create a menu for my game. :)

PostPosted: Wed Mar 29, 2006 11:13 pm
by Fuzzy
eep! i never even thought of what the CPU would be doing as the ball heads away from it. Have you considered having the CPU taunt the player with text messages? You could read them from a file. THis would allow the player to customize that file.

great idea...

PostPosted: Thu Mar 30, 2006 7:34 am
by effix
Thats a great idea :) Ill put it on my todo list.