Lỗi trong code C++ game rắn săn mồi trên console

Chào mọi người :grin: .
Hiện tại em đang thử làm game snake huyền thoại trên console. Em biết console không thích hợp với việc làm game nhưng hiện tại em muốn làm để chạy được trên console rồi mới thêm thư viện đồ họa vào mặc dù mỗi khi cls nó nháy khá khó chịu
Hiện em đang làm phần ăn thức ăn thì không hiểu sao chương trình chạy lại bị crash
Ý tưởng của em cho phần ăn thức ăn là:

  • Tăng độ dài của rắn.
  • Lấy tọa độ của thức ăn làm tọa độ đầu rắn, tọa độ các đốt lưng của rắn thì lấy của đốt trước đó.
  • Random tọa độ thức ăn mới.

Tuy nhiên sau khi chạy xong hàm eat_food rồi tiếp tục đến khi quay lại vòng lặp mới thì lại phát sinh lỗi và bị crash:

Hình ảnh lỗi

Em mới chỉ làm bản test nên code không hoàn chỉnh lắm. Khi demo được trên console em sẽ chia file rồi thêm các thứ vào sau.

Code của em
#include <iostream>
#include <conio.h>
#include <ctime>
#include <windows.h>
#include <cstdbool>
#include <vector>
#include <cmath>

using namespace std;


class Point{
public:
    vector<int> x;
    vector<int> y;
    int lenght;
    Point(){
        //Phần đầu
        x.push_back(10 );
        y.push_back(10);
        //Phần thân
        x.push_back(9);
        y.push_back(10);
        //Cái đuôi
        x.push_back(8);
        y.push_back(10);
        //Độ dài
        lenght = 3;
    }

};



class Food{
public:
    int x ;
    int y;
    Food(){
        x = rand() % 20 ;
        y = rand() % 20;
    }
};

bool checkPoint(vector<int> x , vector<int> y , int i , int j){//check vi tri cua snake
    for(unsigned int k = 0 ; k < x.size()  ; k++){
        if(x[k] == j && y[k] == i) return true;
    }
    return false;
}

void draw(vector<int> x , vector <int> y, Food food){//draw screen
    for(int i = 0 ; i < 20 ; i ++){
        cout << '|';
        for(int j = 0 ; j < 20 ; j++ ){
                if(checkPoint(x , y , i , j))    cout << " A ";
                else if (food.x == j && food.y == i)    cout <<" O ";
                else cout << "   ";
        }
        cout << '|';
        cout << endl;
    }

}

void move_when_controled(Point &snake){
    for(int i = snake.x.size() ; i > 0 ; i-- ){
        snake.x[i] = snake.x[i - 1];
        snake.y[i] = snake.y[i - 1];
    }

}

void eat_food(Food &food , Point &snake){
    if(snake.x[0] == food.x && snake.y[0] == food.y ){
            snake.x.push_back(1);//Tang do dai
            snake.y.push_back(1);
            for(int i = snake.x.size() ; i > 0 ; i-- ){
                snake.x[i] = snake.x[i - 1];
                snake.y[i] = snake.y[i - 1];
            }
            snake.x[0] = food.x;
            snake.y[0] = food.y;

            food.x = rand() % 20;
            food.y = rand() % 20;

            snake.lenght++;
        }
}

void control(Point &snake){
    char a = getch();

    system("cls");
    switch(a){
        case 72:{//di len
            move_when_controled(snake);
            snake.y[0]--;
            if(snake.y[0] < 0) snake.y[0] = 19;
            break;
        }
        case 80:{//di xuong
            move_when_controled(snake);
            snake.y[0]++;
            if(snake.y[0] > 19) snake.y[0] = 0;
            break;
        }
        case 77:{//sang phai
            move_when_controled(snake);
            snake.x[0]++;
            if(snake.x[0] > 19) snake.x[0] = 0;
            break;
        }
        case 75:{//sang trai
            move_when_controled(snake);
            snake.x[0]--;
            if(snake.x[0] < 0) snake.x[0] = 19;
        }
    }
}

void auto_move(){

}

void Game_over(){
//Snake eats itself



}

void MENU(){

}

int main()
{
    srand(time(0));
    Point snake;
    Food food;
    while(1){
        control(snake);

        eat_food(food , snake);//???

        draw(snake.x , snake.y , food);

        cout << snake.lenght;

        fflush(stdin);
        }

    return 0;
}

