C++ Visual Studio C++;在主函数末尾触发断点

C++ Visual Studio C++;在主函数末尾触发断点,c++,breakpoints,C++,Breakpoints,我和我的团队正在为我们的项目制作一个游戏,我一直遇到这个错误,经过一些测试,看起来它发生在主功能的末尾。我不知道这是怎么发生的,因为大部分代码都来自我们的老师,我们需要修复他故意设置的bug,并添加其他功能。 代码如下: #include <winuser.h> #include <iostream> #include <time.h> #include <conio.h> #include <thread> using namespa

我和我的团队正在为我们的项目制作一个游戏,我一直遇到这个错误,经过一些测试,看起来它发生在主功能的末尾。我不知道这是怎么发生的,因为大部分代码都来自我们的老师,我们需要修复他故意设置的bug,并添加其他功能。 代码如下:

#include <winuser.h>
#include <iostream>
#include <time.h>
#include <conio.h>
#include <thread>
using namespace std;

#define MAX_CAR 5
#define MAX_CAR_LENGTH 40
#define MAX_SPEED 3

POINT** X;
POINT Y;
int cnt = 0;
int MOVING;
int SPEED;
int HEIGHT_CONSOLE = 29, WIDTH_CONSOLE = 119;
bool STATE;

void FixConsoleWindow() {
    HWND consoleWindow = GetConsoleWindow();
    LONG_PTR style = GetWindowLongPtr(consoleWindow, GWL_STYLE);
    style = style & ~(WS_MAXIMIZEBOX) & ~(WS_THICKFRAME);
    SetWindowLongPtr(consoleWindow, GWL_STYLE, style);
}

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

void ResetData() {
    MOVING = 'D';
    SPEED = 1;
    Y = { 18,  19 };
    if (X == NULL) {
        X = new POINT * [MAX_CAR];
        for (int i = 0; i < MAX_CAR; i++) {
            X[i] = new POINT[MAX_CAR_LENGTH];
        }

        for (int i = 0; i < MAX_CAR; i++) {
            int temp = rand() % (WIDTH_CONSOLE - MAX_CAR_LENGTH) + 1;
            for (int j = 0; j < MAX_CAR_LENGTH; j++) {
                X[i][j].x = temp + j;
                X[i][j].y = 2 + 5 * i;
            }
        }
    }
}

void DrawBoard(int x, int y, int width, int height, int curPosX = 0, int curPosY = 0) {
    GotoXY(x, y);
    for (int i = 1; i < width; i++) {
        cout << 'X';
    }
    cout << 'X';
    GotoXY(x, height + y);
    for (int i = 1; i < width; i++) {
        cout << 'X';
    }
    cout << 'X';
    for (int i = y + 1; i < height + y; i++) {
        GotoXY(x, i);
        cout << 'X';
        GotoXY(x + width, i);
        cout << 'X';
    }
    GotoXY(curPosX, curPosY);
}

void StartGame() {
    system("cls");
    ResetData();
    DrawBoard(0, 0, WIDTH_CONSOLE, HEIGHT_CONSOLE);
    STATE = true;
}

void GabageCollect() {
    for (int i = 0; i < MAX_CAR; i++) {
        delete[] X[i];
    }
    delete[] X;
}

void ExitGame(HANDLE t) {
    GabageCollect();
    system("cls");
    TerminateThread(t, 0);
}

void PauseGame(HANDLE t) {
    SuspendThread(t);
}

void ProcessDeath() {
    STATE = false;
    GotoXY(0, HEIGHT_CONSOLE + 2);
    cout << "Dead, type y to continue or any key to exit";
}

void ProcessFinish(POINT& p) {
    SPEED == MAX_SPEED ? SPEED = 1 : SPEED++;
    p = { 18,19 };
    MOVING = 'D';
}

void DrawCars() {
    for (int i = 0; i < MAX_CAR; i++) {
        for (int j = 0; j < MAX_CAR_LENGTH; j++) {
            GotoXY(X[i][j].x, X[i][j].y);
            std::cout << '.';
        }
    }
}

void DrawPlayer(const POINT& p, char s) {
    GotoXY(p.x, p.y);
    cout << s;
}

bool IsImpact(const POINT& p) //d=Y.y     p = Y
{
    if (p.y == 1 || p.y == 19) return false;
    for (int i = 0; i < MAX_CAR; i++)
    {
        for (int j = 0; j < MAX_CAR_LENGTH; j++)
        {
            if (p.x == X[i][j].x && p.y == X[i][j].y) return true;
        }
    }
    return false;
}

