Loydova patnáctka (osmička) - zjednodušeně – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Loydova patnáctka (osmička) - zjednodušeně – .NET – Fórum – Programujte.comLoydova patnáctka (osmička) - zjednodušeně – .NET – Fórum – Programujte.com

 

Slizounek
~ Anonymní uživatel
2 příspěvky
16. 9. 2012   #1
-
0
-

Ahoj,

chtěl bych naprogramovat hru Loydovu patnáctku, akorát jednodušším způsobem... Ale nějak mě nenapadá, jak porovnat tlačítko s číslem a prázdné tlačítko... Napadlo mě akorát zapsat do několika hodně proměnných pozice všech tlačítek, ale přijde mi to strašně zdlouhavé... Nevíte někdo jak na to?  

Nahlásit jako SPAM
IP: 85.132.184.–
ingiraxo+15
Grafoman
16. 9. 2012   #2
-
0
-

a proč vůbec chceš menit pozice tlačítek? nestačí, když budeš měnit pouze hodnotu na tlačítkách? samozřejmě tahle celá logika musí probíhat programově a jen bude nastavovat hodnoty tlačítek podle pozice hodnot v poli

jinak to porovnani co chces, je Text tlacitka s hodnotou v poli tlačítek (číslic), nevim jak to máš řešený

možností jak tohle řesit je opravdu hodne, ono ty tlacitka taky nejsou uplne potreba pokud umíš kreslit, tak staci jednoduchá třída zastupující "tlacitko" kde bude Rect, hodnota apod.

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
TheOndrap
~ Anonymní uživatel
305 příspěvků
16. 9. 2012   #3
-
0
-

Bych proste udělal 16 tlačítek-polí-objektů s tím že 15 jich bude mít nějakou hodnotu a vždy 1 bude prázdný a žádnou pozici bych neměnil

Nahlásit jako SPAM
IP: 88.102.250.–
mephi0
Expert
17. 9. 2012   #4
-
0
-

Snaz se oddelit logiku programu (hry) od UI. Nejen programove, ale taky v hlave, to jak se divas na navrh programu. UI ber jenom jako vykresleni stavu a nastroj na ovladani. Skutecny stav je v objektech (tridach), ktere neni videt. Tam si totiz muzes delat co chces a nejsi omezovan nejakym pohybem tlacitek. Promin ze jsou to jen vseobecne kecy ale me tohle zjisteni moc pomohlo v zacatcich tak ho tady pisi :)

Nahlásit jako SPAM
IP: 2001:718:7:204:e1c6:7ef7:...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Mutagen0
Super člen
19. 9. 2012   #5
-
0
-

Díky tomuto vláknu jsem se do toho pustil, základní engine mám hotovej (posouvani buttonu(měnení hodnot) apod) ale našel jsem problém v tom vyhodnotit správně postavenou tabulku ... prostě nevím, jak udělat zjistění zda je tabulka opravdu dobře sekládaná. Napadlo mě to přes souřadnice, ale problém je zase v tom, že nevím jak si zjistit aktuální souřadnice všech vytvořených komponentů, protože to mám jako vlastní komponentu ten Button a přidávám ho do formu přes MyButton butt = new MyButton(); ve smyčce na vytvoření pole ... Nějaký rady?

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
19. 9. 2012   #6
-
0
-

Pořádně si přečti předchozí příspěvek mephiho. Pokud jsou data tvé hry "zakódované" v jejím grafickém vyjádření, tak se s tím strašně těžko pracuje. Samozřejmě to tak jde dělat, ale jsou lepší způsoby. Nejlepší je data oddělit a grafiku řešit jako nadstavbu - něco, co ty data používá a dle nich se přizpůsobuje zobrazení.

V tomto případě je základ dat jedno pole (3x3 nebo 4x4). Když si prázdné pole označíš 0 a zbylé odpovídajícím číslem, tak je poměrně jednoduché otestovat konec hry, že?

No pak ty data použiješ k zobrazení buttonů a popisů na nich.

A každý tah se projeví tak, že změníš data a pak podle nich udeláš překreslení.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
P
~ Anonymní uživatel
212 příspěvků
19. 9. 2012   #7
-
0
-

Zabavnejsi problem bude zacatek hry, tj. zamichat cisla tak, aby uloha byla resitelna...

Nahlásit jako SPAM
IP: 85.93.116.–
ingiraxo+15
Grafoman
19. 9. 2012   #8
-
0
-

hlavně pozor na to, že existují slepá místa, kde to není řešitelné a nelze to složit :)

aha.. viz. "P" :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
mutagen
~ Anonymní uživatel
549 příspěvků
19. 9. 2012   #9
-
0
-

tak ja uz podobne resil piskvorky ty me fungujou ale tady proste nevim vlastne ja uz to mam hotovy jenom jde o to jak zapisovat na urcitej btn souradnice a pak je vyhodnotit zda tam je nebo neni na ty pozici ... Kdyztak az prijdu ze skoly postu sem sln a kdyztak mi k tomureknete co by se melo vylepsit nebo popripade zkrytizovat :D

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.211.–
ingiraxo+15
Grafoman
19. 9. 2012   #10
-
0
-

no, ja to dneska ráno udělal, akorát jsem neřešil moc oficiální pravidla (hlavně se mi nechtělo babrat se souřadnicema), takže posouvání jde od prázdného pole v celé ose X a Y... ale jinak je to celkem jednoduchá záležitost :) Klidně dám link na binárku, jestli někdo chce, jinak screen http://ls.excode.org/4693/792031_Fifteen.png

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
19. 9. 2012   #11
-
0
-

#10 ingiraxo

Já to zase udělal jen takhle a zabralo mi to cca 2 hodiny ale jediny co chybí je vyhodnocení správné kombinace ...

SLN -> http://koukej.707.cz/obrazky/LoydFifteen.rar ... Kdyžtak připomínky, kritika, apod, budu jen rád, když mi řeknete co a jak se mohlo udělat líp, co mám třeba dobře řešený apod ... A nebo popřípadě, jak by bylo lepší to řešit (a prosím neukamentujte mě za to, že jsem tam 1 použil "goto" :D vím, že je to prasárna, ale vyřešilo to můj problém)

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
19. 9. 2012   #12
-
0
-

#11 Mutagen
ta správná kombinace je celkem lehká, jsem to řešil tak, že tlačítku jsem přidal parametr "id" jako to mas ty, a potom jen zkontroloval přes cyklus, jestli id jsou seřazený 

        private bool CheckWin()
        {
            bool win = true;

            // Controls.Count (16 - 1)
            for (int i = 0; i < parent.GamePanel.Count - 1; i++)
            {
                ButtonEx button = GetButton(i);

                if (button.ID != i + 1) // 1-15
                    win = false;
            }
            return win;
        }

když hráč kliknul na číslo, tak se prohodili pozice + jejich id a tím, že se prohodějí jejich id, tak je celkem snadný zjistit jestli si vyhrál :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
19. 9. 2012   #13
-
0
-

#12 ingiraxo
No jasný, já to mám udělaný celkem krkolomě udělaný, protože nevím jak si zistit všechny buttony apod, to bych musel předělat ... A asi začnu od znova uplně ... Ale jak jsi ty psal, že máš ID tak já to beru podle 2D pole, já bych potřeboval něco jako zjistění buttonu a pak jenom přes 2 fory kontrolovat zda tam není text kterej tam má bejt ... Ale získání toho btn je asi nejtěžší.

Nahlásit jako SPAM
IP: 89.190.90.–
P
~ Anonymní uživatel
212 příspěvků
19. 9. 2012   #14
-
0
-

   

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _15Puzzle
{
    public partial class Form1 : Form
    {
        TableLayoutPanel panel;
        Puzzle puzzle;

        public Form1()
        {
            InitializeComponent();
            Init();
        }

        private void Init()
        {
            this.Width = 290;
            this.Height = 314;
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            this.Text = "15 Puzzle";

            panel = new TableLayoutPanel();
            panel.Parent = this;
            panel.Dock = DockStyle.Fill;
            panel.RowCount = 4;
            panel.ColumnCount = 4;

            foreach (ColumnStyle style in panel.ColumnStyles)
            {
                style.SizeType = SizeType.AutoSize;
            }

            foreach (RowStyle style in panel.RowStyles)
            {
                style.SizeType = SizeType.AutoSize;
            }

            for (int i = 0; i <= 3; i++)
            {
                for (int j = 0; j <= 3; j++)
                {
                    if (i == 3 && j == 3)
                    {
                        break;
                    }
                    
                    Button btn = new Button();
                    btn.Size = new Size(65, 65);

                    btn.Parent = panel;
                    panel.SetCellPosition(btn, new TableLayoutPanelCellPosition(j, i));
                    
                    Font fnt = btn.Font;
                    btn.Font = new Font(fnt.FontFamily, 16, fnt.Style);
                    btn.Text = (4 * i + j + 1).ToString();
                    
                    btn.Click += new EventHandler(btn_Click);
                }
            }

            puzzle = new Puzzle();

        }

        private void btn_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            TableLayoutPanelCellPosition position = panel.GetCellPosition(btn);
            int row = position.Row;
            int column = position.Column;

            if (puzzle.Move(ref row, ref column))
            {
                panel.SetCellPosition(btn, new TableLayoutPanelCellPosition(column, row));
            }
        }
    }

    public class Puzzle
    {
        int[,] tiles;

        public Puzzle()
        {
            Init();
        }

        private void Init()
        {
            tiles = new int[4, 4];
            for (int i = 0; i <= 3; i++)
            {
                for (int j = 0; j <= 3; j++)
                {
                    tiles[i, j] = 4 * i + j + 1;
                }
            }
            tiles[3, 3] = 0;
        }

        public bool Move(ref int row, ref int column)
        {
            //test jestli je v okoli dlazdice prazdne misto
            for (int i = row - 1; i <= row + 1; i++)
            {
                for (int j = column - 1; j <= column + 1; j++)
                {
                    if (i >= 0 && i <= 3 && j >= 0 && j <= 3)
                    {
                        //je prazdne misto
                        if ((i == row || j == column) && tiles[i, j] == 0)
                        {
                            //posuneme dlazdici na prazdne misto
                            tiles[i, j] = tiles[row, column];
                            tiles[row, column] = 0;
                            row = i;
                            column = j;
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }
}
Nahlásit jako SPAM
IP: 83.240.80.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý