Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > pong game,while loop statement solution

Reply
Thread Tools

pong game,while loop statement solution

 
 
DaVinci
Guest
Posts: n/a
 
      03-24-2006
I am writing a pong game.but met some problem.
the ball function to control the scrolling ball,

void ball(int starty,int startx)
{
int di ,i;
int dj,j;
di = 1;
dj = 1;
i = starty;
j = startx;
int ch;
while(1)
{
mvaddstr(i,j,"O");
refresh();
usleep(100000);
i = i + di;
j = j + dj;

if(i >= LINES -1 || i < 0)
{
di = -di;
}
if(j >= COLS -1 || j < 0)
{
dj = -dj;
}
}
}

the question is when I want to invoke the ball()function in main()
function,
I can't go out from the while loop. If I didn't write the while loop
statement
I didn't how to let the ball srcolling all the time.

I had trid to use IPC to make them work,let ball() be invoked by child
process
but not work.

any help is apreciated.

 
Reply With Quote
 
 
 
 
TB
Guest
Posts: n/a
 
      03-24-2006
DaVinci skrev:
> I am writing a pong game.but met some problem.
> the ball function to control the scrolling ball,
>
> void ball(int starty,int startx)
> {
> int di ,i;
> int dj,j;
> di = 1;
> dj = 1;
> i = starty;
> j = startx;
> int ch;
> while(1)
> {
> mvaddstr(i,j,"O");
> refresh();
> usleep(100000);
> i = i + di;
> j = j + dj;
>
> if(i >= LINES -1 || i < 0)
> {
> di = -di;
> }
> if(j >= COLS -1 || j < 0)
> {
> dj = -dj;
> }
> }
> }
>
> the question is when I want to invoke the ball()function in main()
> function,
> I can't go out from the while loop. If I didn't write the while loop
> statement
> I didn't how to let the ball srcolling all the time.
>
> I had trid to use IPC to make them work,let ball() be invoked by child
> process
> but not work.
>
> any help is apreciated.
>


Simple game loop:

while( ! Game over () ) {
Read player input ();
Move the ball ();
Draw next frame ();
}

--
TB @ SWEDEN
 
Reply With Quote
 
 
 
 
loufoque
Guest
Posts: n/a
 
      03-24-2006
DaVinci wrote :

> mvaddstr(i,j,"O");


a ncurses-based pong !
Wouldn't using a video framebuffer or an opengl context be better ?
 
Reply With Quote
 
Luke Meyers
Guest
Posts: n/a
 
      03-25-2006
DaVinci wrote:
> I am writing a pong game.but met some problem.
> the ball function to control the scrolling ball,
>
> void ball(int starty,int startx)


This is going to sound odd, but I think the biggest problem in your
program is right here. Functions *do* things, so it's most natural to
name them with verbs or verb phrases. "ball" is a noun, not a verb
(quit snickering, all you grammatical smart-alecks). Reading the
function name, it's difficult for me -- and evidently for you -- to
determine in any clear fashion what behavior this function is
responsible for.

I know, I know -- you're asking about looping, and I'm harping on about
naming conventions. But work with me a moment -- what is it that you
want this function to do? If you were going to rename it to a verb or
verb phrase, what would you call it? For example, would it be
moveBallOneStep()? Or perhaps moveBallForever()? Do you see how each
of these names carries an obvious implication with regard to the
looping logic? moveBallOneStep() obviously wants to just do one thing
once, each time it's called, and not contain a loop. So, you would put
the call to moveBallOneStep() *inside* a loop, rather than the loop
inside the function.

On the other hand, if you're going to moveBallForever(), then of course
you'll need a loop similar to the one you've written. The thing with
endless loops, though, is that they really hog the flow of control.
main() doesn't get a chance to do anything as long as you're inside the
body of moveBallForever() (or any other function called from main()).
If you stay in that body indefinitely, the flow of control will never
return to main(). Of course, you could always return after some
condition is reached, e.g. moveBallUntilGameEnds().

These aren't wonderful function names or anything, by the way -- just
what I chose for purposes of illustration. They are, however, verb
phrases.

