Prośba o ocenę kodu gry w szachy

Prośba o ocenę kodu gry w szachy
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0

Witam,
Napisałem grę w szachy w Pythonie z użyciem Pygame. Postanowiłem że napisze do nich jeszcze grę z botem ale przed tym chciałbym aby ktoś ocenił mój kod. Starałem się napisać ten program obiektowo. Proszę o ocenę :)

Mój kod na github: https://github.com/Suchy702/szachy/tree/master


Competitive Google searcher
edytowany 4x, ostatnio: flowCRANE
CZ
Chcesz pisać silnik od zera? :P
S7
[https://github.com/Suchy702/Szachy] Chyba to właśnie zrobiłem :)
NS
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 minuty
  • Postów:455
3

Pierwsze co bym zmienił, to:

  1. ujednolicenie nazewnictwa zmiennych do jednego języka - angielskiego.
  2. skasowanie komentarzy - nie są one potrzebne w jednak prostym kodzie.
  3. zastosuj takie nazewnictwo, żebyś wiedział co robi metoda
  4. program nie jest obiektowy, poza użyciem obiektowych słów kluczowych jak 'class'
  5. zacznij rozbijać ten kod na krótkie metody, które robią 1 (!sic) rzecz, nie strukturalny kod na 300 linijek
  6. staraj się deklarować zmienne na "górze" modułu / klasy, chyba że w pythonie nie ma takiej konwencji
  7. OOP - zacznij refactor do kodu obiektowego: każdy obiekt w grze to ma być właśnie obiekt! tj. plansza, pole na planszy, bierka, ruch
    I na przykład, plansza ma kolekcję pól, pole z kolei ma referencję do bierki, która się na nim znajduje, każda bierka ma obiekt, który definiuje jej ruch. Każda bierka ma def move() etc etc

Jak coś to jak poprawisz, to możesz dać znać ;)

S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0
NeutrinoSpinZero napisał(a):

Pierwsze co bym zmienił, to:

  1. ujednolicenie nazewnictwa zmiennych do jednego języka - angielskiego.
  2. skasowanie komentarzy - nie są one potrzebne w jednak prostym kodzie.
  3. zastosuj takie nazewnictwo, żebyś wiedział co robi metoda
  4. program nie jest obiektowy, poza użyciem obiektowych słów kluczowych jak 'class'
  5. zacznij rozbijać ten kod na krótkie metody, które robią 1 (!sic) rzecz, nie strukturalny kod na 300 linijek
  6. staraj się deklarować zmienne na "górze" modułu / klasy, chyba że w pythonie nie ma takiej konwencji
  7. OOP - zacznij refactor do kodu obiektowego: każdy obiekt w grze to ma być właśnie obiekt! tj. plansza, pole na planszy, bierka, ruch
    I na przykład, plansza ma kolekcję pól, pole z kolei ma referencję do bierki, która się na nim znajduje, każda bierka ma obiekt, który definiuje jej ruch. Każda bierka ma def move() etc etc

Jak coś to jak poprawisz, to możesz dać znać ;)

Dziękuje bardzo !
Zgodnie z twoimi poradami to chyba lepiej będzie jak napiszę to od początku :P.


Competitive Google searcher
edytowany 1x, ostatnio: Suchy702
Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:2 minuty
  • Postów:6626
2
Kopiuj
plansza.B_szach = False
plansza.C_szach = False
plansza.B_r_szach = 0
plansza.C_r_szach = 0

To jest mało obiektowe. Jak widzisz takie coś, to powinieneś od razu napisać klasę z odpowiednimi polami.

Kopiuj
if not W and U is False:

Jednoznakowe zmienne zaciemniają kod. Ponadto konstrukcja tego warunku nie ułatwia jednoznacznego odczytania.

is pewnie zadziała dla booleana, ale poprawniej w tej sytuacji byłoby użyć tego operatora ==. ( http://net-informations.com/python/iq/is.htm ).
W ogóle najlepiej zapomnij o is, to unikniesz wielu nieprzewidzianych sytuacji :]

Kopiuj
plansza.screen.blit(pygame.image.load('ustawienia.png'), (0, 0))

Nigdy tak nie rób. Obrazek załaduj gdzieś wcześniej w aplikacji, przed pętlą, żeby siedział w pamięci. W blit używaj referencji do uprzednio załadowanego obrazka.

