"Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

"Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 29 lis 2015 16:06

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
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

Reklama
Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 29 lis 2015 19:53

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...
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7399
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod faraon » 29 lis 2015 20:18

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 29 lis 2015 20:58

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
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7399
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod faraon » 29 lis 2015 21:30

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';
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 29 lis 2015 21:38

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.
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

odvodnovac
nováček
Příspěvky: 31
Registrován: červen 12
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod odvodnovac » 29 lis 2015 21:43

jé, to jsem ted mel jako 1. semestralni projekt :D

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 29 lis 2015 21:52

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"...
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7399
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod faraon » 29 lis 2015 21:55

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:
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 30 lis 2015 19:55

Tak už mne to funguje :) teď ještě jedna drobnost, jak to zarovnám na střed? :)
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7399
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod faraon » 30 lis 2015 20:00

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
Martab
Moderátor / člen HW týmu
Guru Level 14
Guru Level 14
Příspěvky: 28655
Registrován: březen 11
Pohlaví: Muž
Stav:
Offline

Re: "Céčko" - Vlk a 1 a 0 - převod znaku do binární podoby

Příspěvekod Martab » 30 lis 2015 20:02

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í?
i5-3350P/P8B75-M LX/Kingston DDR3 8GB/GV-N960IXOC/SS-500ET/Seagate VS35.6/Transcend SSD370-128GB/Samsung BX2250 + Dell 1909W
ThinkPad X230 - i7-3520M + Kingston Savage SSD

„Neexistuje důvod, proč by kdokoli chtěl mít doma něco jako počítač"(Ken Olsen)

Neboj se použít SZ a upozornit na své téma ;)

Přehled desktopových socketů a CPU


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti