Praca domowa - gra Warcaby na zaliczenie podstaw programowania

0

Witam

Jestem zupełnie nowy na tym forum, nie przeglądam go w ogóle, trafiłem z przymusu. Porzebuję napisać grę warcaby w pascalu na zaliczenia z podstaw programowania. Na zajęciach używamy Lazarusa, a sama gra wystarczy, że opierałaby się na grze między dwoma zawodnikami, bez możliwości gry z komputerem, wiadomo mile widziane, ale domyślam się, że trudne.
Sama gra ma być zrobiona w trybie okienkowym(tak to sie chyba nazywa), a nie w konsoli, Graficznie ma być byleby była.

Problem polega na tym, że nie wiem od czego mam zacząć, spędziłem parę godzin w necie, znalazłem na pastebin kod do gry w konsoli, ale nie umiem sobie tym pomóć. Czy moglibyście mi doradzić od czego w ogóle się zaczyna zabawę z takim programem? Znalazłem coś takiego jak obiekt Tcanvas, mało mi to mówi, ale wiem, że dotyczy grafiki, tylko nie wiem czy takiej jak mnie interesuje. Myślałem, żeby pierw stworzyć łopatologiczną planszę z pionkami, do tego panel z klawiszami sterującymi które będą służyły do poruszania pionkami, bo poruszanie myszką, jest za pewne trudniejsze w wykonaniu. Po zrobieniu takiego czegoś wystaczyłoby napisać podstawowe warunki na zbijanie pionków i pozostałe reguły gry. Jeśli ktoś mógłby mi pomóc, doradzić, dać przykład, inny pomysl na stworzenie tego to bardzo proszę.

Na napisanie mam 2 tygodnie.
Pozdrawiam ;)

1

Zacznij od jednego z dwóch:

  1. Czytania byle jakiego kursu Delphi/Lazarus
  2. Przygotowania odpowiedniej kwoty do wynajęcia fachowca
1

@lisq93 - sądzisz, że ktokolwiek zrobi ten program za Ciebie i wrzuci tutaj gotowca? Ryzykowne założenie;

Tutaj całą grę można wykonać w standardowej aplikacji okienkowej, używając albo jednej kanwy (klasy TCanvas) do rysowania całości, albo wielu - jednej dla szachownicy i po jednej dla każdego pionka; Zasady gry są proste, więc nie będzie z tym aż tak dużo roboty, jak się wydaje, ale bez podstaw i chęci nic nie zrobisz - szkoda nawet brać się za to; Masz dwa tygodnie, więc zdążysz się i nauczyć podstaw, i napisać program;

W przeciwnym razie wątek przeniosę do działu Ogłoszeń drobnych, gdzie ktoś za Ciebie to napisze za godziwną zapłatę; Tutaj się pomaga rozwiązywać problemy, a nie rozwiązuje zadania za leniuchów.

0

Nie pisałem, że chciałbym gotowca. Po prostu od tego są fora internetowe, żeby poszukać i zapytać. Napisać to muszę. Chciałem jakis szkielet, żeby w ogóle zrozumieć jak to trzeba zrobić. Moje podstawy to ćwiczenia, jakiś zarys mam, pewnie kropla w morzu ale jest, mój problem to stworzenie grafiki, bo tego na zajęciach nie było.

3

mój problem to stworzenie grafiki, bo tego na zajęciach nie było.

Obsługi Painta nie było? Na pewno, ale to nie znaczy, że czegokolwiek nie można namalować; Równie dobrze możesz pobrać z sieci jakieś ikony - jest ich multum;

Masz w załączniku na zachętę grafikę nabazgraną w Paint w dwie minuty; Wystarczy ją wczytać do komponentów przez Object Inspector i odpowiednio poukładać na formularzu - grafika gotowa;

Po prostu od tego są fora internetowe, żeby poszukać i zapytać.

Owszem, ale te pytania muszą czegoś dotyczyć, a Twoje są zbyt ogóle i nie poparte żadnym kodem, więc jak mamy Ci pomóc?

Po pierwsze to wyklikaj sobie formularz - pododawaj komponenty dla szachownicy, każdego piona, dodaj jakieś etykiety itd.; Następnie trzeba będzie zaprogramować poruszanie pionkami itd., czego nie zrobisz bez obeznania w podstawach kodzenia; Potrzebna jest jakaś wiedza i co ważniejsze chęci, których u Ciebie brakuje, bo wolisz pytac na forum zamiast przysiąść i zastanowić się jak to wykonać, dobrać sobie komponenty, grafikę albo zrobić albo pościągać z sieci i coś napisać; Jak coś nie będzie działało - pytaj, na pewno kilku użytkowników pomoże; Póki co pomóc Tobie można wskazując kurs programowania w Pascalu, bo gdybyś znał choćby podstawy to wiedziałbyś mniej więcej jak napisać ten program.

2

Masz warcaby w Javie, przepisz sobie do Lazarusa ;) - http://sourceforge.net/projects/wexlercheckers/?source=directory

0

@lisq93 wg mnie (na szybko):

  1. Najpierw powinieneś stworzyć tablicę dwuwymiarową, która by przechowywała zawartość pól, czyli np. var a: array[0..7] of array[0..7] of Byte;
  2. Później powinieneś zająć się stanami pól, czyli np. 0 - puste pole, 1 - biały pionek, 2 - czarny pionek, 3- biała damka itp.
  3. Zastanowić się nad zmianami stanów pól, czyli ruchami itp.
  4. Wyświetlanie wyników, czyli najwygodniej (najmniej roboty) odrysowywanie wszystkiego po każdym ruchu - rysowanie po Canvas.
  5. Przesuwanie pionków, czyli w najprostszym wykonaniu odczyt pozycji wciśnięcia przycisku myszki, odczyt pozycji puszczenia przycisku myszki.
  6. Odrysowywanie przesuwanego pionka.

Wbrew pozorom to może być sporo roboty, chyba, że znajdziesz gotowce, które Ci pomogą. Jak jesteś ambitny to możesz próbować sobie z tym sam radzić z jakąś pomocą forumowiczów ale nie wiem czy nie lepiej poprosić kogoś o pomoc w zamian za jakąś gratyfikację finansową, nie piszę tu o tym, że ktoś miałby to napisać od a do z za Ciebie ale pomóc abyś miał szanse wyrobić się w terminie.

0

No to jeszcze jedno pytanie, za ktore pewnie też polecą wrzuty ze "powinienem wiedzieć"

Czy ten kod może mi się przydać? _

program warcaby;

/edit usunąłem kod, bo zaśmiecał
end. 
0

Raczej się nie przyda, bo dotyczy programu konsolowego, a Tobie polecamy aplikację okienkową, w której będzie znacznie mniej kodzenia (chyba, że coś źle przemyślisz i napiszesz długiego tasiemca);

Polecam nie bazować na gotowych kodach (bo mogą być różne - dobre, złe i tragiczne), tylko zapoznać się z zasadami Warcab (a są różne, więc trzeba sobie jakieś wybrać) i rozpisać sobie całą grę, zanim zacznie się cokolwiek programować; Potem napisanie programu zajmie relatywnie mało czasu, bo całą grę będziesz już miał zaprojektowaną.

0

Po weekendzie z turbopascalem sie poddalem..

Znalazlem program na jakims forum, z tym ze kod wydaje sie byc skomplikowany.. Jakby chcialo sie komus odpalic kod i strescic kolejne jego etapy, to byloby fajnie. Moze da sie go uproscic bez zaawansowanych umiejetnosci?

Poza tym to chyba pisane w delphi jest?

0

I tak kończą napaleńcy na pisanie gier którzy nie mają pojęcia o programowaniu ;)

0

Ale kombinujecie...
Ja to bym w klikanie sie pobawił zrobił plasze z TImage i załadował pionki na nie i przemienił tagi ich na numerki odpowiadające typom i przez drag/drop sprawdzal czy ruch jest możliwy zabawa na 3-5h w zależności od ogarniania podstaw.

0

@hzmzp - od początku mowa jest o napisaniu wyklikanej aplikacji okienkowej;

Problemem jednak nie jest typ aplikacji, a chęci pytacza i zdolność do skupienia się i nauki, a także do lgicznego myślenia, kombinowania i testowania wymyślonych rozwiązań; Brak wiedzy i chęci nie usprawiedliwia dalszego braku programu, a nawet choćby jego zalążka.

0

Podejście numer dwa.

Lista rzeczy do zrobienia:
-stworzenie tabicy 8x8,
-dodanie pionków,
-umożliwienie poruszania pionkami,
-wypisanie warunków i zasad gry w warcaby,
-stworzenie planszy która po każdym ruchu się wyświetla na nowo