void MoveCars(int x1, int y1)
{
    for (int i = 1; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            cnt++;
            for (int j = 0; j < MAX_CAR_LENGTH - 1; j++)
            {
                X[i][j] = X[i][j + 1];
            }
            X[i][MAX_CAR_LENGTH - 1].x + 1 == WIDTH_CONSOLE + x1 ? X[i][MAX_CAR_LENGTH - 1].x = 1 : X[i][MAX_CAR_LENGTH - 1].x++;
        } while (cnt < SPEED);
    }
    for (int i = 0; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            cnt++;
            for (int j = MAX_CAR_LENGTH - 1; j > 0; j--)
            {
                X[i][j] = X[i][j - 1];
            }
            X[i][0].x - 1 == 0 + x1 ? X[i][0].x = WIDTH_CONSOLE + x1 - 1 : X[i][0].x--;
        } while (cnt < SPEED);
    }
}


void EraseCars()
{
    for (int i = 0; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            GotoXY(X[i][MAX_CAR_LENGTH - 1 - cnt].x, X[i][MAX_CAR_LENGTH - 1 - cnt].y);
            cout << " ";
            cnt++;
        } while (cnt < SPEED);
    }
    for (int i = 1; i < MAX_CAR; i += 2)
    {
        cnt = 0;
        do
        {
            GotoXY(X[i][0 + cnt].x, X[i][0 + cnt].y);
            cout << " ";
            cnt++;
        } while (cnt < SPEED);
    }
}


void MoveRight()
{
    if (Y.x < WIDTH_CONSOLE - 1)
    {
        DrawPlayer(Y, ' ');
        Y.x++;
        DrawPlayer(Y, 'Y');
    }
}

void MoveLeft()
{
    if (Y.x > 1)
    {
        DrawPlayer(Y, ' ');
        Y.x--;
        DrawPlayer(Y, 'Y');
    }
}

void MoveDown()
{
    if (Y.y < HEIGHT_CONSOLE - 1)
    {
        DrawPlayer(Y, ' ');
        Y.y++;
        DrawPlayer(Y, 'Y');
    }
}

void MoveUp()
{
    if (Y.y > 1)
    {
        DrawPlayer(Y, ' ');
        Y.y--;
        DrawPlayer(Y, 'Y');
    }
}

void SubThread()
{
    while (1)
    {
        if (STATE)
        {
            switch (MOVING)
            {
            case 'A':
                MoveLeft();
                break;
            case 'D':
                MoveRight();
                break;
            case'W':
                MoveUp();
                break;
            case'S':
                MoveDown();
                break;
            }
            MOVING = ' ';
            EraseCars();
            MoveCars(0, 0);
            DrawCars();
            if (IsImpact(Y))
            {
                ProcessDeath();
            }
            if (Y.y == 1)
            {
                ProcessFinish(Y);
                Sleep(50);
            }
        }
    }
}
void main()
{
    int temp;
    FixConsoleWindow();
    srand(time(NULL));
    StartGame();
    thread t1(SubThread);
    while (1)
    {
        temp = toupper(_getch());
        if (STATE == 1)
        {
            EraseCars();
            if (temp == 27)
            {
                ExitGame(t1.native_handle());
                break;
            }
            else if (temp == 'P')
            {
                PauseGame(t1.native_handle());
                temp = toupper(_getch());
                if (temp == 'B')
                    ResumeThread((HANDLE)t1.native_handle());
            }
            else
            {
                if (temp == 'D' || temp == 'A' || temp == 'W' || temp == 'S')
                {
                    MOVING = temp;
                }
            }
        }
        else
        {
            if (temp == 'Y') StartGame();
            else
            {
                ExitGame(t1.native_handle());
                break;
            }
        }
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义最大车辆5
#定义最大车长40
#定义最大速度3
点**X;
Y点;
int-cnt=0;
int移动;
整数速度;
内部高度控制台=29,宽度控制台=119;
布尔州;
void FixConsoleWindow(){
HWND consoleWindow=GetConsoleWindow();
LONG\u PTR style=GetWindowLongPtr(控制台窗口,GWL\u样式);
样式=样式&~(WS\u MAXIMIZEBOX)和~(WS\u THICKFRAME);
SetWindowLongPtr(控制台窗口、GWL_样式、样式);
}
void GotoXY(整数x,整数y){
合作社;
坐标X=X;
坐标Y=Y;
设置控制台或位置(GetStdHandle(标准输出句柄),坐标);
}
void ResetData(){
移动='D';
速度=1;
Y={18,19};
如果(X==NULL){
X=新点*[MAX_CAR];
对于(int i=0;i
thread t1(SubThread);
但你没有打电话,也不是为了那个

这会导致在调用对象时调用
std::terminate()
(程序中止)

如果要等待线程结束,请调用
t1.join()
;如果要让线程在从
main()
函数返回之前自由运行,请调用
t1.detach()


另一个选项是直接使用而不是
std::thread
来创建线程。这可能会更好,因为您正在使用
t1.native\u handle()
对线程进行操作。

“此错误”--什么错误?哦,对了,我忘了添加错误图片,给我一分钟好的,我刚刚添加了错误的图像链接。你能告诉我在哪里可以添加分离功能吗?我对整个线程主题都是新手