Mong mọi người có thể chỉ lỗi giúp em. Cảm ơn mọi người đã đọc ạ.

3 Likes

Nhìn class Point của em anh ko biết debug ra sao luôn, chỉ còn cách ngồi vẽ lại từng điểm cho hiểu logic em làm, nhưng mà hiện tại anh ko dc rảnh :stuck_out_tongue:

Nếu em muốn làm game đơn giản, em có thể thử framework SFML và bắt đầu học lập trình đồ họa trên đó luôn.

6 Likes

Sorry lười đọc code người khác quá. Nhưng mình có thể chỉ cách đơn giản hơn cho eats food. Khi head dính food thì bạn chỉ cần push back cái đuôi vào tọa độ ngoài màn hình là dc ví dụ (-10,-10) xong khi move thì cái đuôi tự đúng vị trí, như thế phần logic sẽ dễ hơn rất nhiều. Với cả thay vì 2 cái vectors thì 1 cái vector chứa (x, y) thì vừa dễ đọc, vừa dễ chống sai sót ko nên xảy ra.

5 Likes

Thật lòng cảm ơn anh vì lời khuyên này nhưng hiện tại thì em đã lỡ làm trên console nên em muốn hoàn thành ít nhất là 1 phần nào đó gọi là chạy được thôi cũng được( tại để dở lâu ngày thấy khó chịu sao ấy mà xoá đi thì không muốn nên hay cố làm nốt )

Cái class Point này đúng ra là em đặt sai tên. Do ban đầu em định tạo class Point để kiểm soát các điểm nhưng rồi lại sửa để tạo nên obj snake.
Lẽ ra thì các biến nên để private nhưng do chỉ là test nên em để public cho dễ sử dụng đỡ phải thêm mấy hàm get.
Trong constructer các giá trị gán mặc định đó là toạ độ 3 điểm bắt đầu của thân rắn ạ. Có lẽ lát em sẽ ngồi chỉnh lại code 1 tí để mọi người dễ nhìn hơn. Xin lỗi vì nhờ mọi người mà lại để cái code lung tung khó hiểu tại lúc em đăng vội rồi tắt máy sợ mẹ chửi nên em chưa chỉnh sửa chu đáo được(quên gắn tag với category nữa chứ🤦)
Cảm ơn anh đã góp ý ạ. :grin:

1 Like

Anh nhắc em mới nhớ ra cái vector lồng nhau. Em sẽ chỉnh sửa lại để dễ cho việc đọc và hiểu code.

Em cảm ơn anh về gợi ý này nhưng anh có thể gợi ý cho em 1 chút nữa về việc move cái đuôi về lại ban vị trí ban đầu như thế nào được không ạ. Theo ý hiểu của em thì em sẽ giảm tất cả các giá trị toạ độ trong đuôi đi 1 lượng nhất định sao cho nó out ra ngoài màn hình rồi sau khi ăn xong lại cộng 1 lượng và để đạt được giá trị mới. Em hiểu thế đúng không ạ.
Cảm ơn anh đã góp ý. :grin:

Có lời khen cho em đã hoàn thành project này, nhưng mà anh khuyên là làm xong rồi thôi bỏ luôn đi, vì em ko thiết kế theo design của game nên 1 hồi là rối nùi luôn :stuck_out_tongue:
Em có thể học logic của game design thông qua framework anh chỉ trên, có nhiều sách mà em có thể tìm trên mạng. Hoặc nếu em thích làm game 3D đơn giản thì qua học SDL, rồi từ từ nâng cấp dần nếu em thích làm game.

3 Likes

Em cảm ơn anh nhưng có lẽ em sẽ thử cố thêm khoảng 1 hoặc 2 ngày nữa nếu không được thì sẽ bỏ theo như lời khuyên của anh.

Em cũng mới bắt đầu bập bõm bước chân vào việc học các thư viện không phải thư viện chuẩn nhưng hơi căng thẳng nên em quay lại những cái này thư giãn 1 chút rồi học tiếp(cũng không hẳn là thư giãn nhưng gọi là lấy cảm hứng lại để tiếp tục :grin:)

1 Like

Index Out of bound error

6 Likes

Đúng rồi em quên không trừ 1 🤦. Cảm ơn anh nhiều ạ. Em xin phép tick solution reply của anh. :grin:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?