1

Witam.

Mniej lub bardziej świadomie (tudzież jak kto woli pół żartem pół serio) wdepnąłem w projekt z programowania w Turbo Deplphi na uczelni i drzwi się za mną zamknęły - na zaliczenie muszę napisać gre a dokładnie Tetrisa :-)

Musi to po prostu "grać", prosty tetris, bez jakichkolwiek wodotrysków.

Czy ktoś mógłby posilić poradą, pomysłem lub po prostu gotowym projektem/programem? Po prostu nie mam pojęcia jak sie do tego zabrać. Jak to na uczelni bywa, na laborkach zajmowaliśmy się jakimiś pierdołami a projekty oczywiście z kosmosu... gdybym miał gotowy i działający kod to już bym sobie sam go mniej lub bardziej (wystarczająco aby zaliczyć) rozkminił.

Byłbym szalenie wdzięczny za wszelaką pomoc!

2 Ostatnio edytowany przez xan (2009-04-23 13:26:59)

Robiłeś kiedyś cokolwiek w delphi? Poradzisz sobie ze środowiskiem?

Jeżeli to ma być prosty tetris to wystarczy malowanie po canvasie formy lub przez winapi: nie ma sensu bawienie się w directdraw itp.

Wstaw na forme komponent TTimer, parametr interval zmienia czestotliwosc pojawiania sie zdarzenia OnTimer.
Do tego dorób metodę formy dla zdarzenia OnPaint i maluj po formie.

Przyda Ci się:
TForm.Canvas
TCanvas.Rectangle
TCanvas.Draw (gdybyś wolał malować klocki z bitmap a nie prostokątami)

to tak w skrócie :)

Edit: i jeszcze jedno: ma to być napisane ładnie (obiektowo np) czy szybko?

Edit2:

stwórz nowy projekt, wstaw na forme komponent ttimer i do kodu formy wklej:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


const

shapes :array[0..6] of array[0..3,0..3] of byte =

(
  (
  (0,0,0,0),
  (0,0,0,0),
  (1,1,1,1),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (0,1,0,0),
  (0,1,1,1),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (0,0,0,1),
  (0,1,1,1),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (0,1,1,0),
  (0,1,1,0),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (1,1,0,0),
  (0,1,1,0),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (0,0,1,1),
  (0,1,1,0),
  (0,0,0,0)
  ),
  (
  (0,0,0,0),
  (0,1,0,0),
  (1,1,1,0),
  (0,0,0,0)
  )
);


bricksize=16;
playwidth=10;
playheight=20;
playwidthpx=bricksize*playwidth;
playheightpx=bricksize*playheight;

type

  TTetromino= record
    typ: integer;
    x:    integer;
    y:    integer;
    color: TColor;
  end;

var
  vscreen: TBitmap;
  playfield: array[0..playheight-1, 0..playwidth-1] of byte;

  tetromino: TTetromino;

implementation

{$R *.dfm}


procedure PaintBrick(x,y:integer; color: TColor=clRed);
begin
  if (x>=0)and(y>=0)and(x<playwidth)and(y<playheight) then
  begin
    vscreen.Canvas.Brush.Color:=color;
    vscreen.Canvas.FillRect(Rect(x*bricksize,y*bricksize,(x+1)*bricksize,(y+1)*bricksize));
  end;
end;

procedure PaintPlayField();
var
  i,j:integer;
begin
  vscreen.Canvas.Brush.Color:=clBlack;
  vscreen.Canvas.FillRect(Rect(0,0,playwidthpx,playheightpx));

  for i:=0 to playheight-1 do
  for j:=0 to playwidth-1 do
    if playfield[i,j]>0 then
      PaintBrick(j,i);

  for i:=0 to 3 do
  for j:=0 to 3 do
    if shapes[tetromino.typ][i,j]<>0 then
      PaintBrick(tetromino.x+j,tetromino.y+i,clBlue);
end;


procedure NewTetromino();
begin
  tetromino.typ:=random(7);
  tetromino.y:=-4;
  tetromino.x:=playwidth div 2 - 2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vscreen:=TBitmap.Create;
  vscreen.Width:=playwidthpx;
  vscreen.Height:=playheightpx;
  Randomize();
  NewTetromino();
  Paint();
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  PaintPlayField;
  Form1.Canvas.Draw(0,0,vscreen);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(tetromino.y);
  if tetromino.y=playheight then NewTetromino();
  Form1.Repaint;
end;

end.

Pamiętaj o przypisaniu zdarzenia do timerka Timer1Timer do timera.
Na początek powinno Ci wystarczyć.. eksperymentuj dalej sam.

Edit3: no i na OnPaint formy też musisz ustawić FormPaint ktore zrobilem...

3 Ostatnio edytowany przez MWK (2009-04-23 17:05:53)

xan, bardzo Ci dziękuje za pomoc. Owszem, jak już wspominałem robiliśmy na laborkach jakieś okienka, drobne obliczenia, nawet prosty edytor tekstu oraz arkusz kalkulacyjny ale to nie było w moim przekonaniu nic konkretnego (co też mniej lub bardziej powinno nas przygotować do projektu) dlatego postanowiłem napisać.

Z tego co mi przedstawiłeś to rozumiem powiedzmy z 80% a resztę sobie jakoś dopracuję.

Pobawię się tym co zarzuciłeś niemniej jednak w razie kłopocików będę pisał.

edit:: oczywiście, najprościej jak się da, więc directdraw nie nada. ach byłbym zapomniał, pytasz czy ma to być zrobione "ładnie (obiektowo np) czy szybko?", przepraszam ale nie wiem :-) może powiem tak - chciałbym aby było to zrobione najprościej jak się da.

4

To co napisałem to nawet nie jest szkic programu. Poświęciłem na to może z 10 minut gdyż więcej czasu nie miałem.
Największy problem z jakim się zetkniesz to rotacja elementów wraz ze sprawdzaniem czy element obrócić się da (w sąsiedztwie już istniejących).
Sterowanie klockiem, układanie linii itp to banał.