Stránka 1 z 2
"Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 16:06
od Martab
Zdravím,
tak nějak se začínám učit v C, a chtěl jsem si zkusit i něco složitějšího, našel jsme na internetu celkem pěknou hru a chtěl bych si ji zkusit naprogramovat (co mne to zas napadlo

). Odkaz jak by to mělo fungovat zde
http://petardads.4fan.cz/binaryhero.htmlMám udělaný generátor, který mi vyplňuje pvní řádek pole pseudonáhodnými 1 a 0 na pseudonáhodnou pozici
Kód: Vybrat vše
char matice[VYSKA][SIRKA] = { 0 };
int x = rand();
x = x%3;
int p = rand();
int p1 = p%4;
for(int j=0; j<4; j++) matice[0][j]=' ';
matice[0][p1]=x1;
a pohyb té šipky dole (teda s tím, že já to posunuju jenom vlevo a vpravo o jedno)
Kód: Vybrat vše
bool stop = false;
char matice[VYSKA][SIRKA] = { 0 };
int sloupec = 0;
int radek = VYSKA-2;
do
{
matice[radek][sloupec] = ' ';
if (_kbhit())
{
int znak = _getch();
switch (znak)
{
}
matice[radek][sloupec] = '^';
system("cls");
for (int i = 0; i < VYSKA; i++)
{
for (int j = 0; j < SIRKA; j++)
{
int znak = matice[i][j];
printf("%c ", znak);
}
printf("n");
}
// Sleep(100);
} while (stop == false);
Ale nějak nevím, jak to seskládat dohromady

našel by se někdo, kdo by mi poradil jak na to?
Díky,
Martab
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 19:53
od Martab
Tak jsem ve stádiu že mi tedy padají 1 a 0 popřípadě prázdný znak. Teď otázka, jde v C nějak jednoduše převést znak na jeho binární reprezentaci? Zajímají mne hlavně poslední 4 číslice, šlo by udělat pole, zadat to do ně a z toho to vyčítat, ale to mi přinde jako příliš "nákladné" na zdroje... Navíc potřebuju ty znaky "náhodně" losovat...
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 20:18
od faraon
Binární reprezentaci? Nic jednoduššího:
00100000 = mezera
00110000 = 0
00110001 = 1
Testuješ pomocí binárního AND, takže if (x & 1) zjistí že je tam z těchhle tří jednička.
Akorát jsem z toho odkazu nepochopil co se v té hře má vlastně dělat a o co v ní jde, na klávesnici mi to nereagovalo.
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 20:58
od Martab
Jde o to, že se posouvá tou šipkou dole a jak kdysi v té ruské kře vlk chytal vajíčka, tak tady se chytají čísla. Úkolem je (pokud jsem to z toho správně pochopil) poskládat ten znak co je v hlavičce v binárním kódu (berou se poslední 4 znaky, tedy 'a' je 0001, atd.). To jak porovnat jestli je to správně, to vím, poslední řádek ukládám do samostatného pole a to mám v plánu porovnávat. Jde o to, že (nějak) potřebuju vygenerovat náhodný znak a ten potom převést do binární podoby (nebo obráceně). Momentálně to u mne vypadá takto:
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 21:30
od faraon
Jo, už se mi s tím podařilo něco udělat, a prohrát až ve druhém kole
Má to tam strašně nepřehledné, asi by bylo dobré ty sloupce o mezeru vzdálit od sebe, aby bylo vidět kam co míří.
Takže úkol je poskládat to zadané číslo v binární podobě z jednotlivých bitů, a hráč má chytat nuly a jedničky, které do daného sloupce nepatří, rozumím tomu správně?
Binárně to asi bude trochu problém, protože v tom dolním řádku může mít každá pozice tři stavy. A protože jediný trojkový počítač Setuň existoval před mnoha desítkami let v Sovětském svazu, musel bys pro každou pozici použít minimálně dva bity!
Asi bych to nekomplikoval nějakým bitovým polem, a jednoduše porovnával dvě pole, ten spodní řádek herního pole, a vzor, kam si na začátku dekóduješ správnou sekvenci. Zabere to čtyři bajty RAM, a protože se proměnné v paměti zarovnávají na velikost int, tak sebemenší bitové pole zabere právě tolik.
Kód: Vybrat vše
int i,cislo,maska;
char vzor[4];
for (i=0, maska=8; maska; maska>>1)
vzor[i] = cislo&maska ? '1' : '0';
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 21:38
od Martab
Jo, přesně tak jsem to pochopil i já.
Mohl bys mi prosím objasnit, jak přesně funguje "maska"? Já zatím vymyslel akorát to, že bych si náhodně vygeneroval číslo, to přiřadil číslu v ASCII a pak to převedl tímto
Kód: Vybrat vše
int main()
{
int a = 97; //pseudonáhodně generované číslo
int pole[4]={ 0 };
printf("Decimal - %d\nZnak - %c\nDvojkove - ", a, a);
for (int i=0; i<4; i++)
{
}
for (int i=0; i<4; i++)
{
printf("%d", pole[i]);
}
return 0;
}
a obsah toho "pole" bych srovnával s obsahem posledního řádku.
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 21:43
od odvodnovac
jé, to jsem ted mel jako 1. semestralni projekt

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 21:52
od Martab
No vidiš, někdo to dělá protože musí, jiný protože chce, třetí třeba kombinace obojího

Teď se ještě dívám, že to budu muset upravit, protože samotné "rand()" generuje vlastně furt stejně, takže to bude chtít přepsat s "time"...
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 29 lis 2015 21:55
od faraon
Maska = 8, takže na počátku bude 1000.
Číslo = 6, dvojkově 0110.
Binární
& porovná jednotlivé bity, kde jsou shodné, bude ve výsledku 1, jinak nula:
vzor[0] = 0
Potom se provede posun >>1 o jeden bit vpravo, čímž se maska vydělí dvěma. Pokud se tím nevynulovala, jde se do další iterace:
vzor[1] = 1
Další posun vpravo, a test dalšího bitu:
vzor[2] = 1
A další:
vzor[3] = 0
Po dalším posunu je maska 0000 a cyklus končí, vzor je v tuhle chvíli řetězec
"0110", akorát bez ukončujícího znaku
\0, takže ho nemůžeš porovnávat strcmp()!
Seed nastavíš na počátku programu
srand(time(NULL));. Pokud ho nebudeš spouštět víckrát za sekundu, stačí to

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 30 lis 2015 19:55
od Martab
Tak už mne to funguje :) teď ještě jedna drobnost, jak to zarovnám na střed? :)
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 30 lis 2015 20:00
od faraon
Jednoduše, uděláš před to dostatečný počet mezer nebo tabulátorů.
Teda pokud myslíš střed obrazovky a máš font s jednotnou šířkou znaků

Další možnost je použití knihovny ncurses, ta umožňuje ovládání kurzoru.
Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby
Napsal: 30 lis 2015 20:02
od Martab
Aha, takže nestačí jen na začátek přidat nějaký řetězec, musel bych to celé přepsat (všude dopsat a znovu otestovat)... :/ No nevadí, "odtabuláturuju" to.
A ještě jedna věc, jak "vypnout" to blikání?