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 :D). Odkaz jak by to mělo fungovat zde http://petardads.4fan.cz/binaryhero.html

Má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:
Vlk.png

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 :lol:
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 :D

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 :D

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:

Kód: Vybrat vše

1000
0110
----
0000

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:

Kód: Vybrat vše

0100
0110
----
0100

vzor[1] = 1

Další posun vpravo, a test dalšího bitu:

Kód: Vybrat vše

0010
0110
----
0010

vzor[2] = 1

A další:

Kód: Vybrat vše

0001
0110
----
0000

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 :lol:

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í?