Stránka 1 z 1

Piškvorky v C

Napsal: 02 kvě 2011 13:13
od iMohos
Zdravím,mam problem s programem v Ccku . Mam ve škole zadanou úlohu vytvořit hru piškvorky aby se dala hrát v terminálu,takže o vzhled mi nejde.
Kdyby mi někdo alespon poradil,klidně bych za to i zaplatil :D

Mockrát děkuji za případné návrhy,prog. jazyk je tedy C ,a jestli je to důležité,systém je Linux ,distribuce Debian.

Re: Piškvorky v C

Napsal: 02 kvě 2011 16:07
od faraon
Jsou k tomu úkolu nějaké bližší požadavky?
Například použítí ncurses nebo ansi kódů pro ovládání obrazovky, nebo stačí jen aby se jednotlivé stavy vypisovaly za sebou?
Má to být pro dva hráče, nebo člověk proti počítači?

Re: Piškvorky v C

Napsal: 02 kvě 2011 17:11
od iMohos
Bližší požadavky k tomu nejsou, ale zase příliš složité to být nemusí.

Re: Piškvorky v C

Napsal: 02 kvě 2011 17:58
od faraon
Když nic složitého, tak bych to udělal třeba takhle:

Kód: Vybrat vše

    0   1   2   3   4   5   6   7   8   9
  +---+---+---+---+---+---+---+---+---+---+
A |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
B |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
C |   |   |   | X |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
D |   |   | X | O | O | O | X |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
E |   | X |   |   |   |   | O |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
F |   |   |   |   |   |   |   | O |   |   |
  +---+---+---+---+---+---+---+---+---+---+
G |   |   |   |   |   |   |   |   | X |   |
  +---+---+---+---+---+---+---+---+---+---+
H |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
I |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+
J |   |   |   |   |   |   |   |   |   |   |
  +---+---+---+---+---+---+---+---+---+---+

Na tahu je Kolečko (zadej souřadnice pro O): g6_


Umíš aspoň něco v Pascalu? Z toho se dá v Céčku slušně vyjít. Stačí for, if, dvourozměrné pole, vstup a výstup. A hodilo by se mít po ruce učebnici Céčka ;-) Dokdy to máš mít hotové?

Re: Piškvorky v C

Napsal: 02 kvě 2011 18:26
od iMohos
no takhle by to bylo nejluxusnější :) No,bohužel,jelikož jsme na naší průmyslovce 1.IT třída co kdy byla otevřená tak učební plány jsou dosti mizerné,jediné co jsme se kdy učili jsou základy PHP ,trochu bash a tedka C :( ... a hotové to má být přibližně do 2 týdnů ...

Re: Piškvorky v C

Napsal: 02 kvě 2011 20:49
od faraon
PHP používá Céčkovou syntaxi a převzalo z něj hromadu věcí, takže v tom bych problém neviděl. Ale i tak je ten váš učební plán dost odvážný :-D
Tak se zatím mrkni na funkce scanf a printf, a pro začátek si zkusíme zadání jmen hráčů. A také si zkus navrhnout osnovu programu, co má postupně všechno dělat.

Re: Piškvorky v C

Napsal: 03 kvě 2011 14:37
od iMohos
Je to učební plán na pytel,už ve třetáku,za rok maturita a pořád umim dá se říct kulový co se týče programování :D printf jaksi zvádám,na scanf se mrknu :)

Re: Piškvorky v C

Napsal: 03 kvě 2011 22:53
od faraon
Za rok se dá naučit spousta věcí :listen: Také záleží jak hluboko do toho vůbec máte proniknout, co to máš za obor?
Moc do hloubky ten scanf() ještě nestuduj, zatím stačí když budeš chápat proč je printf("%d",cislo) a scanf("%d",&cislo), a k čemu je tam to &.
A jak jsi na tom s tou osnovou, už sis sepsal jak ta hra probíhá?
Jinak Céčko je v principu strašně jednoduchý jazyk, má jen deset příkazů :lol: Jak to zatím vidím já, tak je ale ani nebudeme potřebovat všechny.

Protože piškvorky moc neumím, tak trochu jsem zapátral a našel tohle:

* Piškvorky proti sobě hrají dva hráči.
* K dispozici mají čtverečkované hrací pole o rozměrech 15 × 10 čtverečků.
* Každý z hráčů má svůj symbol (křížek, nebo kolečko).
* Zakreslováním svého symbolu do některého ze čtverečků hracího pole se snaží poskládat souvislou řadu pěti svých symbolů.
* Zároveň také samozřejmě zabraňuje svému soupeři v tomtéž.
* Vyhrává ten hráč, kterému se podaří dříve poskládat nejméně pět svých symbolů do svislé, vodorovné nebo diagonální souvislé řady.

a oficiální pravidla české federace (ale hrají to podle japonských):

* Piškvorky je hra pro dva hráče. Hráči kladou na hrací plán černé a bílé kameny.
* Deska má 15 svislých a 15 vodorovných čar s 225 průsečíky. Pět z těchto průsečíků slouží jako referenční body. Desky nesmí mít stejnou barvu jako kameny.
* Jeden z hráčů používá černé, druhý bílé kameny. Hráči se střídají v tazích. Černý (tj. hráč s černými kameny) začíná; položí svůj první kámen na libovolný průsečík desky.
* Vítězem hry se stává hráč, který první vytvoří piškvorku, tj. právě pět stejných kamenů v řadě. V případě vytvoření šesti a více kamenů v řadě hra pokračuje dále.
* Hráč vyhraje, když může prokázat, že jeho soupeř překročil časový limit.
* Hráč vyhraje, pokud jeho soupeř vzdal.
* Pokud hráč vytvoří piškvorku, ale nevšimne si toho a o svoji výhru se nepřihlásí, hra pokračuje a vyhrává soupeř, přihlásí-li se o svoji výhru.
* Hra končí remízou,
- když jsou obsazeny všechny průsečíky na desce;
- když se oba hráči na remíze dohodnou;
- když oba hráči překročili čas.

Pole 15x10 se na obrazovku v pohodě vejde, akorát by bylo lepší označit písmeny sloupce, aby se nemuselo zadávat dvoumístné číslo...

Re: Piškvorky v C

Napsal: 30 kvě 2011 14:42
od iMohos
Tedy nějaký plán jak by to mělo probíhat:

- defaultně nějaká hrací plocha,řekněme cca 8x8
- hráči by se postupně střídali
- hra by tedy probíhala tak,že každé hrací políčko v poli by mělo svojí pevnou souřadnici,XY,takže hráč který hraje za křížek by musel napsat řekněme napříkal C4,hráč za kolečka B7 a takhle
- po volbě (resp. zadání souřadnic) by se hrací políčko zaplnilo příslušným znakem X nebo O
- po tom co by některý z hráčů dosáhl 4 svých symbolů v řadě (at už uhlopříčně nebo diagonálně) by se na obrazovce oběvil nápis "vyhrál X" nebo "vyhrál O" ,něco v tom smyslu :D

šlo by to takhle ? :smile: samozřejmě by to nebylo zadarmo :D

Re: Piškvorky v C

Napsal: 30 kvě 2011 18:18
od faraon
Takže už máš nějakou představu jak to má probíhat, a tím je daný začátek programu:

Kód: Vybrat vše

#define SIRKA 8
#define VYSKA 8
#define PISKVORKA 4

char plocha[SIRKA][VYSKA],
     symbol[]={"OX"};


Základní hodnoty jsou definované jako konstanty, takže se dají kdykoliv změnit a tím se přizpůsobí celý program. Říká se, že jediná čísla, která se v zdrojovém kódu smí vyskytovat, jsou 0 a 1, a o tu jedničku se vedou spory :lol: Pro ladění bych doporučil nastavit 3,3,3, tím se hra z Piškvorek změní na Tic-Tac-Toe a mnohem snáz se vyzkouší všechny kombinace než při větší ploše. Hlavně rychleji, protože při ploše 8x8 by to mohlo trvat i pár miliard let...
Ještě si rozmysli jestli chceš mít tu hrací plochu jako globální proměnnou (jednodušší možnost), nebo jestli jí definuješ lokálně v main() a budeš funkcím předávat v parametrech (správnější ale pracnější).

V tuhle chvíli máme tři hlavní problémy:
1: funkce, která zobrazí hrací plochu na obrazovku, tedy písmena, čísla, rámečky a obsah jednotlivých polí,
2: funkce, která načte zadání hráče jenž je na řadě, zkontroluje jestli pole není obsazené a zapíše do něj jeho symbol,
3: hlavní smyčka a její podmíněné ukončení, jestli se bude nejvíc hodit for, while nebo do se ukáže časem, zatím je potřeba vědět jen podle čeho pozná že se má ukončit.

Od toho se budou odvíjet všechny proměnné (ostatní už budou int) a hlavně jejich inicializace na začátku hry před smyčkou. Takže zapřemýšlej jak se budou tyhle tři body vzájemně doplňovat a začneme od té jedničky (tu budeme potřebovat pro ověření dvojky, a dvojku zase pro ověření trojky):

Kód: Vybrat vše

    A   B   C
  +---+---+---+
 0 |   |   |   |
  +---+---+---+
 1 |   |   |   |
  +---+---+---+
 2 |   |   |   |
  +---+---+---+


Písmena bych dal na sloupce, ne na řádky jak je obvyklé, aby se v případě zvětšení pole na šířku nemusela zadávat dvoumístná čísla, takhle bude omezení jen na max. 10 řádků (což dá po vykreslení na monitor 22, pro standardní pětadvacetiřádkové rozlišení tak akorát) a mnohem jednodušší načítání zadaných souřadnic.
Bylo by také dobré, kdyby šlo zadat b1, B1, 1b i 1B a program to správně převedl.
Ale to bude na řadě až po vykreslení, takže zkus navrhnout jak tu tabulku poskládat. Bude na to úplně stačit pár smyček for() a fukce printf() a putchar().
A bacha na jednu věc, než funkci zobraz() z main() poprvé zavoláš, musíš pole nejdřív inicializovat - vynulovat (v tomhle případě vyplnit mezerami), aby se na tebe nevysypaly nesmysly co jsou v paměti odminula!