Kółko i krzyżyk - aplikacja GUI dla Windows

5

Ostatnio wreszcie wziąłem się za naukę pisania okienkowych aplikacji za pomocą WinAPI, a w ramach ćwiczenia udało mi się stworzyć program "Kółko i krzyżyk", który zamierzam też rozwijać w ramach dalszej nauki.

scr2.png
Na razie jest to gra w kółko i krzyżyk dla 2 graczy, tzn. nie zawiera AI do gry, ale jest licznik zwycięstw dla obu graczy.

Oczywiście jestem świadomy, że są tam pewne niedociągnięcia, pewne rzeczy są zrobione nieco dziadowo i pewnie są w WinAPI lepsze sposoby, ale jest to moja pierwsza użyteczna windowsowa aplikacja GUI. W następnych wersjach będę ją udoskonalał, wiem m. in. że istnieje coś takiego jak podział model-widok i postaram się go wprowadzić.

Testowane na Windows XP, 7, 10.

Repozytorium programu na GitHubie Wersja 1 składa się z jednego pliku źródłowego C, który powinno dać się łatwo skompilować za pomocą większości prostych IDE dla Windows, typu Dev-C++, MinGW Developer Studio czy Code::Blocks.

Jakby ktoś jednak nie miał odpowiedniego kompilatora to udostępniam też wersję wykonywalną skompilowaną za pomocą TinyCC ważącą 5 KB na Chomikuj.

10

Fajnie, że masz coś działającego i jesteś z tego dumny. I bardzo dobrze, żeby się czegoś nauczyć, trzeba zacząć coś robić i próbować.
Żeby było jasne celem tego komentarza jest nakierowanie cię we właściwą stronę, a nie "dokopanie początkującemu".

Zacznijmy od prostej drobnicy:

  • katalog v1 - domyślam się, że chodzi o wersjonowanie. Od tego masz git-a, żeby się zajmował wersjonowaniem. Sensowniejsza nazwa to src, ale lepiej byłby z wyprzedzeniem bardzij skomplikować strukturę katalogów np tictactoe/src (może niżej opiszę dokładnie o co chodzi).
  • brak czegokolwiek do budowania kodu, jakiś make/ninja/cmake (ten ostatni bardziej jest standardem przemysłowym C++).
  • wszystko w jednym pliku kolkrzyz.c którego nazwa jest polska.
    • dobrą praktyką jest oddzielenie, części kontrolującej logikę działania gry od interakcji z użytkownikiem (UI). Ergo dwa pliki ze źródłami to tu minimum.
    • WinMain jest zbyt skomplikowane, powinno być maksymalnie proste i wywoływać tylko parę funkcji. W ten sposób można potem łatwiej dopisać testy do kodu.
  • za dużo wcięć. Cytując Linusa: "Jeśli potrzebujesz więcej niż trzech poziomów wcięcia, twój kod i tak jest schrzaniony i powinieneś go poprawić.". Kod trzeba podzielić na mniejsze funkcje by to osiągnąć.
  • pilnuj formatowania kodu, od tego jest clang-format . Ty używasz jakiegoś dziwnego standardu wcięć, przez co większość z nas ma wrażenie, że masz funkcje urwane w połowie, albo na szybko nie wiadomo gdzie właściwie się kończy pętla.
  • screenshoty z działania aplikacji wymieszane z kodem. Lepiej to trzymać w osobnym katalogu (albo wcale).
  • nie używaj zmiennych globalnych

Bardziej zaawansowane rzeczy:

  • polecam nauczyć się używać cmake, zrobić strukturę katalogów:
tictactoe_logic
    + Src
        tictacktoe.c
    + test
        tictacktoe_test.c
    + include
        tictacktoe.h
    CMakeLists.txt
tictactoe_win_ui
    + Src
        main.c
        game_window.c
        game_window.h
    CMakeLists.txt
Documentation
    scr1.PNG
    scr2.png
    scr3.png
    Details.md
CMakeLists.txt
README.md
  • ważną umiejętnością jest pisanie testów. Polecam się tym zainteresować. Do C++ Catch2 jest bardzo łatwy w użyciu. Do C nie wiem.
  • może warto skorzystać z czegoś bardziej wieloplatformowego a nie z WinAPI?
0

Osobiście nie znam się zbytnio na C (piszę głównie w C++), ale kod wygląda dość dobrze. Mało kodu typu kopiuj-wklej, a zamiast tego są funkcje, oraz ogólnie sposób rozdzielania kodu. Z wad, niestety program jest w 1 pliku, co przy tak dużej ilości funkcji, struktur itp. powoduje, że jest trochę nieczytelny. Możnaby też, jak sam wspomniałeś rozdzielić na model, widok itp. (ogólne zastosować jakąś architekturę). Z innych problemów jest sam fakt, użycia WinAPI, praktycznie nikt tego nie używa (niskopoziomowe, przestarzałe i jednoplatformowe), w 99% projektów używa się innych technologii i języków (raczej C++ i Qt, albo C# i WPF). Ale jako ćwiczenie, jak najbardziej może być. Nie widzę innych problemów.

0

Nie sprawdzasz błędów więc się nawet nie zagłębiałem.
Nauka winapi to słaby pomysł. ( było strata czasu ale jednak nauczenie się czegoś nowego nigdy nie jest pełną stratą czasu ).

1

Wygląd

Na Windows XP działa poprawnie:
screenshot-20240616131738.png
Ale na Windows 10 coś jest nie tak z tłem tekstu:
screenshot-20240616131802.png
I to zarówno dostarczona wersja binarna jak i skompilowana na Windows XP przy użyciu “clang”.
Ponadto w wersji dostarczonej jest wykrywany przez Defendera Trojan:Wacatac.B!ml, ale to raczej fałszywy alarm według «virustotal.com».

Kod

Najlepiej by było go uporządkować. Poza tym niektóre nazwy są mylące jak findfieldbtn, która to procedura wykonuje akcję, a nie tylko wyszukuje.
I te zmienne globalne, które nie wiadomo, co robią.
Procedura winning mogłaby sprawdzać tylko linie przecinające właśnie kliknięte pole, co ma znaczenie głównie przy większej ilości pól niż trzy na trzy.
Poza tym do gry w kółko i krzyżyk z trzema polami nie potrzeba AI, ponieważ są proste reguły, których przestrzeganie zapewni graczowi komputerowemu zawsze albo zwycięstwo, albo remis, więc potrzeba by dodać losowo jakieś błędy w wykonywaniu tego algorytmu.

0

Jak ja testowałem na Windows 10 to wyglądało normalnie. Jeśli chodzi o AI to nie miałem na myśli sieci neuronowych czyli AI w sensie tworzenia gier czyli jakikolwiek algorytm gry wirtualnego przeciwnika.

0

U mnie na Windows 10 jest problem z wyborem czcionki. Jeśli dla systemowej klasy STATIC wybiorę czcionkę w procedurze okna przy użyciu SelectObject, to wtedy wyświetla poprawnie. Ale jak to zrobić dla systemowej klasy BUTTON?

1

Radzę sprawdzać każde wywołanie funkcji czy nie zwraca kodu błędu.
Męczące ale logując takie informacje od razu było by widać gdzie się popsuło - tj. które wywołanie zwróciło błąd.
Do tego jest też: https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror GetLastError które podaje szczegóły co poszło nie tak.

Czy nie lepiej użyć? https://winworldpc.com/product/microsoft-visual-bas/10
screenshot-20240618184210.png

0

Chodzi mi o ćwiczenie WinAPI na przykładzie rozwijania tego programu, a tworząc taki program w VB średnio się nauczę WinAPI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1