Kopiuj
        if self.rodzaj == 'pion':
            if self.poz[1] == '8' or self.poz[1] == '1':
                self.rodzaj = 'hetman'
                return ruchy_hetmana(self, slownik, T)
            else:
                return ruchy_piona(self, slownik, self.kolor, T)
        elif self.rodzaj == 'kon':
            return ruchy_konia(self, slownik, T)
        elif self.rodzaj == 'wieza':
            return ruchy_wiezy(self, slownik, T)
        elif self.rodzaj == 'goniec':
            return ruchy_gonca(self, slownik, T)
        elif self.rodzaj == 'hetman':
            return ruchy_hetmana(self, slownik, T)
        else:
            return ruchy_krola(self, slownik, T)

To jest bardzo nieobiektowe. Aż się prosi, żeby zrobić klasę dla każdej bierki, nadpisującą "wirtualną" metodę ruchy().

No i obiekty wsadzamy w odpowiednie pliki *.py.

Obiektowe szachy z dwoma plikami źródłowymi to przykry żart...


🕹️⌨️🖥️🖱️🎮
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:23 minuty
1
NeutrinoSpinZero napisał(a):
  1. staraj się deklarować zmienne na "górze" modułu / klasy, chyba że w pythonie nie ma takiej konwencji

A gdzie jest? W Pascalu? PL/SQL?


λλλ
flowCRANE
W Pascalu wymusza to struktura kodu, choć tylko dla zmiennych lokalnych i tylko w dialektach innych niż Delphi.
stivens
@furious programming: w PL/SQL chyba podobnie. Edit: przez to INSERT INTO ale byc moze da sie to obejsc
Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:2 minuty
  • Postów:6626
0
stivens napisał(a):
NeutrinoSpinZero napisał(a):
  1. staraj się deklarować zmienne na "górze" modułu / klasy, chyba że w pythonie nie ma takiej konwencji

A gdzie jest? W Pascalu? PL/SQL?

ANSI C?


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:23 minuty
1
Spine napisał(a):

ANSI C?

To chyba legacy (c89) z powodu prymitywnych kompilatorow w tamtych czasach. Teraz to raczej nie obowiazuje.


λλλ
edytowany 1x, ostatnio: stivens
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0
Spine napisał(a):
Kopiuj
plansza.B_szach = False
plansza.C_szach = False
plansza.B_r_szach = 0
plansza.C_r_szach = 0

To jest mało obiektowe. Jak widzisz takie coś, to powinieneś od razu napisać klasę z odpowiednimi polami.

Kopiuj
if not W and U is False:

Jednoznakowe zmienne zaciemniają kod. Ponadto konstrukcja tego warunku nie ułatwia jednoznacznego odczytania.

is pewnie zadziała dla booleana, ale poprawniej w tej sytuacji byłoby użyć tego operatora ==. ( http://net-informations.com/python/iq/is.htm ).
W ogóle najlepiej zapomnij o is, to unikniesz wielu nieprzewidzianych sytuacji :]

Kopiuj
plansza.screen.blit(pygame.image.load('ustawienia.png'), (0, 0))

Nigdy tak nie rób. Obrazek załaduj gdzieś wcześniej w aplikacji, przed pętlą, żeby siedział w pamięci. W blit używaj referencji do uprzednio załadowanego obrazka.

Kopiuj
        if self.rodzaj == 'pion':
            if self.poz[1] == '8' or self.poz[1] == '1':
                self.rodzaj = 'hetman'
                return ruchy_hetmana(self, slownik, T)
            else:
                return ruchy_piona(self, slownik, self.kolor, T)
        elif self.rodzaj == 'kon':
            return ruchy_konia(self, slownik, T)
        elif self.rodzaj == 'wieza':
            return ruchy_wiezy(self, slownik, T)
        elif self.rodzaj == 'goniec':
            return ruchy_gonca(self, slownik, T)
        elif self.rodzaj == 'hetman':
            return ruchy_hetmana(self, slownik, T)
        else:
            return ruchy_krola(self, slownik, T)

To jest bardzo nieobiektowe. Aż się prosi, żeby zrobić klasę dla każdej bierki, nadpisującą "wirtualną" metodę ruchy().

