1

So i built this really simple game in c language, where you are a ship and need to avoid a bullet rising up the screen. Once I run it in terminal, every time I want to move the ship I enter a (left) s(straight) or d(right). I was wondering if there was a way to not be forced use the enter key after every move and rather have the bullet gradually rise up like one space a second or something automatically.

The code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <assert.h>
#define height 20
#define width 15

int main (int argc, char *argv[]) {
    printf("Beginning Game\n");
    printf("Press 's' to start\n");
    char move = 0;
    int count = 6;
    int turn = 0;
    int row = 0;
    int col = 0;
    int left = 0;
    int right = 14;
    srand(time(NULL));
    int shootcol =  rand() % (width - 3) + 2 ;
    int shootrow = height + 1;
    int shoot2col = rand() % (width - 3) + 2 ;
    int shoot2row = height + 15; 



while (move != 'e') {
    printf("\n");
    scanf(" %c", &move);
    if (move == 's') {
        turn++;
    }
    else if (move == 'a') {
        count--;
        turn++;

    } else if (move == 'd') {
        count++;
        turn++;

    } 
    row = 0;
    col = 0;
    printf("TURN: %d\n", turn);
    while (row < height) {
        while (col < width) {
            //printf("%d", col );
            if (((row == shootrow) && (col == shootcol)) || ((row == shoot2row) && (col == shoot2col))) {
                printf(":");


            } else if (col == left) {

                printf("|");


            } else if (col == right) {
                printf("|");

            } else if (row < 5) {
                printf(" ");

            } else if (row == 5) {

                if (col < count) {
                    printf(" ");
                } else if (col == count) {
                    printf("|");

                } else if (col == count + 1) {
                    printf("-");

                } else if (col == count + 2) {
                    printf("|");

                } else if (col >= count + 3)    {
                    printf(" ");
                }
            } else if (row == 6) {

                if (col < count) {
                    printf(" ");
                } else if (col == count) {
                    printf("\\");

                } else if (col == count + 1) {
                    printf(" ");

                } else if (col == count + 2) {
                    printf("/");

                } else if (col >= count + 3)    {
                    printf(" ");
                }

            } else {
                printf(" ");

            }
            col++;

        }
        col = 0;
        printf("\n");
        row++;

    }
    shootrow--;
    shoot2row--;
    if ((count == left) || (count == right - 2)) {
        printf("YOU LOSE!!\n");
        move = 'e';
    } else if ((shootrow == 5) || (shootrow == 4)) {
        if ((count == shootcol) || (count == shootcol - 2 ) || (count == shootcol - 1)) {
            printf("YOU LOSE!!\n");
            move = 'e';
        } if ((count == shoot2col) || (count == shoot2col - 2 ) || (count == shoot2col - 1)) {
            printf("YOU LOSE!!\n");
            move = 'e';
        }

    } if (shootrow <= 0) {
        shootrow = height - 1;
        shootcol =  rand() % (width - 3) + 2 ;
    } if (shoot2row <= 0) {
        shoot2row = height - 1;
        shoot2col = rand() % (width - 3) + 2;
    }

}

return 0;
}
Jonski Goldstein
  • 169
  • 5
  • 16
  • Detecting a keypress (non-blocking): [Linux](http://stackoverflow.com/questions/20349585/c-library-function-to-check-the-keypress-from-keyboard-in-linux), [Windows](https://msdn.microsoft.com/en-us/library/236adc23%28v=vs.80%29.aspx). You could just add a `sleep` ([windows](http://stackoverflow.com/questions/3379139/sleep-function-in-windows-using-c), [linux](http://linux.die.net/man/2/nanosleep)) to your `while`. – Kenney Nov 29 '15 at 00:21
  • 2
    There is no way in standard C. You will have to use non-standard means - which will be specific to your target environment, compiler, etc. Such as those mentioned by Kenney. – Peter Nov 29 '15 at 01:59
  • I am using a mac, so would there be any way to do that on a mac, and also I haven't seen the sleep function before, where and what would I put into my code. Thanks – Jonski Goldstein Nov 29 '15 at 02:07

1 Answers1

2

The simplest way is using the conio library

#include <conio.h>
#define DELAY 300    // define here the amount of milliseconds to sleep

If you are using linux or mac

#include <unistd.h>

If you are using Windows

#include <windows.h>

and this is how the beginning of your loop would look like

while (move != 's')
    scanf(" %c", &move);

move = ' ';

while (move != 'e') {
    printf("\n");

    //Sleep(DELAY);    // windows only sleep 's' lowercase for linux
    usleep(DELAY);     // for mac

    if (_kbhit())
    {
        move = _getch();
    }

    if (move == 's') {
        turn++;
    }