Avatar billede martinbk Nybegynder
10. oktober 2010 - 02:31 Der er 3 kommentarer og
1 løsning

Optimering i søgeroutine

Hejsa jeg sidder her og bakser lidt med at lave en udgave af "tic tac toe" game som er mere generisk, forstået på den måde at man selv kan sætte størrelsen på brættet (rækker og kolonner), og også selv bestemme det påkrævede antal på række for at vinde spillet.

jeg har nu fået bikset en søge routine sammen som virker, dog synes jeg den er noget grim for at sige det mildt, så det jeg søger er en optimering af min routine om det være sig rekursion elleren helt anden teknik er entlig underordnet.

og så lidt kode:


    private static final int ROWS = 10;
    private static final int COLUMNS = 10;
    private static final int NUM_ON_ROW = 5;
    private int[][] board;

    private boolean matchValues(int first, int second)
    {
        return first > 0 && second > 0 && first == second;
    }

    /*
    * If there is a winner the number of that one is returned. If
    * no winner, a 0 is returned
    */
    public int winner()
    {
        for (int row = 0; row < ROWS; row++) {
            for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
                boolean found = false;
                for (int tic = 1; tic < NUM_ON_ROW; tic++) {
                    found = matchValues(board[row][column], board[row][column + tic]);
                    if (!found) {
                        break;
                    }
                }
                if (found) {
                    return board[row][column];
                }
            }
        }
        for (int column = 0; column < COLUMNS; column++) {
            for (int row = 0; row < ROWS - NUM_ON_ROW + 1; row++) {
                boolean found = false;
                for (int tic = 1; tic < NUM_ON_ROW; tic++) {
                    found = matchValues(board[row][column], board[row + tic][column]);
                    if (!found) {
                        break;
                    }
                }
                if (found) {
                    return board[row][column];
                }
            }
        }
        for (int row = 0; row < ROWS - NUM_ON_ROW + 1; row++) {
            for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
                boolean found = false;
                for (int tic = 1; tic < NUM_ON_ROW; tic++) {
                    found = matchValues(board[row][column], board[row + tic][column + tic]);
                    if (!found) {
                        break;
                    }
                }
                if (found) {
                    return board[row][column];
                }
            }
        }
        for (int row = ROWS - 1; row >= NUM_ON_ROW - 1; row--) {
            for (int column = 0; column < COLUMNS - NUM_ON_ROW + 1; column++) {
                boolean found = false;
                for (int tic = 1; tic < NUM_ON_ROW; tic++) {
                    found = matchValues(board[row][column], board[row - tic][column + tic]);
                    if (!found) {
                        break;
                    }
                }
                if (found) {
                    return board[row][column];
                }
            }
        }
        return 0;
    }
Avatar billede martinbk Nybegynder
10. oktober 2010 - 02:43 #1
hmm ser ikke ud til eksperten er vild med mit tegnsæt / min browser, her er et link til koden som den burde se ud: http://pastebin.com/MYxiqHyX
Avatar billede martinbk Nybegynder
10. oktober 2010 - 02:55 #2
skal vi se om 3. gang er løkkens gang, nu uden > og lign.
http://pastebin.com/MYEUp8id
Avatar billede mcb2001 Nybegynder
26. oktober 2010 - 09:43 #3
umiddelbart ville jeg måske gribe det lidt anderledes an.

Hvis du vælger at lave brættet kvadratisk, så kan et "tic tac toe" kan jo kun vindes ved at man har alle felter i en lodret, vandret eller lang-diagonalen på brættet helt fyldt med ens egne brikker.

Så vil tjekket jo være væsentligt nemmere. For i den nuværende løsning skal du tage højde for underlige diagnonaler og ligendne.
Avatar billede martinbk Nybegynder
07. februar 2011 - 00:36 #4
først undskyld den sene udmelding

men din løsning er jo temmelig ubrugelig når et krav er man selv skal kunne definere størrelsen, og ikke i et låst størrelsesforhold.

jeg endte med blot at bruge den pastede routine.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester