Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σε όλους

Κάνω ένα σκάκι για 2 άτομα σε javascript και κολλάω λίγο με τις κινήσεις

Για το black Pawn έγραψα το παρακάτω αλλά δεν είμαι σίγουρος

function control_black_pawn(x1,y1,x2,y2){//x1y1 είναι η αρχική θέση x2y2 η τελική
    if (x2-x1!=1 || x2-x1!=2 || Math.abs(y2-y1)>1)//αν το δχ δεν είναι 1 ή 2 ή το δψ είναι μεγαλύτερο του +-1
        return false;
    if (!chessboard[x2][y2].hasChildNodes() && y1!=y2)//αν δεν υπάρχει στο στόχο άλλο πιονι και αλλάξει το y
        return false;
    if (x1!=1 && x2-x1>1)//αν δεν ειναι στην αρχή και κανει περισσότερα απο 1 βήματα
        return false;
    return true;
}

καμιά ιδέα αν είναι σωστός ο αλγόριθμος που έχω στα σχόλια;

Δημοσ.

Σωστός φαίνεται ο αλγοριθμος απλά συνήθως τον καθετο άξονα τον έχουμε ως y'y και όχι τον οριζοντιο αλλά αυτό είναι δικό σου θέμα ως convention. 

Δημοσ. (επεξεργασμένο)

Συνήθως σε τέτοιες περιπτώσεις κάνεις return true στις συνθήκες και false στο τέλος. Έτσι που το έχεις είναι δυσνόητο μόνο και μόνο επειδή εκφράζει τις ανάποδες συνθήκες από αυτό που έχει κανείς στο μυαλό του "πώς κινείται ένα πιόνι". Έτσι που είναι γραμμένο πραγματικά δεν έχω ιδέα αν είναι σωστό, το οποίο σημαίνει ότι είναι γραμμένο "λάθος".

Επίσης δεν επιτρέπει en passant κόψιμο, ούτε αν καταλαβαίνω καλά και προαγωγή.

Ακόμα, δε βλέπω να ελέγχει αν προχωρήσει 2 ότι το ενδιάμεσο τετράγωνο πρέπει να είναι κενό. Γενικά φαίνεται ότι έχει θέματα αλλά όχι ποια ακριβώς είναι τα θέματα.

Και βέβαια χρειάζεσαι ξανά τα ίδια πράγματα λίγο διαφορετικά για white pawn.

Αν τα βάλεις όλα μαζί, θα έλεγα ότι είναι μια reasonable αρχή αλλά έχει πολύ δρόμο για εξέλιξη.

Επεξ/σία από defacer
Δημοσ. (επεξεργασμένο)
1 ώρα πριν, kaliakman είπε

Σωστός φαίνεται ο αλγοριθμος απλά συνήθως τον καθετο άξονα τον έχουμε ως y'y και όχι τον οριζοντιο αλλά αυτό είναι δικό σου θέμα ως convention. 

Επειδή έχω βάλει τα τετράγωνα σαν πινακα 8χ8 με βολεύει γιατί αντιστοιχεί στο chessboard[x] [y]

1 ώρα πριν, defacer είπε

Συνήθως σε τέτοιες περιπτώσεις κάνεις return true στις συνθήκες και false στο τέλος. Έτσι που το έχεις είναι δυσνόητο μόνο και μόνο επειδή εκφράζει τις ανάποδες συνθήκες από αυτό που έχει κανείς στο μυαλό του "πώς κινείται ένα πιόνι". Έτσι που είναι γραμμένο πραγματικά δεν έχω ιδέα αν είναι σωστό, το οποίο σημαίνει ότι είναι γραμμένο "λάθος".

Επίσης δεν επιτρέπει en passant κόψιμο, ούτε αν καταλαβαίνω καλά και προαγωγή.

Ακόμα, δε βλέπω να ελέγχει αν προχωρήσει 2 ότι το ενδιάμεσο τετράγωνο πρέπει να είναι κενό. Γενικά φαίνεται ότι έχει θέματα αλλά όχι ποια ακριβώς είναι τα θέματα.

Και βέβαια χρειάζεσαι ξανά τα ίδια πράγματα λίγο διαφορετικά για white pawn.

Αν τα βάλεις όλα μαζί, θα έλεγα ότι είναι μια reasonable αρχή αλλά έχει πολύ δρόμο για εξέλιξη.

Το en passant και την προαγωγή (promotion) δεν τα έβαλα ακόμα. Για το en passant θα το σκεφτώ πολύ 🙄

Τα ενδιάμεσα πουλια τα έλεγχω ξεχωριστά γιατί αφορούν και σε πύργο και σε αξιωματικό και σε βασίλισσα. Το εάν στον προορισμό υπάρχει πιόνι ίδιου χρώματος το καλύπτω ξεχωριστά γιατί αφορά σε όλα τα πουλιά.

Αυτό που ξέχασα τελείως είναι η ιδιαιτερότητα του pawn ότι δεν μπορεί να πάει στον στόχο σε ευθεία όταν έχει αντίπαλο πιόνι  ☹️

Μέχρι τώρα έχω κάνει έλεγχο μόνο στο άλογο και στον αξιωματικό και το πιόνι τώρα που νομίζω είναι το δυσκολότερο κομμάτι σε όλη τη σκακιέρα σαν αλγόριθμος. Το άλογο είναι μια γραμμή νομίζω ???????

function control_knight_move(x1,y1,x2,y2){
    if (Math.abs(x2-x1)==2 && Math.abs(y2-y1)==1 || Math.abs(x2-x1)==1 && Math.abs(y2-y1)==2)
        return true;
    return false;
}

 

 

Επεξ/σία από k33theod
Δημοσ.
2 λεπτά πριν, tsofras είπε

Φαντάζομαι θες να ανακαλύψεις και τον αλγόριθμο μόνος σου σωστα?

Οχι, αν τους έχεις δει κάπου έτοιμους πες μου απλά θέλω να τους καταλαβαίνω 

Δημοσ.
5 λεπτά πριν, tsofras είπε

Ρίξε μια ματιά εδώ αν και έχει διαφορετική λογική από αυτό που πάς να κάνεις

https://medium.freecodecamp.org/simple-chess-ai-step-by-step-1d55a9266977

Αυτό είναι AI να παίζει δηλαδή μόνο του το πρόγραμμα, εγώ είμαι 100 χρόνια πίσω

Ένας από τους λόγους είναι ότι το 1ο if του κώδικά μου ισχύει πάντα 😂

Τελικά κατέληξα εδώ

function control_black_pawn(x1,y1,x2,y2){
    if (x2-x1==1 && Math.abs(y2-y1)==1 && chessboard[x2][y2].hasChildNodes())
        return true;
    if (x2-x1==2 && x1!=1)
        return false;
    if (x2-x1==2 && y2==y1 && !chessboard[x2][y2].hasChildNodes() && !chessboard[x1+1][y2].hasChildNodes())
        return true;
    if (x2-x1==1 && y2==y1 && !chessboard[x2][y2].hasChildNodes())
        return true;
    return false;
}

 

Δημοσ.

Για να δεις τους αλγόριθμους το έβαλα όχι για να το φτιάξεις σε ΑΙ , η λογική για την κίνηση στα πιόνια μένει ίδια

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...