30/09/2018, 19:25

Kiểm tra giúp em bài code trò chơi con rắn :)

Theo sự hướng dẫn của thầy em có viết được bài code game con rắn nhưng vẫn chưa hoàn thiện. Điểm số bị in lung tung với con rắn không chết khi bị đâm vào tường.
Với lại em muốn thêm phần độ khó ví dụ chơi được 1000 điểm thì con rắn di chuyển nhanh hơn thì làm thế nào ạ?
Code của e, mấy a/c xem qua rồi chỉnh sửa giúp e nhé. Hướng dẫn thêm cho e với ạ

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MaxH    80
#define MaxW    20
void gotoxy( int column, int line )
  {
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord
    );
  }

int wherex()
  {
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  COORD  result;
  if (!GetConsoleScreenBufferInfo(
         GetStdHandle( STD_OUTPUT_HANDLE ),
         &csbi
         ))
    return -1;
  return result.X;
  }

int wherey()
  {
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  COORD  result;
  if (!GetConsoleScreenBufferInfo(
         GetStdHandle( STD_OUTPUT_HANDLE ),
         &csbi
         ))
    return -1;
  return result.Y;
  }
typedef struct snake
{
    int x;
    int y;
};

void DrawSnake(int snakeLength, snake Toado[])
{
    for (int i=0;i<snakeLength;i++)
    {
        gotoxy(Toado[i].x,Toado[i].y);
        printf("*");
    }
}
int CheckDie(int snakeLength, snake Toado[])
{
      for (int i=1;i<snakeLength;i++)
            if (Toado[0].x==Toado[i].x&&Toado[0].y==Toado[i].y)
            {
                system("CLS");
                gotoxy(25,1);
                printf("Game Over !");
                return (1);
            }
        return (0);
}
void Deltail(int snakeLength,snake Toado[])
{
    gotoxy(Toado[snakeLength-1].x,Toado[snakeLength-1].y);
    printf(" ");
}
void init(int &snakeLength,snake Toado[1000])
{
        Toado[0].x=20; Toado[0].y=2;
        Toado[1].x=19; Toado[1].y=2;
        Toado[2].x=18; Toado[2].y=2;
        Toado[3].x=17; Toado[3].y=2;
        Toado[4].x=16; Toado[4].y=2;
        Toado[5].x=15; Toado[5].y=2;
        snakeLength=5;
        DrawSnake(snakeLength,Toado);
        gotoxy(25,23);
        printf("THE SNAKE GAME");
        gotoxy(25,24);
        printf("Project by 15520923 & 15520922");
}
void DrawBox()
{

    for (int i=1;i<=19;i++)
    {
        gotoxy(9,i); //Hang trai
        printf("%c
",186);
        gotoxy(80,i); //Hang phai
        printf("%c
",186);

    }
    for (int i=1;i<=72;i++)
    {
        gotoxy(i+8,20); // Hang duoi
        printf("%c",205);
        gotoxy(i+8,1); // Hang tren
        printf("%c",205);
    }
    gotoxy(9,1);
    printf("%c",201);
    gotoxy(9,20);
    printf("%c",200);
    gotoxy(80,1);
    printf("%c",187);
    gotoxy(80,20);
    printf("%c",188);
}
int main()
{
    snake Toado[1000], NewPos, food;
    int snakeLength, i, Score=0, Time=125;
    bool Check;
    unsigned char c;
        srand(time(NULL));
        Check=false;
        init(snakeLength,Toado);
        DrawBox();
        gotoxy(90,4);
        printf("Score: ");
    while (1)
    {

          while (Check==false)
            {
                Check=true;
                food.x=rand()%69+10;
                food.y=rand()%17+2;
                for (i=0;i<snakeLength;i++)
                    if (Toado[i].x==food.x&&Toado[i].y==food.y) Check==false;
            }
            if (Check==true)
            {
                    gotoxy(food.x,food.y);
                    printf("*");
            }

			if(kbhit())
				c=getch();
           if (c==224)
           		c=getch();

            {

                    if (c==72)//y-1
                    {
                        Deltail(snakeLength,Toado);
                        NewPos.x=Toado[0].x;
                        NewPos.y=Toado[0].y;
                            for (i=snakeLength-1;i>0;i--)
                            {
                                Toado[i].x=Toado[i-1].x;
                                Toado[i].y=Toado[i-1].y;
                            }
                            Toado[0].x=NewPos.x; Toado[0].y=NewPos.y-1;
                    }
                    else if (c==80)//y+1
                    {
                        Deltail(snakeLength,Toado);
                        NewPos.x=Toado[0].x;
                        NewPos.y=Toado[0].y;
                        for (i=snakeLength-1;i>0;i--)
                        {Toado[i].x=Toado[i-1].x; Toado[i].y=Toado[i-1].y;}
                        Toado[0].x=NewPos.x; Toado[0].y=NewPos.y+1;
                    }
                    else if (c==75)//x-1
                    {
                        Deltail(snakeLength,Toado);
                        NewPos.x=Toado[0].x;
                        NewPos.y=Toado[0].y;
                        for (i=snakeLength-1;i>0;i--)
                        {Toado[i].x=Toado[i-1].x; Toado[i].y=Toado[i-1].y;}
                        Toado[0].x=NewPos.x-1; Toado[0].y=NewPos.y;
                    }
                    else if (c==77)//x+1
                    {
                        Deltail(snakeLength,Toado);
                        NewPos.x=Toado[0].x;
                        NewPos.y=Toado[0].y;
                        for (i=snakeLength-1;i>0;i--)
                        {Toado[i].x=Toado[i-1].x; Toado[i].y=Toado[i-1].y;}
                        Toado[0].x=NewPos.x+1; Toado[0].y=NewPos.y;
                    }
            if (Toado[0].x>MaxH-1) Toado[0].x=10;
            if (Toado[0].x<10) Toado[0].x=MaxH-1;
            if (Toado[0].y>=MaxW) Toado[0].y=2;
            if (Toado[0].y<2) Toado[0].y=MaxW-1;
            if (CheckDie(snakeLength,Toado)==1) return (0);
            DrawSnake(snakeLength,Toado);
            if (Toado[0].x==food.x&&Toado[0].y==food.y)
            {
                Check=false;
                snakeLength++;
                Toado[snakeLength].x=Toado[snakeLength-1].x;
                Toado[snakeLength].y=Toado[snakeLength-1].y;
                Score++;
                gotoxy(99,4);
                printf("%d",Score*100);
            }
			Sleep(Time);
		}
    }
}
Le Hoai viết 21:39 ngày 30/09/2018

Oạch. Bạn cho code vào tag đi chứ thế này ai đọc nổi

Minh Tú viết 21:36 ngày 30/09/2018

Minh mới vào nhóm nên k rành. Cho vào tag làm như thế nào bạn

viết 21:32 ngày 30/09/2018

để con rắn di chuyển nhanh hơn thì có thể giảm thời gian Sleep xuống.

nhưng mà làm vậy ko hay. Muốn làm đúng thì phải có 1 cái clock đếm thời gian từ lúc bắt đầu. Đặt quãng thời gian giữa 2 lần con rắn di chuyển là 1 biến x nào đó. Sau mỗi vòng lặp của thì lại tính quãng thời gian từ vòng lặp trước đó, gọi là timedelta chẳng hạn, rồi trừ quãng thời gian này cho biến x đó. Nếu x <= 0 thì con rắn di chuyển, và set lại giá trị ban đầu cho x.

ví dụ:

double snakeFixedMoveTime = 1.0; //thời gian giữa 2 lần di chuyển là 1 giây 
double snakeMoveTime = snakeFixedMoveTime;

while (true) //main loop
{
    // get timedelta
    timedelta = timeSinceLastFrame();
    restartClock();

    //handle input

    //handle game logic
    snakeMoveTime -= timedelta;
    if (snakeMoveTime <= 0)
    {
        moveSnake();
        while (snakeMoveTime <= 0)
            snakeMoveTime += snakeFixedMoveTime;
    }
    
    //render

    //control frame rate 
}

có cái timedelta này rồi thì có thể tạo thêm 1 biến nữa là timescale:

double timescale = 1.0;

while (true) //main loop
{
    // get timedelta
    timedelta = timeSinceLastFrame() * timescale;
    restartClock();

với timescale thì timedelta có thể “giãn nở” tùy ý (timescale = 1.0 tức là thời gian bình thường). Muốn cho con rắn chạy nhanh hơn thì chỉ cần tăng giá trị timescale lên, ví dụ chạy nhanh hơn gấp 2 lần thì gọi timescale = 2.0; là xong. Muốn con rắn chạy chậm gấp 2 lần thì gọi timescale = 0.5;. Muốn con rắn dừng di chuyển hẳn thì gán timescale = 0;, có thể sử dụng để pause game, nhưng phải kết hợp thêm với vài dòng code ngăn ko xử lý input nữa khi timescale == 0.

Minh Tú viết 21:30 ngày 30/09/2018

Hơi bị khó hiểu chút :((
À còn cái in điểm nữa. Bạn chạy code mình r xem nó lỗi gì mà cứ in điểm lung tung

Bài liên quan
0