-
Easier way?
If i wanted to make a snake or pacman type game...
Is there a way to make the character move instead of this:
Code:
if(mve == dwn && grid[0][1] == ' '){
grid[0][1] = 'X';
grid[0][0] =' ';
doing that for every grid and evry possibility (up, dow, left, right)
would be soo tedious and time consuming.
:(
-
>would be soo tedious and time consuming
Well, first you should use variables for the coordinate indices. Second, for very tedious/repetitive tasks you should consider writing a generic function that can take care of it for you so that all you have to do is call the function instead of implement it every time you wish to change the location:
Code:
void change_location ( const char modex, const char modey )
{
grid[x][y] = CLEAR;
if ( modex == '+' ) x++;
else if ( modex == '-' ) x--;
if ( modey == '+' ) y++;
else if ( modey == '-' ) y--;
grid[x][y] = FILL;
}
.
.
.
switch ( move ) {
case UP: change_location ( 0, '-' ); break;
case DOWN: change_location ( 0, '+' ); break;
case LEFT: change_location ( '-', 0 ); break;
case RIGHT: change_location ( '+', 0 ); break;
default:
perror ( "Invalid input" );
}
-Prelude
-
wow, that will take me a while to understand....
Hmmm.. could you edit that with comments?
I cant understand what certain things like + and - are doing...
-
Edited with liberal comments. :)
Code:
/* This function takes two characters which tell it
** whether to add or subtract a grid cell from the
** two coordinate variables x and y. x and y are
** assumed to be global in this example.
*/
void change_location ( const char modex, const char modey )
{
/* Place a space character at the
** current location to clear the
** grid cell.
*/
grid[x][y] = CLEAR;
/* Test modex, which will determine
** how the x coordinate is to be
** changed. '+' means add, '-' means
** subtract, and any other value
** means to do nothing with x.
*/
if ( modex == '+' ) x++;
else if ( modex == '-' ) x--;
/* Test modey which effects the x
** coordinate in the same manner as
** the x coordinate.
*/
if ( modey == '+' ) y++;
else if ( modey == '-' ) y--;
/* The coordinates are set for the new
** location, place the character that
** was to be moved at the new location.
*/
grid[x][y] = FILL;
}
.
.
.
/* Switch with the move variable. Each direction
** is denoted by a named constant for ease of
** reading.
*/
switch ( move ) {
/* Each call to change_location effects either
** x or y, the first argument to change_location
** effects x and the second effects y. A '+' means
** to add, a '-' means to subtract, and in this
** case, 0 means to do nothing though any value
** other than '+' and '-' could be used.
*/
case UP: change_location ( 0, '-' ); break;
case DOWN: change_location ( 0, '+' ); break;
case LEFT: change_location ( '-', 0 ); break;
case RIGHT: change_location ( '+', 0 ); break;
default:
perror ( "Invalid input" );
}
-Prelude
-
Ok, im going to asume there is alot to declare?
And will this work with dev-c++?
I really want to use the kbhit() func. nut it doesnt seem to work with my compiler.
And with a snake or Pacman type game, how would you make the character move in a set direction by itself? (with a controlled speed).
Thanks for your help Prelude you really know this stuff
:D
-
>Ok, im going to asume there is alot to declare?
Well, you need a grid and two coordinate variables. Past that is just making things more readable and easier to maintain. Instead of CLEAR and FILL I could have easily used ' ' and 'X'.
>And will this work with dev-c++?
Yes.
>And with a snake or Pacman type game, how would you make
>the character move in a set direction by itself?
Yes, have one of the coordinates increment or decrement with every iteration of the loop which tests for a new location. When the user chooses a new direction ( usually only left or right respective to the current direction ) then a new coordinate will be picked to change constantly:
Code:
for ( ; ; ) {
if ( direction == x )
change_location ( change, 0 );
else
change_location ( 0, change );
pause_for_input ( &move );
switch ( move ) {
case LEFT:
change_location ( '-', 0 );
direction = ( direction == x ) ? y : x;
break;
case RIGHT:
change_location ( '+', 0 );
direction = ( direction == x ) ? y : x;
break;
}
/* Reset change so that direction
** is incremented or decremented
** accordingly
*/
}
This should work if you can write pause_for_input() so that it waits for a certain length of time ( around 200 milliseconds ) while at the same time waiting for input and ends even if there is no input. This is very implementation and platform dependent, so I'll leave that up to you since you know your platform better than I do.
-Prelude
-
ok youve given me much to think about :)
One more thing...
If i cant use kbhit(),
how can I get the same results with a different function?
[edit]
Prelude, you rock :cool:
[/edit]
-
>how can I get the same results with a different function?
The functionality of kbhit() is nonstandard and any function that does it may not be on all implementations. I'm not familiar with Bloodshed, so you'll have to look around your documentation to see if there is a kbhit() equivalent. I can't remember exactly, but I think there is a WinAPI function called MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx that will wait until certain criteria that you give it are met, such as a key being hit or a time limit being reached. Don't quote me on that though because I'm not sure.
-Prelude
-
kbhit() does work for Dev, Vicious. Well, actually I'm not sure if it does work for Dev4.01, but I know that it does work with Dev5beta4.9.2. Go to bloodshed.com to download it. Remember, though, that it is still a beta and there a few problems with it. The only problem that I notice is that when you run the .exe inside of Dev, Dev closes. But as long as you keep the folder (window) open that has the .exe inside it and run the .exe from there it will be no big problem. There is, also, a bug that if you change the text color it sometimes won't work properly. Other than that I haven't found any other bugs. If you need to look at how you use the kbhit() function look at my maze game source code (refer to my sig for link to site).
-
Well the desktop PC has some Viruses and I cant get online to do anything until we get it fixed. :(