> {
> int di ,i;
> int dj,j;
> di = 1;
> dj = 1;
> i = starty;
> j = startx;
> int ch;


No need to declare everything at the top like this -- declare things as
locally as possible, generally speaking. Also, save some vertical
space by initializing things as you declare them, rather than declaring
and then assigning. This is a good habit for efficiency, too, when you
come to work with more complex objects.

int i = starty;
int j = startx;

// (inside loop body)
int const di = 1;
int const dj = 1;

Looks like you're not using ch, so remove it.

> I had trid to use IPC to make them work,let ball() be invoked by child
> process
> but not work.


Egad... that's way more convoluted. You need to understand the basic
event loop paradigm; it's very common. Concurrent programming via
mechanisms such as IPC is worlds more complex -- get solid on the
fundamentals first!

Luke

 
Reply With Quote
 
DaVinci
Guest
Posts: n/a
 
      03-25-2006

TB 写道:

> DaVinci skrev:
> > I am writing a pong game.but met some problem.
> > the ball function to control the scrolling ball,
> >
> > void ball(int starty,int startx)
> > {
> > int di ,i;
> > int dj,j;
> > di = 1;
> > dj = 1;
> > i = starty;
> > j = startx;
> > int ch;
> > while(1)
> > {
> > mvaddstr(i,j,"O");
> > refresh();
> > usleep(100000);
> > i = i + di;
> > j = j + dj;
> >
> > if(i >= LINES -1 || i < 0)
> > {
> > di = -di;
> > }
> > if(j >= COLS -1 || j < 0)
> > {
> > dj = -dj;
> > }
> > }
> > }
> >
> > the question is when I want to invoke the ball()function in main()
> > function,
> > I can't go out from the while loop. If I didn't write the while loop
> > statement
> > I didn't how to let the ball srcolling all the time.
> >
> > I had trid to use IPC to make them work,let ball() be invoked by child
> > process
> > but not work.




> >
> > any help is apreciated.
> >

>
> Simple game loop:
>
> while( ! Game over () ) {
> Read player input ();
> Move the ball ();
> Draw next frame ();
> }
>

I had tried that.
I change the while loop to moveBallOneStep()
it looks like this:
But the ball can move only one step when I input one character.
If I didn't input anything,the ball will not move anymore.
what I want is the ball will move all the time,at least it looks like
moving all the time.

If using the while loop moveBallForever() I can't jmp out of the loop
all the same.


> --
> TB @ SWEDEN


 
Reply With Quote
 
DaVinci
Guest
Posts: n/a
 
      03-25-2006

Luke Meyers 写道:

> DaVinci wrote:
> > I am writing a pong game.but met some problem.
> > the ball function to control the scrolling ball,
> >
> > void ball(int starty,int startx)

>
> This is going to sound odd, but I think the biggest problem in your
> program is right here. Functions *do* things, so it's most natural to
> name them with verbs or verb phrases. "ball" is a noun, not a verb
> (quit snickering, all you grammatical smart-alecks). Reading the
> function name, it's difficult for me -- and evidently for you -- to
> determine in any clear fashion what behavior this function is
> responsible for.
>
> I know, I know -- you're asking about looping, and I'm harping on about
> naming conventions. But work with me a moment -- what is it that you
> want this function to do? If you were going to rename it to a verb or
> verb phrase, what would you call it? For example, would it be
> moveBallOneStep()? Or perhaps moveBallForever()? Do you see how each
> of these names carries an obvious implication with regard to the
> looping logic? moveBallOneStep() obviously wants to just do one thing
> once, each time it's called, and not contain a loop. So, you would put
> the call to moveBallOneStep() *inside* a loop, rather than the loop
> inside the function.
>
> On the other hand, if you're going to moveBallForever(), then of course
> you'll need a loop similar to the one you've written. The thing with
> endless loops, though, is that they really hog the flow of control.
> main() doesn't get a chance to do anything as long as you're inside the
> body of moveBallForever() (or any other function called from main()).
> If you stay in that body indefinitely, the flow of control will never
> return to main(). Of course, you could always return after some
> condition is reached, e.g. moveBallUntilGameEnds().
>
> These aren't wonderful function names or anything, by the way -- just
> what I chose for purposes of illustration. They are, however, verb
> phrases.
>
> > {
> > int di ,i;
> > int dj,j;
> > di = 1;
> > dj = 1;
> > i = starty;
> > j = startx;
> > int ch;

>
> No need to declare everything at the top like this -- declare things as
> locally as possible, generally speaking. Also, save some vertical
> space by initializing things as you declare them, rather than declaring
> and then assigning. This is a good habit for efficiency, too, when you
> come to work with more complex objects.
>
> int i = starty;
> int j = startx;
>
> // (inside loop body)
> int const di = 1;
> int const dj = 1;
>

I will chang the variable di,and di
di = -di;
dj = -dj;

so I can't use const
> Looks like you're not using ch, so remove it.
>
> > I had trid to use IPC to make them work,let ball() be invoked by child
> > process
> > but not work.

>
> Egad... that's way more convoluted. You need to understand the basic
> event loop paradigm; it's very common. Concurrent programming via
> mechanisms such as IPC is worlds more complex -- get solid on the
> fundamentals first!
>
> Luke


 
Reply With Quote
 
DaVinci
Guest
Posts: n/a
 
      03-26-2006

loufoque wrote:
> DaVinci wrote :
>
> > mvaddstr(i,j,"O");

>
> a ncurses-based pong !
> Wouldn't using a video framebuffer or an opengl context be better ?

NCURSES is more easy to use.

 
Reply With Quote
 
DaVinci
Guest
Posts: n/a
 
      03-26-2006
I think I have solove my problem .I ignore one important function.
nodelay(WINDOW* win,true),which will not wait for one
character--getch() return ERR if I didn't type anything yet.


so in the main()
for(ch = getch(); ch!='q' ;ch = getch() )
{
moveBallOneStep();//only one step not exist a while loop
switch(ch)
{
case 'j':
moveBoardUp();
case 'k':
moveBoardDown();
...
}

}

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Triple nested loop python (While loop insde of for loop inside ofwhile loop) Isaac Won Python 9 03-04-2013 10:08 AM
OT: Pong Frisbee MitchS MCSE 1 10-11-2005 07:52 PM
a Multiplayer Pong, hmmm... JariTapio Java 3 05-09-2005 05:26 AM
Re: ching chang ping pong won Jtyc MCSE 1 04-07-2004 05:05 PM
OT: Matrix-like Ping pong without "fancy" camera tricks.... Matt MCSE 1 09-17-2003 03:37 PM



Advertisments