Podpunkt 1:
-Dodałem obiekt Tshape,
-Do tego button

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Shape1: TShape;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

  var
     plansza:array[1..8,1..8] of integer;
     i,j,suma1,suma2,suma3,suma4:integer;
   begin
     for i:=1 to 8 do
       for j:=1 to 8 do
         begin
            suma1:=50*i;
            suma2:=50*j;
            suma3:=suma1-50;
            suma4:=suma2-50;

            if (i mod 2=0) and (j mod 2<>0) or (i mod 2<>0) and (j mod 2=0) then
              begin
                Canvas.Brush.Color:=clRed;
                Canvas.Rectangle(suma3,suma4,suma1,suma2);
              end
            else
               Canvas.Brush.Color:=clgreen;
                Canvas.Rectangle(suma3,suma4,suma1,suma2);
        end;
   end;
end.

Po nacisnieciu przycisku wyświetla się coś takiego :

a11c067d4737839b.jpg

O to chodziło?

dodanie obrazka do złączników i treści posta - fp

2

Może jednak przeczytasz jakiś kurs aby nie robić z siebie ... ?

procedure TForm1.Button1Click(Sender: TObject);
var Y,X:Integer;
const Clr:array[0..1] of TColor=(clGreen,clRed);
begin
  for Y:=1 to 8 do
  begin
    for X:=1 to 8 do
    begin
      Canvas.Brush.Color:=Clr[(Y+X)and(1)];
      Canvas.Rectangle((X-1)*50,(Y-1)*50,X*50,Y*50);
    end;
  end;
end;
0
lisq93 napisał(a)

-stworzenie planszy która po każdym ruchu się wyświetla na nowo

To nie jest dobre rozwiązanie - skoro musisz przemalować tylko kilka kratek, to po co będziesz malował całą szachownicę?

O wiele lepszym wyjściem dla Ciebie było by zrobić tę grę na komponentach klasy TImage - jeden dla szachownicy i 16 dla pionków obu graczy; A tak to będziesz się motał, bo rysowanie wszystkiego na jednym komponencie jest trudniejsze (choć ciekawsze);

A tak poza tym to szachownica i pionki powinny być opakowane w klasę, a nie tak luzem się plątać po metodach formularza.

0
furious programming napisał(a):

... rysowanie wszystkiego na jednym komponencie jest trudniejsze (choć ciekawsze); ...
Że co? Jeden wiersz więcej to trudniejsze?

0

Tablica jest rysowana, a pionki powstawiane w Timage, po 12 z kazdego koloru. Zeby mozna bylo nimi poruszac to trzeba uzyc ktoregos ze zdarzen OnMouse, a nastepnie opisac gdzie moga sie poruszac, a gdzie nie? Tak bedzie na tyle trywialnie zebym mógł to zrobić ?

1

Najbardziej trywialne to:

  1. Tablica bajtów/enum gdzie 0 - pusta, 2-czarne,3-biale,4-czarna damka,5-iala damka
  2. Rysowanie za pomocą TImageList
  3. Przesuwanie za pomocą: klik - skąd, później klik dokąd
1

Tablica jest rysowana, a pionki powstawiane w Timage, po 12 z kazdego koloru.

Zdecyduj się - albo używasz komponentów, ładujesz do nich obrazki i przesuwasz, albo wszystko robisz na jednym komponencie (tak jak sugeruje @_13th_Dragon) i wykorzystujesz obliczenia do systemu przesuwania pionków;

Tyle razy już pisałem, że przesuwanie komponentów jest łatwiejsze (i z Twoją wiedzą i zapałem będzie lepszym rozwiązaniem), a Ty nadal kombinujesz i motasz się; Przede wszystkim to najpierw zastanów się jak ten program zrealizować, a dopiero później bierz się za pisanie, bo jak do tej pory prowadzony jesteś za rękę od samego początku; Najpierw się myśli, a potem robi - nie na odwrót.

0
furious programming napisał(a):

Tyle razy już pisałem, że przesuwanie komponentów jest łatwiejsze (i z Twoją wiedzą i zapałem będzie lepszym rozwiązaniem)

A ja bym miał problem sobie z tym poradzić gdyby pionki były w osobnych komponentach. Musiałbym pilnować i komponentów - pionków i tego co jest w array. Dla mnie ten program to tylko operacje na macierzy. Wybór pola, pionka (pozycja kursora) nie powinien być problemem. Do malowania wykorzystałbym PaintBoxa (lubię go ;) ). Czyli malowanie tego co jest w macierzy zrobiłbym w OnPaint. Po każdym ruchu (zmianie) zrobiłbym tylko Repaint PaintBoxa.

