Member 11338695 Ответов: 1

2 змеиная программа на языке Си


Привет
Я пытаюсь отобразить 2 змеи в следующей игре для 2 игроков, но терминал показывает только одну змею, есть ли какая-нибудь помощь, как отобразить 2 змеи

Что я уже пробовал:

// #include<stdafx.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
#include<ctype.h>
#include <time.h>
#include <windows.h>
#include <process.h>

#define UP   72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

#define UP2  119    ///W
#define DOWN2  120   ///X
#define LEFT2  97    ///A
#define RIGHT2  100   /// D

int length;
int length2;
int bend_no;
int len;
char key;
char key2;
int life;

void record();
void load();
void Delay(long double);
void Move();
void Move2();
void gotoxy(int x, int y);
void GotoXY(int x,int y);
void GotoXY2(int x,int y);
void Bend();
void Bend2();
void Boarder();
void Down();
void Down2();
void Left();
void Left2();
void Up();
void Up2();
void Print();
void Food();
int Score();
void Right();
void Right2();
void ExitGame();
int Scoreonly();
int Scoreonly2();

struct coordinate{
    int x;
    int y;
    int direction;
};

typedef struct coordinate coordinate;

coordinate head,bend[500],food,body[30],bend2[500],head2,body2[30];



int main()
{
    char key;
    Print();
    system("cls");
    load();
    length=5;                                  //snake length
    head.x=25;
    head.y=20;
    head.direction=RIGHT;
    
    length2=5;
    head2.x=25;
    head2.y=20;
    head2.direction=UP2;
    
    Boarder();
    Food();                           //to generate the initial food blob coordinates
    life=3;                            //number of lives the game player have
    bend[0]=head;
    bend2[0]=head2;
    Move();
	Move2();                        //initializing initial bend coordinate
    return 0;
}



void Move()
{
    int a,i;
    do{
        Food();
      //  fflush(stdin);
        len=0;
       for(i=0;i<30;i++)
        {
            body[i].x=0;
            body[i].y=0;
            if(i==length)
            break;
        }
        Delay(length);
        Boarder();
        if(head.direction==RIGHT)
            Right();
        else if(head.direction==LEFT)
            Left();
        else if(head.direction==DOWN)
            Down();
        else if(head.direction==UP)
            Up();
        ExitGame();
    }while(!kbhit());                        //if v entr any key othr than arrows thn game vil pause
    a=getch();
   if(a==27)
    {
        system("cls");
        exit(0);
    }

    key=getch();
    if((key==RIGHT&&head.direction!=LEFT&&head.direction!=RIGHT)||(key==LEFT&&head.direction!=RIGHT&&head.direction!=LEFT)||(key==UP&&head.direction!=DOWN&&head.direction!=UP)||(key==DOWN&&head.direction!=UP&&head.direction!=DOWN))
    {
        bend_no++;
        bend[bend_no]=head;
        head.direction=key;
        if(key==UP)
            head.y++; //first it was --

        if(key==DOWN)
            head.y--; //first it was ++

        if(key==RIGHT)
            head.x++;

        if(key==LEFT)
            head.x--;

        Move();
    }

  /*  else if(key==27)
    {
        system("cls");
        exit(0);
    }*/

    else
    {
        printf("\a");
        Move();
    }
}

