]> code.delx.au - pong/blobdiff - pong.c
Optional AI, scores now reset when they hit 9
[pong] / pong.c
diff --git a/pong.c b/pong.c
index 5f5ccf7c3421c59752e8e99354d0c5ace622e14c..6f2ec4ce02c40741ab36994d997cc0580b23e450 100644 (file)
--- a/pong.c
+++ b/pong.c
 #include <stdio.h>
 #include <stdlib.h>
 
-enum {
-       FRAME=40,
-       HEIGHT=100,
-       PADDLESIZE=10
-};
-
-static int score1;
-static int score2;
-static GLdouble paddle1;
-static GLdouble paddle2;
-static GLdouble ballX;
-static GLdouble ballY;
-static GLdouble ballVecX;
-static GLdouble ballVecY;
+#define SPEEDINC    1.15
+#define PADDLESPEED 2.5
+#define FRAME       40
+#define PADDLESIZE  10
+#define HEIGHT      100
+
+static int AI = 0;
+static int p1move = 0;
+static int p2move = 0;
+static int score1 = 0;
+static int score2 = 0;
+static GLdouble paddle1 = 0.0;
+static GLdouble paddle2 = 0.0;
+static GLdouble ballX = 0.0;
+static GLdouble ballY = 0.0;
+static GLdouble ballVecX = 0.0;
+static GLdouble ballVecY = 0.0;
 
 
 static void initball(void) {
        ballX = 0.0;
        ballY = 0.0;
        if(ballVecX < 0)
-               ballVecX = -1.0;
+               ballVecX = -1.2;
        else
-               ballVecX = 1.0;
-       ballVecY = 1.0;
+               ballVecX = 1.2;
+       ballVecY = 0.7;
 }
 
 static void run(void) {
+       // AI
+       if(AI) {
+               if(ballY < paddle2 - PADDLESIZE)
+                       p2move = -1;
+               else if(ballY > paddle2 + PADDLESIZE)
+                       p2move = 1;
+               else
+                       p2move = 0;
+       }
+
+       // Move the paddles
+       paddle1 += p1move * PADDLESPEED;
+       paddle2 += p2move * PADDLESPEED;
+
        // Check for collisions with paddles
        if(ballVecX < 0 && ballX <= -HEIGHT + -ballVecX * 1.5) {
                if(ballY >= paddle1 - PADDLESIZE && ballY <= paddle1 + PADDLESIZE) {
-                       ballVecX *= -1.15;
-                       ballVecY *= 1.15;
+                       ballVecX *= -SPEEDINC;
+                       ballVecY *= SPEEDINC;
                }
        }
        if(ballVecX > 0 && ballX >=  HEIGHT - ballVecX * 1.5) {
                if(ballY >= paddle2 - PADDLESIZE && ballY <= paddle2 + PADDLESIZE) {
-                       ballVecX *= -1.15;
-                       ballVecY *= 1.15;
+                       ballVecX *= -SPEEDINC;
+                       ballVecY *= SPEEDINC;
                }
        }
 
        // Check if it's past the top or bottom of the screen
        if(ballY >= HEIGHT || ballY <= -HEIGHT) {
-               ballVecY *= -1;
+               ballVecY = -ballVecY;
        }
 
        // Check if it's past the sides of the screen
        if(ballX >= HEIGHT) {
                ++score1;
                initball();
-               return;
        }
        if(ballX <= -HEIGHT) {
                ++score2;
                initball();
-               return;
        }
 
        // Move the ball
        ballX += ballVecX;
        ballY += ballVecY;
+
+       // Check scores for winners..
+       if(score1 == 9) {
+               // Player 1 wins
+               score1 = score2 = 0;
+       }
+       if(score2 == 9) {
+               // Player 2 wins
+               score1 = score2 = 0;
+       }
 }
 
 static void display(void) {
@@ -117,21 +142,17 @@ static void keyboard(unsigned char key, int x, int y) {
                        exit(0);
 
                case 'w':
-                       if(paddle1 + PADDLESIZE < HEIGHT)
-                               paddle1 += PADDLESIZE;
+                       p1move = 1;
                        break;
                case 's':
-                       if(paddle1 - PADDLESIZE > -HEIGHT)
-                               paddle1 -= PADDLESIZE;
+                       p1move = -1;
                        break;
 
                case 'i':
-                       if(paddle2 + PADDLESIZE < HEIGHT)
-                               paddle2 += PADDLESIZE;
+                       p2move = 1;
                        break;
                case 'k':
-                       if(paddle2 - PADDLESIZE > -HEIGHT)
-                               paddle2 -= PADDLESIZE;
+                       p2move = -1;
                        break;
 
                default:
@@ -140,6 +161,23 @@ static void keyboard(unsigned char key, int x, int y) {
        glutPostRedisplay();
 }
 
+static void keyboardUp(unsigned char key, int x, int y) {
+       (void)x;(void)y;
+
+       switch(key) {
+               case 'w':
+               case 's':
+                       p1move = 0;
+                       break;
+
+               case 'i':
+               case 'k':
+                       p2move = 0;
+                       p2move = 0;
+                       break;
+       }
+}
+
 static void timer(int lastTime) {
        int curTime = glutGet(GLUT_ELAPSED_TIME);
        do {
@@ -156,6 +194,10 @@ static void init(void) {
 }
 
 int main(int argc, char *argv[]) {
+       if(argc == 2 && *argv[1] == '1') {
+               AI = 1;
+       }
+
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(640, 480);
        glutInit(&argc, argv);
@@ -164,6 +206,7 @@ int main(int argc, char *argv[]) {
        glutDisplayFunc(display);
        glutReshapeFunc(resize);
        glutKeyboardFunc(keyboard);
+       glutKeyboardUpFunc(keyboardUp);
        glutTimerFunc(FRAME, timer, glutGet(GLUT_ELAPSED_TIME));
        init();
        glutMainLoop();