• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1524
  • Last Modified:

Pong in UNIX writen in C code..

Hi experts,

Basically I am trying to implement a simple pong game in a unix shell. I have the code for the ball bouncing around the screen(walls), however I have found it difficult to make the paddle which the user can use the keyboard keys (i.e. q,a) to move the paddle and, well you know its the old pong game!!

Screen should look like:

XXXXXXXXXXXXXXX - Walls
X
X                          X
X     ball - o           X - paddle
X                          X
X
XXXXXXXXXXXXXXX


/*  ppong.c
 *      bounce a character (default is 'o') around the screen
 *      defined by some parameters
 *
 *      user input:       s slow down x component, S: slow y component
 *                   f speed up x component,  F: speed y component
 *                  Q quit
 *
 *      blocks on read, but timer tick sends SIGALRM caught by ball_move
 *      build:   cc ppong.c set_ticker.c -lcurses -o ppong
 */

#include      <curses.h>
#include      <signal.h>
#include      "ppong.h"

struct ppball the_ball ;

/**  the main loop  **/

void set_up();
void wrap_up();

int main()
{
      int      c;

      set_up();

      while ( ( c = getchar()) != 'Q' ){
            if ( c == 'f' )           the_ball.x_ttm--;
            else if ( c == 's' ) the_ball.x_ttm++;
            else if ( c == 'F' ) the_ball.y_ttm--;
            else if ( c == 'S' ) the_ball.y_ttm++;
      }

      wrap_up();
}


void set_up()
/*
 *      init structure and other stuff
 */
{
      void      ball_move(int);

      the_ball.y_pos = Y_INIT;
      the_ball.x_pos = X_INIT;
      the_ball.y_ttg = the_ball.y_ttm = Y_TTM ;
      the_ball.x_ttg = the_ball.x_ttm = X_TTM ;
      the_ball.y_dir = 10  ;
      the_ball.x_dir = 10 ;
      the_ball.symbol = DFL_SYMBOL ;

      initscr();
      noecho();
      crmode();

      signal( SIGINT , SIG_IGN );
      mvaddch( the_ball.y_pos, the_ball.x_pos, the_ball.symbol  );
      refresh();
      
      signal( SIGALRM, ball_move );
      set_ticker( 1000 / TICKS_PER_SEC );      /* send millisecs per tick */
}

void wrap_up()
{

      set_ticker( 0 );
      endwin();            /* put back to normal      */
}


void ball_move(int signum)
{
      int      y_cur, x_cur, moved;

      signal( SIGALRM , SIG_IGN );            /* dont get caught now       */
      y_cur = the_ball.y_pos ;            /* old spot            */
      x_cur = the_ball.x_pos ;
      moved = 0 ;

      if ( the_ball.y_ttm > 0 && the_ball.y_ttg-- == 1 ){
            the_ball.y_pos += the_ball.y_dir ;      /* move      */
            the_ball.y_ttg = the_ball.y_ttm  ;      /* reset*/
            moved = 1;
      }

      if ( the_ball.x_ttm > 0 && the_ball.x_ttg-- == 1 ){
            the_ball.x_pos += the_ball.x_dir ;      /* move      */
            the_ball.x_ttg = the_ball.x_ttm  ;      /* reset*/
            moved = 1;
      }

      if ( moved ){
            mvaddch( y_cur, x_cur, BLANK );
            mvaddch( y_cur, x_cur, BLANK );
            mvaddch( the_ball.y_pos, the_ball.x_pos, the_ball.symbol );
            bounce_or_lose( &the_ball );
            move(LINES-1,COLS-1);
            refresh();
      }
      signal( SIGALRM, ball_move);            /* for unreliable systems */

}

int bounce_or_lose(struct ppball *bp)
{
      int      return_val = 0 ;

      if ( bp->y_pos == TOP_ROW ){
            bp->y_dir = 1 ;
            return_val = 1 ;
      } else if ( bp->y_pos == BOT_ROW ){
            bp->y_dir = -1 ;
                   return_val = 1;
      }
      if ( bp->x_pos == LEFT_EDGE ){
            bp->x_dir = 1 ;
                   return_val = 1 ;
      } else if ( bp->x_pos == RIGHT_EDGE ){
            bp->x_dir = -1;
                   return_val = 1;
      }

      return return_val;
}




/* ppong.h                  */

/* some settings for the game      */

#define      BLANK            ' '
#define      DFL_SYMBOL      'o'
#define      TOP_ROW            5
#define      BOT_ROW       20
#define      LEFT_EDGE      10
#define      RIGHT_EDGE      70
#define      X_INIT            10            /* starting col            */
#define      Y_INIT            10            /* starting row            */
#define      TICKS_PER_SEC      50            /* affects speed      */

#define      X_TTM            5
#define      Y_TTM            8

/** the ping pong ball **/

struct ppball {
            int      y_pos, x_pos,
                  y_ttm, x_ttm,
                  y_ttg, x_ttg,
                  y_dir, x_dir;
            char      symbol ;

      } ;






#include      <stdio.h>
#include        <sys/time.h>
#include        <signal.h>

/*
 *      set_ticker.c
 *          set_ticker( number_of_milliseconds )
 *                   arranges for the interval timer to issue
 *                   SIGALRM's at regular intervals
 *          returns -1 on error, 0 for ok
 *
 *      arg in milliseconds, converted into micro seoncds
 */


set_ticker( n_msecs )
{
        struct itimerval new_timeset;
        long    n_sec, n_usecs;

        n_sec = n_msecs / 1000 ;
        n_usecs = ( n_msecs % 1000 ) * 1000L ;

        new_timeset.it_interval.tv_sec  = n_sec;        /* set reload  */
        new_timeset.it_interval.tv_usec = n_usecs;      /* new ticker value */
        new_timeset.it_value.tv_sec     = n_sec  ;      /* store this   */
        new_timeset.it_value.tv_usec    = n_usecs ;     /* and this     */

      return setitimer(ITIMER_REAL, &new_timeset, NULL);
}


I have looked at similar pong code, however being in Java it is a little hard to reference.

This one is a brain tester.. Any help would be great..My first interactive game..


0
Omer_85
Asked:
Omer_85
1 Solution
 
Dragon_KromeCommented:
I'm kinda rusty at curses programming, but here's a worms game with source code. You can see how the keyboard is handled there:

http://www.paulgriffiths.net/program/c/curworm.html
0
 
Omer_85Author Commented:
Question was not answered, or and helpful tips given at all.

As I only had one comment they will get the points.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now