Archief - [PROG][JAVA] Vier op een rij

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

iamdesign

Legacy Member
Hoe kan je 4 op een rij checken?

het spelbord is 7*6 groot en dynamisch aangemaakt met panels (name = 1-42)

beide clients zenden via server hun moves naar elkaar door, en deze worden al getoond bij elkaar.
maar nu zoek ik al continue op hoe ik dit kan checken... :)

kan iemand mij wat helpen?

MacK

Legacy Member
horizontaal checken:

Code:
{
for(kolom i = 1 ; i <= 4; i++) 
 ==> if ((vakje[rij][(i+1)] == vakje[rij][(i+2)]  == vakje[rij][(i+3)]  == vakje[rij][i] ) && (vakje[rij][i] != null)

==> 4 op een rij.
}
dit doe je voor elke rij

verticaal : gelijkaardig

diagonaal : ook gelijkaardig..

mijn tip : teken eens een rastertje op papier, omcirkel alle diagonale oplossingen in kleur_groen , alle horizontale in kleur_blauw , alle verticale in kleur_rood... en zie dan hoe je al die mogelijkheden in een for lus kan zetten voor elk van de 3 gevallen

imho als je al networking kan maken enzo in java, dan is dit toch een koud kunstje om te bedenken? dit was 1 van de eerste spellen die ik al schreef op m'n ti-83 rekenmachine (basic :p)

PS : tis natuurlijk totaal geen juiste programmeercode, maar het idee is wel duidelijk zeker?

MacK

Legacy Member
vroeger heb ik dit eens gemaakt in java (console).. M'n eerste 'spelletje'. Kheb het toevallig nog liggen. Daar was mijn raster een 1-dimensionale array (dus 0-41)

Code:
public static boolean controlerenVoi(int speler, char[] raster, boolean gedaan) {
        char schijf = '*';
        if (speler == 1) {
            schijf='0';
        }
        if (speler == 2) {
            schijf='X';
        }
        //horizontaal?
        for (int i=0;i<6;i++) {
            for(int j=0;j<4;j++) {
                if ( ((raster[(j+i*7)])==(raster[(j+1+i*7)])) && ((raster[(j+1+i*7)])==(raster[(j+2+i*7)])) && ((raster[(j+2+i*7)])==(raster[(j+3+i*7)])) && ((raster[(j+i*7)])==schijf) ) 
                {
                    gedaan = true;
                    return gedaan;
                }
            }
        }
        
        //verticaal?
        for (int i=0;i<3;i++) {
            for(int j=0;j<7;j++) {
                if( ((raster[(j+i*7)])==(raster[(j+7+i*7)])) && ((raster[(j+7+i*7)])==(raster[(j+14+i*7)])) && ((raster[(j+14+i*7)])==(raster[(j+21+i*7)])) && ((raster[(j+i*7)])==schijf) ) 
                {
                    gedaan = true;
                    return gedaan;
                }
            }
        }
        
        //diagonaal?
        //van links naar rechts
        for(int i=0;i<4;i++) {
            for(int j=0;j<3;j++) {
                if( ((raster[(i+j*7)])==(raster[(i+8+j*7)])) && ((raster[(i+8+j*7)])==(raster[(i+16+j*7)])) && ((raster[(i+16+j*7)])==(raster[(i+24+j*7)])) && ((raster[(i+j*7)])==schijf)  ) 
                {
                    gedaan = true;
                    return gedaan;
                }
            }
        }
        
        //van rechts naar links
        for(int i=3;i<7;i++) {
            for(int j=0;j<3;j++) {
                if( ((raster[(i+j*7)])==(raster[(i+6+j*7)])) && ((raster[(i+6+j*7)])==(raster[(i+12+j*7)])) && ((raster[(i+12+j*7)])==(raster[(i+18+j*7)])) && ((raster[(i+j*7)])==schijf)  ) 
                {
                    gedaan = true;
                    return gedaan;
                }
            }
        }
        return gedaan;
    }


Trekt op niet veel ik weet het (ongelofelijk hoeveel stommiteiten er in zitten, als ik er nu zo naar kijk), maar het idee zit er natuurlijk wel in ... natuurlijk was een 2-dimensionele array makkelijker enzo, maar ja... paar dagen ervoor schreef ik nog maar m'n eerste 'hello world' in java..

Kn0t

Legacy Member
Het kan wel een stuk performanter, door te vertrekken vanuit de gekende positie van de laatste zet.

Performantie speelt weliswaar geen grote rol, aangezien het een vrij basic algoritme is dat zoiezo vrij snel zal uitgevoerd worden. Maar wanneer je er bvb. een AI-speler wil aan toevoegen, wordt performantie veel belangrijker, omdat deze methode dan heel vaak zal worden aangeroepen (in een lus ofzo).

Heb het ooit eens voor een schoolopdracht (wel in VB.NET) moeten maken.

Code:
    ' controleer of een bepaalde zet vier op een rij maakt
    Function checkWin(ByVal deRij As Integer, ByVal deKolom As Integer, ByVal kleur As Integer) As Boolean
        Dim i, x As Integer
        ' Verticale controle
        If deRij > 2 Then
            Dim verticaal As Integer
            i = deRij - 1
            While i >= 0 AndAlso _veld(i, deKolom) = kleur
                i -= 1
                verticaal += 1
            End While
            If verticaal >= 3 Then ' vier op een rij !
                _winnaar = kleur
                _winRichting = SpeelVeld.Verticaal
                Return True
            End If
        End If
        ' Horizontale controle
        Dim horizontaal As Integer
        i = deKolom - 1
        While i >= 0 AndAlso _veld(deRij, i) = kleur ' links
            i -= 1
            horizontaal += 1
        End While
        i = deKolom + 1
        While i < kols AndAlso _veld(deRij, i) = kleur ' rechts
            i += 1
            horizontaal += 1
        End While
        If horizontaal >= 3 Then ' vier op een rij !
            _winnaar = kleur
            _winRichting = SpeelVeld.Horizontaal
            Return True
        End If
        ' Diagonaal(stijgend)
        Dim diagStijgend As Integer
        i = deRij - 1
        x = deKolom - 1
        While i >= 0 And x >= 0 AndAlso _veld(i, x) = kleur ' links
            i -= 1
            x -= 1
            diagStijgend += 1
        End While
        i = deRij + 1
        x = deKolom + 1
        While i < rows And x < kols AndAlso _veld(i, x) = kleur ' rechts
            i += 1
            x += 1
            diagStijgend += 1
        End While
        If diagStijgend >= 3 Then ' vier op een rij !
            _winnaar = kleur
            _winRichting = SpeelVeld.DiagonaalStijgend
            Return True
        End If
        'Diagonaal(dalend)
        Dim diagDalend As Integer
        i = deRij + 1
        x = deKolom - 1
        While i < rows And x >= 0 AndAlso _veld(i, x) = kleur ' links 
            i += 1
            x -= 1
            diagDalend += 1
        End While
        i = deRij - 1
        x = deKolom + 1
        While i >= 0 And x < kols AndAlso _veld(i, x) = kleur ' rechts
            i -= 1
            x += 1
            diagDalend += 1
        End While
        If diagDalend >= 3 Then ' vier op een rij !
            _winnaar = kleur
            _winRichting = SpeelVeld.DiagonaalDalend
            Return True
        End If
        ' geen vier op een rij
        Return False
    End Function

JStyles

Legacy Member
Hallo,

Ik moet voor een taak 4 op een rij programeren maar zelf weet ik totaal niet hoe ik eraan kan beginnen wie kan mij helpen?

Grtz :applause:

MilM

Legacy Member
Gat die nu echt in elke java thread gaan posten?
Er staat hier trouwens al een voorbeeld van een algoritme of moeten we uwe Swing GUI ook nog programmeren?

jim92

Legacy Member
heeft iemand hier een complete code van vier op een rij?
maar dan 2 spelers, niet iemand tegen de pc..
moet namelijk hebben voor school, gemaakt met visual cafe..
who can help me?!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan