Processing – další hra Cihly

Autor: Tonda Seiner <seinert(at)seznam.cz>, Téma: Programujeme, Vydáno dne: 09. 02. 2014

cihly_215

Nyní vám přidávám další lekci, opět formou hry. Jedná se o jednu ze skalních her z počátku počítačů. Na ní vám chci připomenout již známé příkazy a doplnit nové. Navíc je tato hra předána opravdu v hrubé podobě bez zvuků a jakéhokoli spoštění. Prostě program nahrajete, spustíte a můžete si hrát. Předpokládám, že si hru vylepšíte sami, doplníte skore atd. Příště se snad přiblížíme k dalším možnostem jak hru ovládat a doplnit. Tato hra má jen 150 řádků včetně komentářů,tak že s chutí do toho.

Nejprve však přiblížení toho co bychom si měli zapamatovat:

vice_120



// komentář programu - určitě jej hojně využívejte, aby jste si zajistili přehled i po nějakém čase

/* blokový komentář začátek

tyto řádky budou programem nezpracovány – lze s výhodou použít i pro dočasné vynechání části programu

*/ blokový komentář konec

int x=0; //definice proměnné integer – celé číslo běžně může dosahovat hodnoty +/- 32767

// s nastavením počáteční hodnoty

boolean mx=false; // definice logické proměnné která má poze dvě hodnoty pravda = true

// nepravda = false

int pozice_X[]=new int[40]; /* definice proměnné typu pole s velikostí 40 prvků

přístup k jednotlivým prvkům je pak pomocí indexu v hranaté závorce viz příklad pozice_X[0] = 15;

nebo a = pozice_X[1]; */

void setup() //--- Funkce pro nastavení programu čte se pouze jednou při startu programu

void draw() //--- Hlavní tělo programu - Opakuje se stále až do ukončení programu

size (rozsah_x,rozsah_y); // velikost obrazu ve které se zadává velikost v ose x , velikost v ose y

frameRate (100); //počet překreslení obrazovek za jednu sekundu

background (255,255,255); // barva pozadí obrazu hodnota 0-255 pro barvu(červená,zelená,modrá)

fill (30,10,307); //barva objektu hodnota 0-255 pro barvu(červená,zelená,modrá)

stroke (0,0,0); //okraj objektu hodnota 0-255 pro barvu(červená,zelená,modrá)

ellipse (x,y,30,30); //vykreslení kruhu(elipsy)-pozice x,y,velikost x,velikost y

rect (X,Y,50,25); // vykreslení obdélníku (čtverce)-pozice x,y,velikost x,velikost y

if (podmínka) jeden příkaz; //když je podmínka platná vykoná příkaz

else jedn příkaz; // když podmínka není platná vykoná příkaz za else

{

neco( ); // pro názvy proměnných a funkcí nepoužívejte českou diakritiku !

neco_jineho( );

} //{ } potřebujeme li zpracovat více příkazů , pak je uzavřeme do těchto závorek

// potřebujeme li volit mezi více hodnotami lze s výhodou použít takzvaný přepínač

switch (my) //přepínač pohybu míčku ve svislé ose výběr z hodnoty 0 až 4

{

case 0:

y=y;

break;

case 1:

y=y+1;

break;

case 2:

y=y-1;

break;

case 3:

y=y+2;

break;

case 4:

y=y-2;

break;

}

// pro vnoření příkazů dodržujte formát viz funkce něco z důvodu přehlednosti programu

void neco() // název funkce něco bez předání vstupních nebo výstupních parametrů(hodnot)

{

if(odraz >= y)

{

if((x>(mouseX-40)) & (x<mouseX+40))

{

my=true; // změna směru koule při kontaktu koule

modpal=true; //nastavení paměti při kontaktu koule

}

}

}

Nakonec ještě funkce výstupu

print(1+1); // výstup do konzole programu to je to černé okno pod editačním oknem

println("TENIS "); // výstup do konzole programu s odřádkováním

textSize(40); // velikost textu na grafické obrazovce pro barvu se použije opět příkaz fill...

text("TENIS ",200,100); //výstup na grafickou obrazovku („text“, pozice X, pozice Y)

Nyní konečně slíbená hra:

/**********************************

*********** Bourání cihlel ************

* příklad řešení pro výuku programování *

* KRA Písek *

***********************************/

//- definice proměnných

int pozice_X[]=new int[40]; //souřadnice cihly v ose X

int pozice_Y[]=new int[40]; //souřadnice cihly v ose Y

boolean cihla[]=new boolean[40]; // stav cihly

int x=0; //pozice koule v ose X

int y=130; //pozice koule v ose Y

int zx=0; //pozice cihly při stavění v ose X

int zy=0; //pozice cihly při stavění v ose Y

int i=0; // indexová proměná vybírá konkrétní cihlu

int odraz=350; // pozice odrazu v ose Y

boolean mx=false; // paměť pohyby koule v ose X

boolean my=false; // paměť pohyby koule v ose Y

boolean modpal=false; // pamet dotyku s odrazkou

boolean novaz=true; // nová zeď - paměť

int rozsah_x=350; //rozměr v ose X

int rozsah_y=350; //rozměr v ose Y

//---SETUP---

void setup()

{

size(rozsah_x,rozsah_y);

frameRate(100); //počet překreslení obrazovek

odraz=rozsah_y-75;

}

//--- Hlavní tělo programu -----

void draw()

{

background(255,255,255);

if (novaz)nova_zed(); //zavolá funkci postavení nové zdi

else zed(); // pak už pokračuje funkcí stavu zdi

pohyb_x(); //funkce řeší pohyb koule v ose X

pohyb_y(); //funkce řeší pohyb koule v ose Y

fill(30,10,307); //barva koule

ellipse(x,y,30,30); //vykreslení koule

odpal(); //funkce kontroluje dotek koule z odpalem

fill(10,307,30); //barva odpalu

stroke(0,0,0); //okraj odpalu

rect(mouseX-40,odraz,80,15); //vykreslení odpalu

}

// ********** FUNKCE **************

//--funkce řeší kontakt cyhly s koulí případně ji přebarví

void zed()

{

stroke(255,255,255); //okraj cihly

for (i=0;i<40;i++) //Vyber cihel

{

if (modpal) //paměť - byl dotek s odpalem

{

if ((x>=pozice_X[i]) & (x<=(pozice_X[i]+50)))

{

if ((y>=pozice_Y[i]) & (y<=(pozice_Y[i]+25)))

{

if (cihla[i])

{

modpal=false; //zrušení - dotek s odpalem

cihla[i]=false; // paměť-vybourání cihly

}

}

}

}

if(cihla[i]) fill(193,10,10); //barva cihla

else fill(255,255,255); //barva - není cihla

rect(pozice_X[i],pozice_Y[i],50,25); // vykreslení cihly

}

}

// ---postavi novou zed -----

void nova_zed()

{

stroke(255,255,255); //okraj cihly

fill(193,10,10); //barva cihly

for (zy=1;zy<5;zy=zy+1) //Sloupec cihel

{

for (zx=0;zx<(rozsah_x+25);zx=zx+50) //Řada cihel

{

if (zy==1||zy==3) //1. a 3. řada cihel

{

rect(zx,zy*25,50,25);

pozice_X[i]=zx;

pozice_Y[i]=zy*25;

}

else //posun cihel 2. a 4. řady

{

rect(zx-25,zy*25,50,25);

pozice_X[i]=zx-25;

pozice_Y[i]=zy*25;

}

cihla[i]=true; // nastavení paměti - je cihla

i++;

}

}

novaz=false; //vymazání paměti nové zdi

}

//---pohyb koule v ose X----

void pohyb_x()

{

if(x>=(rozsah_x-15))mx=true; //změna směru koule v ose X

if(mx==false)x=x+3; //posun koule v ose X

if(mx==true)x=x-3; //posun koule v ose X

if(x<=15)mx=false; //změna směru koule v ose X

}

//---pohyb koule v ose Y---

void pohyb_y()

{

if(y>=(rozsah_y-15)) //změna směru koule v ose Y

{

my=true;

modpal=false; //dotek koule dole - smazání paměti odpalu

}

if(my==false)y=y+3; //posun koule v ose Y

if(my==true)y=y-3; //posun koule v ose Y

if(y<=15)my=false; //změna směru koule v ose Y

}

//---dotek z odrazovou plochou----

void odpal()

{

if(odraz >= (y) & (odraz <=(y+15)))

{

if((x>(mouseX-40)) & (x<mouseX+40))

{

my=true; // změna směru koule při kontaktu koule

modpal=true; //nastavení paměti při kontaktu koule

}

}

}

//-----Konec programu --------