SFML community forums

Help => Graphics => Topic started by: Hair_FTW on September 06, 2011, 11:43:00 pm

Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: Hair_FTW on September 06, 2011, 11:43:00 pm
Hello.

I Programmed a Tic Tac Toe game using C++ and SFML. It's very simples, 2 players, no menu no sound. And i didn't use oop.

The game on Debug runs fine, but on Release doesn't. As soon as the mouse cursor runs over the game window a wild "X" appears. After that, it works fine. Why is that happening? I'm using Code::Blocks.

The game uses 4 800x800 images (win, loose, tie and the board) and 2 200x200 (circle and cross). Here is the code (i'm sorry for the mess, it's my first "project", also sorry for the variable names, i'm portuguese).

Code: [Select]
///Headers///
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>

///Namespaces///
using namespace std;
using namespace sf;

int main ()
{

///Variables///

char tabuleirodejogo [3][3];
for (int i=0; i<3; i++)
    {
        for (int u=0; u<3; u++)
            {
                tabuleirodejogo[i][u] = 'n';
            }
    }

///Window///
RenderWindow Janela (VideoMode(800,800,32), "Tic Tac Toe");

///Images///
Image Tabuleiro, Jogador_X, Jogador_O, Ganhou_X, Ganhou_O, Empate;

if (!Tabuleiro.LoadFromFile("tabuleiro.jpg"))
        return EXIT_FAILURE;

if (!Jogador_X.LoadFromFile("Jogador X.png"))
        return EXIT_FAILURE;

if (!Jogador_O.LoadFromFile("Jogador O.png"))
        return EXIT_FAILURE;

if (!Ganhou_X.LoadFromFile("Ganhou X.png"))
        return EXIT_FAILURE;

if (!Ganhou_O.LoadFromFile("Ganhou O.png"))
        return EXIT_FAILURE;

if (!Empate.LoadFromFile("Empate.png"))
        return EXIT_FAILURE;

Jogador_X.SetSmooth(false);
Jogador_O.SetSmooth(false);

///Sprites///
Sprite tabuleiro;
tabuleiro.SetImage(Tabuleiro);
Janela.Draw(tabuleiro);

Sprite jx;
jx.SetImage(Jogador_X);

Sprite jo;
jo.SetImage(Jogador_O);

Sprite go(Ganhou_O);
Sprite gx(Ganhou_X);
Sprite empate(Empate);

///Loop///
    while (Janela.IsOpened())
        {
            ///Player X///
            while (1)
            {
                Event jogarx;
                (Janela.GetEvent(jogarx));

                if (jogarx.Type == Event::Closed)
                    Janela.Close();

                if ((tabuleirodejogo[0][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y < 245))
                    {
                    tabuleirodejogo[0][0] = 'x';
                    jx.SetPosition(35.f,28.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[0][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 265) && (jogarx.MouseButton.Y < 250) && (jogarx.MouseButton.X < 520))
                    {
                    tabuleirodejogo[0][1] = 'x';
                    jx.SetPosition(301.f,28.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[0][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.Y < 250) && (jogarx.MouseButton.X > 536))
                    {
                    tabuleirodejogo[0][2] = 'x';
                    jx.SetPosition(562.f,28.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[1][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][0] = 'x';
                    jx.SetPosition(35.f,290.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[1][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 265) && (jogarx.MouseButton.X < 520) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][1] = 'x';
                    jx.SetPosition(301.f,290.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[1][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 536) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][2] = 'x';
                    jx.SetPosition(562.f,290.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[2][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][0] = 'x';
                    jx.SetPosition(35.f,555.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[2][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 270) && (jogarx.MouseButton.X < 520) && (jogarx.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][1] = 'x';
                    jx.SetPosition(301.f,555.f);
                    Janela.Draw(jx);
                    break;
                    }

                if ((tabuleirodejogo[2][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 535) && (jogarx.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][2] = 'x';
                    jx.SetPosition(562.f,555.f);
                    Janela.Draw(jx);
                    break;
                    }

                Janela.Display();
            }

            ///Player X won///
            if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[0][1] == 'x' && tabuleirodejogo[0][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;

            }
            else if (tabuleirodejogo[1][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[1][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[2][0] == 'x' && tabuleirodejogo[2][1] == 'x' && tabuleirodejogo[2][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[1][0] == 'x' && tabuleirodejogo[2][0] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][1] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[2][1] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][2] == 'x' && tabuleirodejogo[1][2] == 'x' && tabuleirodejogo[2][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[2][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[2][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[0][2] == 'x')
            {
                Janela.Draw(gx);
                Janela.Display();
                Sleep(3.f);
                break;
            }

            ///Tie///
            else if(tabuleirodejogo[0][0] != 'n' && tabuleirodejogo[0][1] != 'n' && tabuleirodejogo[0][2] != 'n' && tabuleirodejogo[1][0] != 'n' && tabuleirodejogo[1][1] != 'n' && tabuleirodejogo[1][2] != 'n' && tabuleirodejogo[2][0] != 'n' && tabuleirodejogo[2][1] != 'n' && tabuleirodejogo[2][2] != 'n')
            {
                Janela.Draw(empate);
                Janela.Display();
                Sleep(3.f);
                break;
            }

            ///Player O///
            while (1)
            {
                Event jogaro;
                (Janela.GetEvent(jogaro));

                if (jogaro.Type == Event::Closed)
                    Janela.Close();

                if ((tabuleirodejogo[0][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y < 245))
                    {
                    tabuleirodejogo[0][0] = 'o';
                    jo.SetPosition(35.f,28.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[0][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 265) && (jogaro.MouseButton.Y < 250) && (jogaro.MouseButton.X < 520))
                    {
                    tabuleirodejogo[0][1] = 'o';
                    jo.SetPosition(301.f,28.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[0][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.Y < 250) && (jogaro.MouseButton.X > 536))
                    {
                    tabuleirodejogo[0][2] = 'o';
                    jo.SetPosition(562.f,28.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[1][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][0] = 'o';
                    jo.SetPosition(35.f,290.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[1][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 265) && (jogaro.MouseButton.X < 520) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][1] = 'o';
                    jo.SetPosition(301.f,290.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[1][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 536) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
                    {
                    tabuleirodejogo[1][2] = 'o';
                    jo.SetPosition(562.f,290.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[2][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][0] = 'o';
                    jo.SetPosition(35.f,555.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[2][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 270) && (jogaro.MouseButton.X < 520) && (jogaro.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][1] = 'o';
                    jo.SetPosition(301.f,555.f);
                    Janela.Draw(jo);
                    break;
                    }

                if ((tabuleirodejogo[2][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 535) && (jogaro.MouseButton.Y > 520))
                    {
                    tabuleirodejogo[2][2] = 'o';
                    jo.SetPosition(562.f,555.f);
                    Janela.Draw(jo);
                    break;
                    }

                Janela.Display();
            }

            ///Player O Won///
            if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[0][1] == 'o' && tabuleirodejogo[0][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[1][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[1][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[2][0] == 'o' && tabuleirodejogo[2][1] == 'o' && tabuleirodejogo[2][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[1][0] == 'o' && tabuleirodejogo[2][0] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][1] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[2][1] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][2] == 'o' && tabuleirodejogo[1][2] == 'o' && tabuleirodejogo[2][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[2][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }
            else if (tabuleirodejogo[2][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[0][2] == 'o')
            {
                Janela.Draw(go);
                Janela.Display();
                Sleep(3.f);
                break;
            }

            ///Tie///
            else if(tabuleirodejogo[0][0] != 'n' && tabuleirodejogo[0][1] != 'n' && tabuleirodejogo[0][2] != 'n' && tabuleirodejogo[1][0] != 'n' && tabuleirodejogo[1][1] != 'n' && tabuleirodejogo[1][2] != 'n' && tabuleirodejogo[2][0] != 'n' && tabuleirodejogo[2][1] != 'n' && tabuleirodejogo[2][2] != 'n')
            {
                Janela.Draw(empate);
                Janela.Display();
                Sleep(3.f);
                break;
            }
        }



    return EXIT_SUCCESS;
}


Translation:
tabuleirodojogo = boardofthegame
Jogador_X = Player_X
Ganhou_X = Win_X
Empate = Tie
Janela = Window

Do you people know why it runs fine on Debug but on Release don't?
Also why is it that the debug exe. has 5 megabytes and the release version only 1?

Cheers
Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: asdatapel on September 07, 2011, 04:52:21 am
Im not a code expert, so I cant tell you about your actual problem, but about the debug vs release thing here: http://haacked.com/archive/2004/02/14/difference-between-debug-vs-release-build.aspx
Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: Valeour on September 07, 2011, 02:13:14 pm
To your question "Why is debug.exe bigger than release.exe" is because debug contains alot of debugging code in the SFML area. All of this debug code is literally for that reason; debugging. It helps narrow down errors and what not.

Release doesn't contain these debug lines, so naturally it's alot less to process.

As to why release isn't working as well, I don't know. Sorry.
Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: Hair_FTW on September 07, 2011, 03:50:56 pm
"One can expect to see funny errors in release builds due to compiler optimizations or differences in memory layout or initialization. These are ususally referred to as Release - Only bugs :)"

Does this means that the code is fine (it is doing everything it is supposed to do in debug)? Released games (sold) come in debug or release version?
Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: Haikarainen on September 07, 2011, 04:35:06 pm
Are you linking the debugtarget with debuglibraries, and release with releaselibs?

Also, debug will always be bigger since they contain debugging symbols, to help with stuff like trace stack etc.
Title: Debug version works fine, release desn't (Tic Tac Toe)
Post by: Hair_FTW on September 09, 2011, 05:16:04 pm
Quote from: "Haikarainen"
Are you linking the debugtarget with debuglibraries, and release with releaselibs?

Also, debug will always be bigger since they contain debugging symbols, to help with stuff like trace stack etc.

Yes i am.

I managed to correct the error. I added in the "if" sections  event.Type == Event::MouseButtonPressed and now it works.

Cheers