Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Pong C Game/Program Help!

Hi guys,

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
#include
#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
#include
#include

/*
* 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..Oh I know this is C++, but I need C code.

Comments

  • Griz803Griz803 Member Posts: 100

    " This one is a brain tester.. Any help would be great..My first interactive game..Oh I know this is C++, but I need C code."

    Ok, well don't look now, but the code you show is C code. Yes, all of it that I see is C, not C++. Be Happy, Don't Worry. Your confusion probably stems from the fact that C can be compiled by most (if not all) C++ compilers. And this appears to be perfectly good C code.


  • IwishIknewCIwishIknewC Member Posts: 4
    :
    : " This one is a brain tester.. Any help would be great..My first interactive game..Oh I know this is C++, but I need C code."
    :
    : Ok, well don't look now, but the code you show is C code. Yes, all of it that I see is C, not C++. Be Happy, Don't Worry. Your confusion probably stems from the fact that C can be compiled by most (if not all) C++ compilers. And this appears to be perfectly good C code.
    :
    :
    :

    Yes Griz803 I know my code is C. I know its good. What I ment was that this message board is the C++ Game programming board. And my code is as you put it is...C. So any help from C++ coders would be great. I know there are differnces but maybe some of you guys would have come across something like this.

    I cant implement paddle and walls.
  • Griz803Griz803 Member Posts: 100

    : Yes Griz803 I know my code is C. I know its good. What I ment was that this message board is the C++ Game programming board. And my code is as you put it is...C. So any help from C++ coders would be great. I know there are differnces but maybe some of you guys would have come across something like this.
    :
    : I cant implement paddle and walls.


    Oops! Missed out on sleep again, sorry. I'll give the code a look see and post again by tommorrow.

Sign In or Register to comment.