Arduino Pong

Justin Alava
Patrick "PMONEY" Miazgowicz

Basic Description: Our project is a simulated game of ping pong. It resembles the arcade version of the game from the late 70's. To put it simply, the game is designed with two paddles on both sides that are controled manually and a ball that bounces around the edges. Whoever hits the ball more times will win the game.

Electronic Description: We ran a program through the arduino with a laptop as a power source to display a game of Pong on a television.  We imported an arduino-tvout (http://code.google.com/p/arduino-tvout/)  library to make it run it through an old NTSC T.V.  Our circuit consists of 2 analog inputs to control the paddles, 2 digital outputs to display the game on the television, and the power that ran through positive and negative of the breadboard. We used alligator pins to connect the digital outputs to video cables which were input into the T.V.


CODE:

#include <TVout.h>
#include "pitches.h"

//declare stuff
TVout TV;
unsigned char x,y;
int xDir=1;
int yDir=1;
int leftPaddle;
int rightPaddle;
int leftPot=2;
int rightPot=3;
int scoreLeft=0;
int scoreRight=0;



void setup()  {
  //set the ball
  x=5;
  y=11;
  TV.start_render(_NTSC);
  TV.print_str(12, 1, "Pong");
  TV.select_font(_5X7);
  pinMode(leftPot, INPUT);
  pinMode(rightPot, INPUT);

}

void loop()  {




  //clear screen
  TV.clear_screen();  
  //score
  TV.print_char(35,2, '0'+scoreLeft);
  TV.print_char(85,2, '0'+scoreRight);
  //ball
  TV.set_pixel(x,y,1);
  x=x+xDir;
  y=y+yDir;

  //bounce if hits right paddle

  if (x>118)

  {
    if(y>rightPaddle-2 && y<(rightPaddle+12))
    {
      xDir=-xDir;

    }

    else
    {
      y=leftPaddle+8;
      x=7;
      scoreLeft=scoreLeft+1;
    }

  }

  //Set the ball to bounce if hits left paddle
  if (x<6)
  {

    if(y>leftPaddle-2 && y<(leftPaddle+12))
    {
      xDir=-xDir;
    }
    //if miss
    else
    {
      y=rightPaddle+8;
      x=115;
      scoreRight=scoreRight+1;
    }


  }



  //set ball to bounce top or bottom
  if (y>93 || y<10)
  {

    yDir=-yDir;

  }

  //Left Paddle Control
  leftPaddle=analogRead(leftPot);
  leftPaddle=map(leftPaddle,0,1023,10,85);
  TV.draw_line(5,leftPaddle,5,(leftPaddle+10),1);


  //Right Paddle Control
  rightPaddle=analogRead(rightPot);
  rightPaddle=map(rightPaddle,0,1023,10,85);
  TV.draw_line(120,rightPaddle,120,(rightPaddle+10),1);

  //game over
  if (scoreLeft>9)
  {
    TV.clear_screen();
    TV.print_str(25, 25, "Player 1 Wins!");
    TV.print_str(28, 50, "(player 2 sucks)"); //make fun of player 2
    delay(50000);
    scoreLeft=0;
    scoreRight=0;
  }
  if (scoreRight>9)
  {
    TV.clear_screen();
    TV.print_str(10,25, "Nice try Player 1"); 
    TV.print_str(2,50, "player 2 still sucks"); //make fun of player 2
    delay(50000);
    scoreRight=0; 
    scoreLeft=0;
  }

  //delay
  TV.delay_frame(1);

}



Problems encountered:
At first there was a problem with the library we were using since it was for PAL (foreign) televisions rather than NTSC (U.S.) televisions.  Once we had the right library, the only problems we had were with programming errors.  Those were an easy fix.

What we'd like to add:
If we had more time, we'd add a start menu, a game start/restart button, sound, and a way to make the game harder if you go too long without scoring.


Video:

Comments