Changeset 1027 for 2010/24


Ignore:
Timestamp:
2010-06-29 11:02:21 (11 years ago)
Author:
anlakane
Message:

Refaktorointia + vähän muuta. Paikka (korostettavalle/käännettävälle) kortille saadaan nyt omasta rakenteesta. Korteilla on nyt kokonaislukutunniste, jonka perusteella voidaan etsiä pareja.

Location:
2010/24/anlakane/Muistipeli
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • 2010/24/anlakane/Muistipeli/Kortti.cs

    r1020 r1027  
    1616        private Image kuvapuoliTekstuuri; 
    1717        private Image takapuoliTekstuuri; 
    18  
     18         
    1919        public enum PuoliEsilla { Kuva, Taka } 
    2020 
     
    2626        } 
    2727 
    28         public Kortti(double width, double height, bool kuvapuoliEsilla, Image kuvapuoliTekstuuri, Image takapuoliTekstuuri) 
     28        private int tunnus; 
     29 
     30        /// <summary> 
     31        /// Kortin tunnus, jolla parit tunnistetaan pariksi. 
     32        /// </summary> 
     33        public int Tunnus 
     34        { 
     35            get { return tunnus; } 
     36        } 
     37 
     38 
     39        public Kortti(double width, double height, bool kuvapuoliEsilla, Image kuvapuoliTekstuuri, Image takapuoliTekstuuri, int tunnus) 
    2940            : base(width, height, Shapes.Rectangle) 
    3041        { 
     
    4253            IsUpdated = true; 
    4354            this.alkuperainenKoko = new Vector(width, height); 
     55            this.tunnus = tunnus; 
     56 
    4457        } 
    4558 
  • 2010/24/anlakane/Muistipeli/Muistipeli.csproj

    r1020 r1027  
    5757  </PropertyGroup> 
    5858  <ItemGroup> 
    59     <Reference Include="Jypeli2, Version=2.1.9.0, Culture=neutral, processorArchitecture=x86"> 
     59    <Reference Include="Jypeli2, Version=2.3.0.0, Culture=neutral, processorArchitecture=x86"> 
    6060      <SpecificVersion>False</SpecificVersion> 
    61       <HintPath>..\..\..\..\..\lib\2.1.9\Jypeli2.dll</HintPath> 
     61      <HintPath>..\..\..\..\..\npo\trunk\Jypeli\bin\x86\Debug\Jypeli2.dll</HintPath> 
    6262    </Reference> 
    6363    <Reference Include="Microsoft.Xna.Framework, Version=3.1.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" /> 
  • 2010/24/anlakane/Muistipeli/Muistipeli.sln

    r874 r1027  
    11 
    22Microsoft Visual Studio Solution File, Format Version 10.00 
    3 # Visual C# Express 2008 
     3# Visual Studio 2008 
    44Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Muistipeli", "Muistipeli.csproj", "{57B3D291-FDE2-4D60-ADFD-1D6855A75FB5}" 
     5        ProjectSection(ProjectDependencies) = postProject 
     6                {1E963378-DFC6-425B-9AE1-236BE550E5FD} = {1E963378-DFC6-425B-9AE1-236BE550E5FD} 
     7        EndProjectSection 
     8EndProject 
     9Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jypeli", "..\..\..\..\..\npo\trunk\Jypeli\Jypeli.csproj", "{1E963378-DFC6-425B-9AE1-236BE550E5FD}" 
    510EndProject 
    611Global 
     
    1621                {A41B15D2-EF63-4B64-8585-DEEEDCDAA1C0}.Debug|x86.ActiveCfg = Debug|x86 
    1722                {A41B15D2-EF63-4B64-8585-DEEEDCDAA1C0}.Release|x86.ActiveCfg = Release|x86 
     23                {1E963378-DFC6-425B-9AE1-236BE550E5FD}.Debug|x86.ActiveCfg = Debug|x86 
     24                {1E963378-DFC6-425B-9AE1-236BE550E5FD}.Debug|x86.Build.0 = Debug|x86 
     25                {1E963378-DFC6-425B-9AE1-236BE550E5FD}.Release|x86.ActiveCfg = Release|x86 
     26                {1E963378-DFC6-425B-9AE1-236BE550E5FD}.Release|x86.Build.0 = Release|x86 
     27                {DD9E5CAB-9ADA-4514-8B3C-0CCAD8420947}.Debug|x86.ActiveCfg = Debug|x86 
     28                {DD9E5CAB-9ADA-4514-8B3C-0CCAD8420947}.Release|x86.ActiveCfg = Release|x86 
    1829        EndGlobalSection 
    1930        GlobalSection(SolutionProperties) = preSolution 
  • 2010/24/anlakane/Muistipeli/Peli2.cs

    r1020 r1027  
    33using System.Collections.Generic; 
    44using Jypeli; 
     5using Jypeli.Widgets; 
    56using Jypeli.ScreenObjects; 
    67using Jypeli.Assets; 
     
    89namespace Muistipeli 
    910{ 
     11    public struct Paikka 
     12    { 
     13        public int Rivi; 
     14        public int Sarake; 
     15 
     16        public Paikka(int rivi, int sarake) 
     17        { 
     18            Rivi = rivi; 
     19            Sarake = sarake; 
     20        } 
     21    } 
     22 
    1023    public class Peli2 : Game 
    1124    { 
    1225        int montakoRivia; 
    1326        int montakoSaraketta; 
    14         bool voikoKaantaa; 
    1527 
    1628        double korttienVali = 20.0; 
     
    1931        double kortinKorkeus = 70; 
    2032        Kortti[,] kortit; // rivit, sarakkeet 
    21         int[,] korostettuKortti; 
     33        Paikka korostettuKortti; 
    2234        int montakoKorttia; 
     35        int[] montakoKutakinKorttitunnusta; 
     36 
    2337        public enum Suunta { Vasen, Oikea, Ylos, Alas } 
    2438        Suunta mihinSuuntaanMenossa; 
     
    3751            LisaaKuvat(); 
    3852 
    39             montakoKorttia = 52; 
     53            montakoKorttia = 16; 
     54            montakoKutakinKorttitunnusta = new int[montakoKorttia / 2]; // kortin tunnusNro indeksistä, alkiot tulkitaan siten että "montako tämän tunnuksen alkiota on lisätty peliin" 
    4055            kaannetyt = new List<Kortti>(); 
    4156 
    4257            // Laitetaan ensin rivejä ja sarakkeita yhtä paljon 
    4358            montakoSaraketta = (int)Math.Sqrt(montakoKorttia); 
    44             // Sitte laitetaan kortit vähän mukavempaan muotoon kun näytöt on yleensä leveämpiä kuin korkeita 
     59            // Kortit vähän mukavempaan muotoon, koska näytöt on yleensä leveämpiä kuin korkeita 
    4560            montakoSaraketta = (int)Math.Floor((3.0 / 2.0) * montakoSaraketta); 
    4661            // Tarvittavien rivien määrä saadaan korttien määrän ja saadun sarakkeiden määrän suhteesta 
     
    8095        void AloitaPeli() 
    8196        { 
    82             korostettuKortti = new int[2, 1]; 
    83             KorostaKortti(new int[2, 1] { { 0 }, { 0 } }); 
    84             voikoKaantaa = true; 
     97            korostettuKortti = new Paikka(0, 0); 
     98            KorostaKortti(new Paikka(0, 0)); 
    8599        } 
    86100 
     
    109123        void KaannaKortti() 
    110124        { 
    111             if (voikoKaantaa) 
    112             { 
    113                 // Ei käännetä kahta kertaa samaa korttia 
    114                 if (kaannetyt.Count == 0 || kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]] != kaannetyt[0]) 
    115                 { 
    116                     kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]].Kaanna(); 
    117                     kaannetyt.Add(kortit[korostettuKortti[0, 0], korostettuKortti[1, 0]]); 
    118  
    119                     if (kaannetyt.Count == 2) 
     125            if (VoikoKorttiaKaantaa(kortit[korostettuKortti.Rivi, korostettuKortti.Sarake])) 
     126            { 
     127                kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].Kaanna(); 
     128                kaannetyt.Add(kortit[korostettuKortti.Rivi, korostettuKortti.Sarake]); 
     129 
     130                if (kaannetyt.Count == 2) // Tasan kaksi korttia käännetään yhdellä vuorolla 
     131                { 
     132                    if (kaannetyt[0].Tunnus == kaannetyt[1].Tunnus) 
     133                    { 
     134                        MessageDisplay.Add("Pari löytyi!"); 
     135                        foreach (Kortti kaannetty in kaannetyt) 
     136                        { 
     137                            kaannetty.OnkoPoistettuPelista = true; 
     138                        } 
     139                        kaannetyt.Clear(); 
     140                    } 
     141                    else 
    120142                    { 
    121143                        // Jos kaksi korttia on käännetty niin ajastin lähtee käyntiin eikä sinä aikana voi kääntää kortteja 
    122                         voikoKaantaa = false; 
     144                        Keyboard.Disable(Key.Space); 
    123145                        piilotusAjastin.Start(); 
    124146                    } 
     
    127149        } 
    128150 
     151        public bool VoikoKorttiaKaantaa(Kortti kortti) 
     152        { 
     153            // Ei käännetä kahta kertaa samaa korttia 
     154            if (kaannetyt.Count == 0 || kortit[korostettuKortti.Rivi, korostettuKortti.Sarake] != kaannetyt[0]) 
     155            { 
     156                // Jos kortti "on jo löydetty", niin sitä ei voi missään tapauksessa kääntää 
     157                bool onkoPoistettuPelista = kortit[korostettuKortti.Rivi, korostettuKortti.Sarake].OnkoPoistettuPelista; 
     158 
     159                if (!onkoPoistettuPelista) 
     160                { 
     161                    return true; 
     162                } 
     163            } 
     164            return false; 
     165        } 
     166 
    129167        void PiilotaKaannetyt(Timer t) 
    130168        { 
     
    135173            kaannetyt.Clear(); 
    136174            piilotusAjastin.Stop(); 
    137             voikoKaantaa = true; 
    138         } 
    139  
    140         void KorostaKortti(int[,] kortinNro) 
    141         { 
    142             kortinNro = TarkistaKortinNro(kortinNro); 
    143             highlighter.Position = new Vector(KortinX(kortinNro[1, 0]), KortinY(kortinNro[0, 0])); 
    144             Kortti.PuoliEsilla puoliesilla = kortit[kortinNro[0, 0], kortinNro[1, 0]].KumpiPuoliEsilla(); 
    145             korostettuKortti = kortinNro; 
     175            Keyboard.Enable(Key.Space); 
     176        } 
     177 
     178        void KorostaKortti(Paikka korostettavaKortti) 
     179        { 
     180            korostettavaKortti = TarkistaKortinNro(korostettavaKortti); 
     181            highlighter.Position = new Vector(KortinX(korostettavaKortti.Sarake), KortinY(korostettavaKortti.Rivi)); 
     182            Kortti.PuoliEsilla puoliesilla = kortit[korostettavaKortti.Rivi, korostettavaKortti.Sarake].KumpiPuoliEsilla(); 
     183            korostettuKortti = korostettavaKortti; 
    146184        } 
    147185 
     
    154192        /// <param name="kortinNro">Kortin rivi, sarake</param> 
    155193        /// <returns>"Korjatut" koordinaatit</returns> 
    156         private int[,] TarkistaKortinNro(int[,] kortinNro) 
     194        private Paikka TarkistaKortinNro(Paikka paikka) 
    157195        { 
    158196            // Viimeisen rivin jälkeen palataan ensimmäiselle riville 
    159             if (kortinNro[0, 0] >= montakoRivia) 
    160                 kortinNro[0, 0] = 0; 
     197            if (paikka.Rivi >= montakoRivia) 
     198                paikka.Rivi = 0; 
    161199 
    162200            // Viimeisen sarakkeen jälkeen palataan ensimmäiseen sarakkeeseen 
    163             if (kortinNro[1, 0] >= montakoSaraketta) 
    164                 kortinNro[1, 0] = 0; 
     201            if (paikka.Sarake >= montakoSaraketta) 
     202                paikka.Sarake = 0; 
    165203 
    166204            // Ensimmäisestä rivistä "taaksepäin" liikuttaessa 
    167205            // hypätään viimeiselle riville 
    168             if (kortinNro[0, 0] < 0) 
    169                 kortinNro[0, 0] = montakoRivia - 1; 
     206            if (paikka.Rivi < 0) 
     207                paikka.Rivi = montakoRivia - 1; 
    170208 
    171209            // Ensimmäisestä sarakkeesta "taaksepäin" liikuttaessa 
    172210            // hypätään viimeiseen sarakkeeseen 
    173             if (kortinNro[1, 0] < 0) 
    174                 kortinNro[1, 0] = montakoSaraketta - 1; 
     211            if (paikka.Sarake < 0) 
     212                paikka.Sarake = montakoSaraketta - 1; 
    175213 
    176214            // Mentiin pelipakan "tyhjälle alueelle" 
    177             if (kortit[kortinNro[0, 0], kortinNro[1, 0]] == null) 
    178                 kortinNro = TultiinNullViitteeseen(kortinNro); 
    179  
    180             return kortinNro; 
    181         } 
    182  
    183         private int[,] TultiinNullViitteeseen(int[,] kortinNro) 
     215            if (kortit[paikka.Rivi, paikka.Sarake] == null) 
     216                paikka = TultiinNullViitteeseen(paikka); 
     217 
     218            return paikka; 
     219        } 
     220 
     221        private Paikka TultiinNullViitteeseen(Paikka kortinPaikka) 
    184222        { 
    185223            if (mihinSuuntaanMenossa == Suunta.Vasen) 
    186                 return new int[2, 1] { { korostettuKortti[0, 0] }, { (montakoKorttia % montakoSaraketta) - 1 } }; 
     224                return new Paikka(kortinPaikka.Rivi, (montakoKorttia % montakoSaraketta) - 1); 
    187225            if (mihinSuuntaanMenossa == Suunta.Oikea) 
    188                 return new int[2, 1] { { korostettuKortti[0, 0] }, { 0 } }; 
     226                return new Paikka(kortinPaikka.Rivi, 0); 
    189227            if (mihinSuuntaanMenossa == Suunta.Ylos) 
    190                 return new int[2, 1] { { montakoRivia - 2 }, { korostettuKortti[1, 0] } }; 
     228                return new Paikka(montakoRivia - 2, kortinPaikka.Sarake); 
    191229 
    192230            // alas 
    193             return new int[2, 1] { { 0 }, { korostettuKortti[1, 0] } }; 
    194  
     231            return new Paikka(0, kortinPaikka.Sarake); 
    195232        } 
    196233 
     
    199236            mihinSuuntaanMenossa = suunta; 
    200237            if (mihinSuuntaanMenossa == Suunta.Vasen) 
    201             { 
    202                 KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] - 1 } }); 
    203             } 
     238                KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake - 1)); 
     239 
    204240            if (mihinSuuntaanMenossa == Suunta.Oikea) 
    205             { 
    206                 KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] }, { korostettuKortti[1, 0] + 1 } }); 
    207             } 
     241                KorostaKortti(new Paikka(korostettuKortti.Rivi, korostettuKortti.Sarake + 1)); 
     242 
    208243            if (mihinSuuntaanMenossa == Suunta.Ylos) 
    209             { 
    210                 KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] - 1 }, { korostettuKortti[1, 0] } }); 
    211             } 
     244                KorostaKortti(new Paikka(korostettuKortti.Rivi - 1, korostettuKortti.Sarake)); 
     245 
    212246            if (mihinSuuntaanMenossa == Suunta.Alas) 
    213             { 
    214                 KorostaKortti(new int[2, 1] { { korostettuKortti[0, 0] + 1 }, { korostettuKortti[1, 0] } }); 
    215  
    216             } 
    217             //KorostaKortti(kortti); 
     247                KorostaKortti(new Paikka(korostettuKortti.Rivi + 1, korostettuKortti.Sarake)); 
    218248        } 
    219249 
     
    241271                    kortit[r, s] = TeeKortti(); 
    242272                    Add(kortit[r, s]); 
     273                    Label tunnusTeksti = new Label(); 
     274                    tunnusTeksti.Text = kortit[r, s].Tunnus.ToString(); 
     275                    tunnusTeksti.TextColor = Color.White; 
     276                    Add(tunnusTeksti); 
    243277 
    244278                    kortit[r, s].X = KortinX(s); 
    245279                    kortit[r, s].Y = KortinY(r); 
    246  
     280                    tunnusTeksti.Position = new Vector(kortit[r, s].X, kortit[r, s].Y); 
    247281                    montakoKorttiaLisatty++; 
    248282                } 
     
    265299            Image kuvaTekstuuri = LoadImage("kortti1"); 
    266300            Image takaTekstuuri = LoadImage("taka"); 
    267             return new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri); 
     301            int tunnus; 
     302            while (true) 
     303            { 
     304                tunnus = RandomGen.NextInt(0, montakoKutakinKorttitunnusta.Length - 1); 
     305                if (montakoKutakinKorttitunnusta[tunnus] < 2) 
     306                { 
     307                    montakoKutakinKorttitunnusta[tunnus]++; 
     308                    break; 
     309                } 
     310            } 
     311 
     312            return new Kortti(kortinLeveys, kortinKorkeus, false, kuvaTekstuuri, takaTekstuuri, tunnus); 
    268313        } 
    269314    } 
Note: See TracChangeset for help on using the changeset viewer.