1
janeks napisał(a)

A ja bym miał problem sobie z tym poradzić gdyby pionki były w osobnych komponentach.

Tylko myślisz, że miałbyś problem, bo tego póki co nie widzisz; Z komponentami sprawa jest prostsza, bo nie ma tylu obliczeń; W każdym z komponentów pionka można przechować dodatkowe informacje we właściwości Tag; Przy kliknięciu na dany komponent pobrać ten tag (w którym możne być np. typ pionka) i na podstawie choćby nazwy czy pozycji sprawdzić w którym miejscu się znajduje i jakie można nim wykonać ruchy; Możliwości jest mnóstwo - trzeba tylko spróbować;

Rysowanie na jednym komponencie to same obliczenia (dla wiedzących o co chodzi to także nie problem), które także można fajnie wykonać i połączyć z macierzą przechowującą np. enumy typu pionka; Tyle że trzeba ręcznie rysować, ale po np. TPaintBox czy nawet gołym formularzu to także nie problem; Z animacją było by gorzej w tym przypadku, bo problem sprawiałoby poprawne odrysowywanie kratek, ale to też można rozwiązać;

Możliwości jest wiele, więc jest o czym dyskutować; Natomiast poleciłem rozwiązanie z wieloma komponentami, bo według mnie jest łatwiejsze, a sam pytacz jakoś wiedzą nie zaskakuje, więc mógłby to zrobić z mniejszą ilością pytań; Dla mnie to obojętne, ale to nie ja mam zrobić ten program, więc staram się doradzić coś w miarę łatwego dla pytacza; Jeśli chce malować na jednym komponencie - proszę bardzo, nie jest to trudne; Tyle że pytacz najpierw bierze się za rysowanie, które na początku nie jest najważniejsze; Najpierw skupiłbym się na samym silniku gry, który będzie obsługiwał zasady, a dopiero później bawiłbym się z grafiką; Takie jest moje zdanie, choć każdy widzi to inaczej;

lisq93 napisał(a)

Tablica jest rysowana, a pionki powstawiane w Timage, po 12 z kazdego koloru. Zeby mozna bylo nimi poruszac to trzeba uzyc ktoregos ze zdarzen OnMouse, a nastepnie opisac gdzie moga sie poruszac, a gdzie nie? Tak bedzie na tyle trywialnie zebym mógł to zrobić ?

Komponenty komponentami, ale tablicę np. enumów z informacjami o pionkach i ich rozmieszczeniem i tak będzie trzeba mieć, dlatego że komponenty służyć miały by jedynie do wyświetlania, a cała gra zapisana była by w tablicy w pamięci; Po kliknięciu (OnMouseUp lepiej) wysyłasz tag komponentu do mechanizmy zarządzającego grą, a ten sprawdza jakie ma ruchy itd., ewentualnie go przemalowuje aby zaznaczyć, że został kliknięty;

W obu przypadkach będziesz musiał rozdzielić mechanikę gry od grafiki, więc samo malowanie musi być oddzielone od silnika obliczającego możliwości ruchu; Może najpierw zastanów się którą wersję chcesz zaimplementować, a już nie będę Ci przedstawiał różnych możliwości, tylko skupimy się na tym, co chcesz zrobić.

0

Znow ja..

Tworzenie klas:

Pierwsza:

Plansza = class            //Tworzy tablice 8x8
   procedure Tablica;
end;
 

Druga:

Pole = class  
   procedure kolorPlanszy;    //okresla kolory planszy
   procedure plozeniePol;     //okresla polozenie pol pobierajac informacje z klasy Plansza
end;
 

Trzecia:

Pionek = class
   procedure KolorPionka;           //okresla kolor pionkow i okresla, ze czarne=1 biale=2
   procedure PolozeniePionka;     //okresla polozenie pionkow pobierajac informacje z metody polozeniePol
end;
 

Sprawdzi sie?

2

Yyyyy, to ja już się pogubiłem śledząc ten wątek. Piszesz pod VCL, a nagle wyskakujesz jak Filip z Konopii, z jakimś wczytywaniem z konsoli. Weź, najlepiej przysiądź, pokodź jak najwięćej kombinując samodzielnie. Dawno już byś to napisał jakbyś się tylko skupił. Bo póki co widzę, że niemal cały program napisali za Ciebie odpisujący w tym temacie. To jest TWOJE zaliczenie, nie nasze. I Ty musisz umieć napisać taki program, a później ewentualnie obronić go pokazując, że wiesz co napisałeś.

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