C++ и SDL TicTacToe - изменение поворотов

У меня проблемы с переключением между игроками в моей игре. Кажется, это происходит в любом порядке, когда я запускаю его. И из-за этого текст, который показывает, чья это очередь, перепутан.

            #include <iostream>
            #include "SDLSetup.h"
            using namespace std;

            int p = 1;

            void Player1()
            {
                Player = TTF_RenderText_Solid(font, "Player 1", textColor);
                apply_surface(0, 630, Player, screen);
                SDL_Flip(screen);
                p = 2;
            }

            void Player2()
            {
                Player = TTF_RenderText_Solid(font, "Player 2", textColor);
                apply_surface(0, 630, Player, screen);
                SDL_Flip(screen);
                p = 1;
            }

            int main(int argc, char* args[])
            {
                bool quit = false;

if(init() == false)
    return 1;

if(load_files() == false)
    return 1;

apply_surface(0, 0, board, screen);

if(SDL_Flip(screen) == -1)
            return 1;
turn:

do{
    if(SDL_PollEvent(&event))
    {
        if(event.type == SDL_QUIT)
            quit=true;
    }

        if(event.type == SDL_MOUSEBUTTONDOWN)
                {
                    if(event.button.button == SDL_BUTTON_LEFT)
                    {
                        //Top Left
                        if(event.button.x < 175 && event.button.y < 175)
                        {
                            if(p == 1)
                            {
                                apply_surface(45, 40, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(45, 40, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Top Middle
                        else if(event.button.x > 175 && event.button.x < 375 && event.button.y < 175)
                        {
                            if(p == 1)
                            {
                                apply_surface(250, 40, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(250, 40, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Top Right
                        else if(event.button.x > 375 && event.button.x < 600 && event.button.y < 175)
                        {
                            if(p == 1)
                            {
                                apply_surface(450, 40, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(450, 40, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Middle Left
                        else if(event.button.x < 175 && event.button.y > 175 && event.button.y < 380)
                        {
                            if(p == 1)
                            {
                                apply_surface(45, 240, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(45, 235, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Center
                        else if(event.button.x > 175 && event.button.x < 375 && event.button.y > 175 && event.button.y < 380)
                        {
                            if(p == 1)
                            {
                                apply_surface(250, 235, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(250, 235, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Middle Right
                        else if(event.button.x > 375 && event.button.x < 600 && event.button.y >175 && event.button.y < 380)
                        {
                            if(p == 1)
                            {
                                apply_surface(450, 235, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(450, 235, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Bottom Left
                        else if(event.button.x < 175 && event.button.y > 380 && event.button.y < 600)
                        {
                            if(p == 1)
                            {
                                apply_surface(45, 450, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(45, 450, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Bottom Middle
                        else if(event.button.x > 175 && event.button.x < 375 && event.button.y > 380 && event.button.y < 600)
                        {
                            if(p == 1)
                            {
                                apply_surface(250, 450, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(250, 450, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }
                        //Bottom Right
                        else if(event.button.x > 375 && event.button.x < 600 && event.button.y > 380 && event.button.y < 600)
                        {
                            if(p == 1)
                            {
                                apply_surface(450, 450, X, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                            else if(p == 2)
                            {
                                apply_surface(450, 450, O, screen);
                                SDL_Flip(screen);
                                goto turn;
                            }
                        }

                    }
                }

        if(p == 1)
            Player1();
        else
            Player2();

} while(quit == false);




clean_up();

return 0;
            }

1 ответ

Зло goto turn; вызывает проблему. Код, который переключает игроков, не может быть выполнен. В вашем учебнике по C++ найдите ключевые слова continue а также break, как они относятся к вашему do-while петля.

Например, вы можете заменить

goto turn;

с

continue;

Некоторые предложения:

  1. Сначала определите квадрат доски, другого кода нет.
  2. Может быть switch утверждение для каждой позиции доски (например, 0 .. 8).

Упрощенное и правильное отступление покажет вам, почему в нижней части функции возникает проблема при переключении игроков.

Эта проблема может быть легко решена с помощью отладчика.

Другие вопросы по тегам