void gotoxy(int x, int y)
{

 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void GotoXY(int x, int y)
{
    HANDLE a;
    COORD b;
   // fflush(stdout);
    b.X = x;
    b.Y = y;
    a = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(a,b);
 }

void load()
{
    int row,col,r,c,q;
     gotoxy(36,14);
    printf("HariGameloading...");
    gotoxy(30,15);
    for(r=1;r<=20;r++)
    {
            for(q=0;q<=100000000;q++);//to display the character slowly
                printf("%c",177);
    }
    getch();
}

void Down()
{
    int i;
    for(i=0;i<=(head.y-bend[bend_no].y)&&len<length;i++)
    {

        GotoXY(head.x,head.y-i);

        {

            if(len==0)

                printf("v");

            else

                printf("*");

        }

        body[len].x=head.x;

        body[len].y=head.y-i;

        len++;
   }
    Bend();
    if(!kbhit())
        head.y++;
}

void Delay(long double k)                     //delay can also be without any parameter
{
    Score();

    long double i;

    for(i=0;i<=(10000000);i++);
}

void ExitGame()
{
    int i,check=0;

    for(i=4;i<length;i++)   //starts with 4 because it needs minimum 4 element to touch its own body
    {
        if(body[0].x==body[i].x&&body[0].y==body[i].y)
        {
            check++;    //checks value increases as the coordinates of head is equal to any other body coordinate
        }

      //  if(i==length||check!=0)
        //    break;
    }

    if(head.x<=10||head.x>=70||head.y<=10||head.y>=30||check!=0)
    {

        life--;

        if(life>=0)

        {

            head.x=25;

            head.y=20;

            bend_no=0;

            head.direction=RIGHT;

            Move();

        }

        else
        {
            system("cls");

            printf("All lives Gone\nBetter Luck Next Time!\nPress any key to quit\n");
            record();
            exit(0);
        }

    }

}

void Food()
{
    if(head.x==food.x&&head.y==food.y)                              //head.x=25 head.y=20 in main
    {                                                                       //gotoxy(food.x,food.y) in boarder()

        length++;                   //if food snake are at same position then length of snake increases by 1 unit

    //    time_t a;

     //   a=time(0);

    //    srand(a);

        food.x=rand()%70;       //rand() is used to generate any random no. so that food gets displayed at random positions and according to
                                                                            //border x cannot be greater than 70 so %70 is used
        if(food.x<=10)
            food.x+=11;            // position less than according to border x lies between 10 and 70 so if food is at position less than 10 then it is
                                                                        //incremented by some value
        food.y=rand()%30;

        if(food.y<=10)              //similar to x
            food.y+=11;

    }

    else if(food.x==0)     //to create food for the first time

    {
        food.x=rand()%70;

        if(food.x<=10)
            food.x+=11;

        food.y=rand()%30;

        if(food.y<=10)
            food.y+=11;

    }



}

void Left()
{

    int i;
    for(i=0;i<=(bend[bend_no].x-head.x)&&len<length;i++)

    {

        GotoXY((head.x+i),head.y);



                if(len==0)
                    printf("<");

                else
                    printf("*");



        body[len].x=head.x+i;

        body[len].y=head.y;

        len++;

    }

    Bend();

    if(!kbhit())
        head.x--;
}

void Right()
{

    int i;                                                                //len=0 initialized in Move()

    for(i=0;i<=(head.x-bend[bend_no].x)&&len<length;i++)

    {

        //GotoXY((head.x-i),head.y);

        body[len].x=head.x-i;                                       //to move the snake forward in right direction

        body[len].y=head.y;                                          //x changes according to i but y remains same

        GotoXY(body[len].x,body[len].y);

        //{



            if(len==0)
                printf(">");

            else
                printf("*");

        //}

        /*body[len].x=head.x-i;

        body[len].y=head.y;*/

        len++;
    }

    Bend();

    if(!kbhit())
        head.x++;
}


void Bend()
{

    int i,j,diff;

    for(i=bend_no;i>=0&&len<length;i--)           //bend_no=0;

    {
                  //  printf("%d\n",bend[i].x);
                   // printf("%d\n",bend[i-1].x);      //bend[i-1].x=25
            if(bend[i].x==bend[i-1].x)

            {

                diff=bend[i].y-bend[i-1].y;

                if(diff<0){
                    for(j=1;j<=(-diff);j++)

                    {
                        body[len].x=bend[i].x;

                        body[len].y=bend[i].y+j;

                        GotoXY(body[len].x,body[len].y);

                        printf("*");

                        len++;

                        if(len==length)
                            break;

                    }
                }

                else if(diff>0)
                    for(j=1;j<=diff;j++)
                    {

                        /*GotoXY(bend[i].x,(bend[i].y-j));

                        printf("*");*/

                        body[len].x=bend[i].x;

                        body[len].y=bend[i].y-j;

                        GotoXY(body[len].x,body[len].y);

                        printf("*");

                        len++;

                        if(len==length)
                            break;

                    }

            }

        else if(bend[i].y==bend[i-1].y)
        {

            diff=bend[i].x-bend[i-1].x;

            if(diff<0)
                for(j=1;j<=(-diff)&&len<length;j++)

                {

                    /*GotoXY((bend[i].x+j),bend[i].y);

                    printf("*");*/

                    body[len].x=bend[i].x+j;

                    body[len].y=bend[i].y;

                    GotoXY(body[len].x,body[len].y);

                        printf("*");

                    len++;

                    if(len==length)
                            break;

                }

            else if(diff>0)

                for(j=1;j<=diff&&len<length;j++)

                {

                    /*GotoXY((bend[i].x-j),bend[i].y);

                    printf("*");*/

                    body[len].x=bend[i].x-j;

                    body[len].y=bend[i].y;

                    GotoXY(body[len].x,body[len].y);

                        printf("*");

                    len++;

                    if(len==length)
                        break;
                }
        }
    }
}


void Boarder()
{
    system("cls");

    int i;

    GotoXY(food.x,food.y);   /*displaying food*/

        printf("F");

    for(i=10;i<71;i++)
    {
        GotoXY(i,10);
            printf("!");
        GotoXY(i,30);
            printf("!");
    }

    for(i=10;i<31;i++)
    {
        GotoXY(10,i);
            printf("!");
        GotoXY(70,i);
        printf("!");
    }

}

void Print()
{    //GotoXY(10,12);

    printf("\tWelcome to the mini Snake game.(press any key to continue)\n");

   getch();

   // system("cls");

    printf("\tGame Play Instructions:\n");

    printf("\n-> Use arrow keys to move the snake.\n\n-> You will be provided food blobs at the several coordinates of the screen which you have to make your snake eat. Everytime you eat a food the length of the snake will be increased by 1 element and thus the score.\n\n-> Here you are provided with three lives. Your life will decrease as you hit the wall or snake's body.\n\n-> YOu can pause the game in its middle by pressing any key. To continue the paused game press any other key once again\n\n-> If you want to exit press esc. \n");

    printf("\n\nPress any key to continue...");

    if(getch()==27)
       exit(0);

}

void record(){

    char plname[20],nplname[20],cha,c;

    int i,j,px;

    FILE *info;

    info=fopen("record.txt","a+");

    getch();

    system("cls");

    printf("Enter your name\n");

    scanf("%s",plname);

    //************************

    for(j=0;plname[j]!='\0';j++){ //to convert the first letter after space to capital

    nplname[0]=toupper(plname[0]);

    if(plname[j-1]==' ')
    {

    nplname[j]=toupper(plname[j]);

    nplname[j-1]=plname[j-1];

    }

    else
        nplname[j]=plname[j];

    }

    nplname[j]='\0';

    //*****************************

    //sdfprintf(info,"\t\t\tPlayers List\n");

    fprintf(info,"Player Name :%s\n",nplname);

     //for date and time
   time_t mytime;

   mytime = time(NULL);

   fprintf(info,"Played Date:%s",ctime(&mytime));

      //**************************

      fprintf(info,"Player1_Score:%d\n",px=Scoreonly());//call score to display score
      

      //fprintf(info,"\nLevel:%d\n",10);//call level to display level

   // for(i=0;i<=50;i++)

    fprintf(info,"%c",'_');

    fprintf(info,"\n");

    fclose(info);

    printf("wanna see past records press 'y'\n");

    cha=getch();

    system("cls");

    if(cha=='y')
    {

    info=fopen("record.txt","r");

    do{

        putchar(c=getc(info));

        }while(c!=EOF);

        }

      fclose(info);

}

int Score()

{

    int score;

    GotoXY(20,8);

    score=length-5;

    printf("Player1_SCORE : %d",(length-5));

 //   score=length-5;

    GotoXY(50,8);

    printf("Life_P1 : %d",life);

    return score;

}



int Scoreonly()

{

int score=Score();

system("cls");

return score;

}



void Up()

{

    int i;

    for(i=0;i<=(bend[bend_no].y-head.y)&&len<length;i++)

    {

        GotoXY(head.x,head.y+i);

        {

            if(len==0)

                printf("^");

            else

                printf("*");

        }

        body[len].x=head.x;

        body[len].y=head.y+i;

        len++;

    }

    Bend();

    if(!kbhit())
        head.y--;
}


///Player2



void gotoxy2(int x, int y)
{

 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void GotoXY2(int x, int y)
{
    HANDLE a;
    COORD b;
   // fflush(stdout);
    b.X = x;
    b.Y = y;
    a = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(a,b);
 }


///////////////////////////


void Move2()
{
    int a,i;
    do{
        Food();
      //  fflush(stdin);
        len=0;
       for(i=0;i<30;i++)
        {
            body2[i].x=0;
            body2[i].y=0;
            if(i==length2)
            break;
        }
        Delay(length2);
        Boarder();
        if(head2.direction==RIGHT2)
            Right2();
        else if(head2.direction==LEFT2)
            Left2();
        else if(head2.direction==DOWN2)
            Down2();
        else if(head2.direction==UP2)
            Up2();
        ExitGame();
    }while(!kbhit());                        //if v entr any key2 othr than arrows thn game vil pause
    a=getch();
   if(a==27)
    {
        system("cls");
        exit(0);
    }

    key2=getch();
    if((key2==RIGHT2&&head2.direction!=LEFT2&&head2.direction!=RIGHT2)||(key2==LEFT2&&head2.direction!=RIGHT2&&head2.direction!=LEFT2)||(key2==UP2&&head2.direction!=DOWN2&&head2.direction!=UP2)||(key2==DOWN2&&head2.direction!=UP2&&head2.direction!=DOWN2))
    {
        bend_no++;
        bend2[bend_no]=head2;
        head2.direction=key2;
        if(key2==UP2)
            head2.y++; //first it was --

        if(key2==DOWN2)
            head2.y--; //first it was ++

        if(key2==RIGHT2)
            head2.x++;

        if(key2==LEFT2)
            head2.x--;

        Move2();
    }

  /*  else if(key2==27)
    {
        system("cls");
        exit(0);
    }*/

    else
    {
        printf("\a");
        Move2();
    }
}


void Down2()
{
    int i;
    for(i=0;i<=(head2.y-bend2[bend_no].y)&&len<length2;i++)
    {

        GotoXY2(head2.x,head2.y-i);

        {

            if(len==0)

                printf("v");

            else

                printf("#");

        }

        body2[len].x=head2.x;

        body2[len].y=head2.y-i;

        len++;
   }
    Bend2();
    if(!kbhit())
        head2.y++;
}
void Left2()
{

    int i;
    for(i=0;i<=(bend2[bend_no].x-head2.x)&&len<length2;i++)

    {

        GotoXY2((head2.x+i),head2.y);



                if(len==0)
                    printf("<");

                else
                    printf("#");



        body2[len].x=head2.x+i;

        body2[len].y=head2.y;

        len++;

    }

    Bend2();

    if(!kbhit())
        head2.x--;
}

void Right2()
{

    int i;                                                                //len=0 initialized in Move2()

    for(i=0;i<=(head2.x-bend2[bend_no].x)&&len<length2;i++)

    {

        //GotoXY2((head2.x-i),head2.y);

        body2[len].x=head2.x-i;                                       //to move the snake forward in right direction

        body2[len].y=head2.y;                                          //x changes according to i but y remains same

        GotoXY2(body2[len].x,body2[len].y);

        //{



            if(len==0)
                printf(">");

            else
                printf("#");

        //}

        /*body2[len].x=head2.x-i;

        body2[len].y=head2.y;*/

        len++;
    }

    Bend2();

    if(!kbhit())
        head2.x++;
}


void Bend2()
{

    int i,j,diff;

    for(i=bend_no;i>=0&&len<length2;i--)           //bend_no=0;

    {
                  //  printf("%d\n",bend[i].x);
                   // printf("%d\n",bend[i-1].x);      //bend[i-1].x=25
            if(bend2[i].x==bend2[i-1].x)

            {

                diff=bend2[i].y-bend2[i-1].y;

                if(diff<0){
                    for(j=1;j<=(-diff);j++)

                    {
                        body2[len].x=bend2[i].x;

                        body2[len].y=bend2[i].y+j;

                        GotoXY2(body2[len].x,body2[len].y);

                        printf("#");

                        len++;

                        if(len==length2)
                            break;

                    }
                }

                else if(diff>0)
                    for(j=1;j<=diff;j++)
                    {

                        /*GotoXY2(bend[i].x,(bend[i].y-j));

                        printf("*");*/

                        body2[len].x=bend2[i].x;

                        body2[len].y=bend2[i].y-j;

                        GotoXY2(body2[len].x,body2[len].y);

                        printf("#");

                        len++;

                        if(len==length2)
                            break;

                    }

            }

        else if(bend2[i].y==bend2[i-1].y)
        {

            diff=bend2[i].x-bend2[i-1].x;

            if(diff<0)
                for(j=1;j<=(-diff)&&len<length2;j++)

                {

                    /*GotoXY2((bend[i].x+j),bend[i].y);

                    printf("*");*/

                    body2[len].x=bend2[i].x+j;

                    body2[len].y=bend2[i].y;

                    GotoXY2(body2[len].x,body2[len].y);

                        printf("#");

                    len++;

                    if(len==length2)
                            break;

                }

            else if(diff>0)

                for(j=1;j<=diff&&len<length2;j++)

                {

                    /*GotoXY2((bend[i].x-j),bend[i].y);

                    printf("*");*/

                    body2[len].x=bend2[i].x-j;

                    body2[len].y=bend2[i].y;

                    GotoXY2(body2[len].x,body2[len].y);

                        printf("#");

                    len++;

                    if(len==length2)
                        break;
                }
        }
    }
}

void Up2()

{

    int i;

    for(i=0;i<=(bend2[bend_no].y-head2.y)&&len<length2;i++)

    {

        GotoXY2(head2.x,head2.y+i);

        {

            if(len==0)

                printf("^");

            else

                printf("#");

        }

        body2[len].x=head2.x;

        body2[len].y=head2.y+i;

        len++;

    }

    Bend2();

    if(!kbhit())
        head2.y--;
}

jeron1

Заметил много printf, может быть, вы переписываете одну змею с другой? то есть отображается последняя.

1 Ответов

Рейтинг:
2

Leo Chapiro

Я предполагаю, что в игре есть только функция Move (), и вы просто добавили Move2(). Вы вызываете эту функцию в своем main (), но она не будет выполнена:

int main()
{
	/* ... */
	Move();
	Move2();                        //initializing initial bend coordinate
	return 0;
}



Взгляните на Move (), он вызывает себя рекурсивно:

void Move()
{
	/* ... */

	key = getch();
	if (/* ... */)
	{
            /* ... */
	    Move();
	}
	else
	{
            printf("\a");
	    Move();
	}
}


Move2() никогда не получит шанса!


Member 11338695

так как же мы можем вызвать 2-ю змею для отображения??