No i obiekty wsadzamy w odpowiednie pliki *.py.

Obiektowe szachy z dwoma plikami źródłowymi to przykry żart...

Dziękuję bardzo za ocenę !
"Starałem się" napisać to obiektowo...

No i obiekty wsadzamy w odpowiednie pliki *.py.

Dla każdej klasy mam robić osobny plik ?


Competitive Google searcher
edytowany 2x, ostatnio: Suchy702
Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:2 minuty
  • Postów:6626
2
Suchy702 napisał(a):

Dla każdej klasy mam robić osobny plik ?

Tak. Zobacz sobie inne projekty na GitHubie. Niekoniecznie pythonowe...


🕹️⌨️🖥️🖱️🎮
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0

Cześć,
Zgodnie z waszymi radami napisałem moje szachy od nowa i dodałem prymitywnego bota :), teraz też proszę o ocenę ale teraz mam jeszcze dodatkowo kilka pytań i proszę o odpowiedź, a zatem:

  1. Za każdym razem gdy pisze (jakiś obiekt) == None, Pycharm sugeruje mi że powinienem użyć is, dla bezpieczeństwa zostawiać == czy tylko gdy upomni mnie Pycharm pisać is?
  2. Pycharm sugeruje mi że kilka metod klas powinny być zwykłymi funkcjami, czy robić metody do klasy tylko wtedy gdy korzysta ona z atrybutów tej klasy, czy kiedy?
  3. Czy mój algorytm minimax jest dobrze napisany ?
  4. Pliki zaczynać z dużych czy małych liter ? :D
    Mój projekt na githubie:
    [https://github.com/Suchy702/Szachy]

Competitive Google searcher
kzkzg
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:924
0

Jak to odpalić? Z pythonem nie mialem nigdy do czynienia.


Keep calm and blame frontend.
Tell your cat I said pspsps.
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0
kzkzg napisał(a):

Jak to odpalić? Z pythonem nie mialem nigdy do czynienia.

Musisz mieć interpreter
(Możesz go pobrać z tej strony [https://www.python.org/downloads/])
ściągasz wszystko co mam z Githuba i klikasz dwa razy na main.py, i wszystkie pliki .py muszą być wraz z folderem images w jednym folderze
(Szerze mówiąc nie wiem czy zadziała na innym komputerze niż mój :P)

Zapomniałem dodać że jeszcze trzeba zainstalować pygame
W konsoli wpisujesz
pip install pygame


Competitive Google searcher
edytowany 1x, ostatnio: Suchy702
kzkzg
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:924
4

Ok, odpaliłem.
Kodu nie oceniam bo nie wiem co tam sie dzieje.
Masz buga, można zrobić roszadę przez pole szachowane.


Keep calm and blame frontend.
Tell your cat I said pspsps.
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
0

Kodu nie oceniam bo nie wiem co tam sie dzieje.

Aż tak źle napisany ? :'(

Masz buga, można zrobić roszadę przez pole szachowane.

Dzięki
Okazuje się że nie za dobrze znam zasady gry w szachy :P


Competitive Google searcher
TomaszLiMoon
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Postów:530
2

Kilka uwag:

  1. Zbyt długo czeka się na ruch komputera - w tym czasie program nie reaguje. Może warto obliczenia z Engine przenieść do osobnego wątku?
  2. Czarny król jest nieprawidłowo ustawiony.
  3. Czasami czarny król porusza się na pole będące pod biciem białych figur.
edytowany 1x, ostatnio: TomaszLiMoon
S7
  • Rejestracja:prawie 5 lat
  • Ostatnio:4 dni
  • Postów:354
1

Cześć
Moje szachy zostały poprawione zgodnie z waszymi radami:
poprawiłem mechanikę roszady
ustawiłem dobrze czarnego króla
do tego jeszcze zmieniłem grafikę dodałem animację i możliwość "chwytania" pionka a do tego zapis gry :)
Mój program:
[https://github.com/Suchy702/Szachy]


Competitive Google searcher
WE
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Postów:72
0

Gra łamie zasady gry, min:

  • można przesunąć króla w pole szachowane
  • można pozostawić króla szachowanego
S7
w szachach to są nielegalne ruchy ? Myślałem że to po prostu błąd
somekind
Ta gra nie miałaby sensu, gdyby to nie było nielegalne.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)