Skip to content
Snippets Groups Projects
Palikat.cs 17.7 KiB
Newer Older
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
//using Silk.NET.GLFW;
//using Silk.NET.Windowing;

namespace Palikat;

/// @author Atte Tuliainen
/// <summary>
/// Tämä on 2020-luvun versio klassisesta pulmapelistä, jossa erikokoiset palikat siirretään pinosta toiseen pinoon koko järjestykseen.
/// Haastetta tuo siirtojen laskuri. 
/// </summary>
public class Palikat : PhysicsGame
{
    private List<Label> valikonKohdat;
    private DoubleMeter pistelaskuri;
    private PhysicsObject palikka1;
    private PhysicsObject palikka2;
    private PhysicsObject palikka3;
    private PhysicsObject palikka4;
    private PhysicsObject alusta;
    private bool ekaoikein;
    private bool tokaoikein;
    private bool kolmasoikein;
    private bool neljasoikein;
    private EasyHighScore topLista = new EasyHighScore();
    private Vector palikanpaikka;
    private static readonly String[] kentta = //Luodaan taulukko jonka pohjalta luodaan pelikenttä ja palikat
    {
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                 4                 ",
        "                 3                 ",
        "                 2                 ",
        "                 1                 ",
        "        =        =        =        ",
    };
    private static readonly int tileWidth = 1500 / kentta[0].Length;
    private static readonly int tileHeight = 1000 / kentta.Length;
    public override void Begin()
    /// <summary>
    /// Aliohjelma luo pelikentän ja tarvittavat oliot sekä laskurin kentälle
    /// </summary>
    
    /// <summary>
    /// Luodaan pelaamisen mahdollistavat ohjaimet hiirelle
    /// </summary>
    void Kontrollit()
    {
        PhoneBackButton.Listen(Exit, "Lopeta peli");
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Lopeta peli");
        
        //kuunnellaan hiiren vasemman napin painalluksia palikoiden kohdalla ja kutsutaan siirtämisen mahdollistavaa aliohjelmaa painettaessa
        Mouse.ListenOn(palikka1, MouseButton.Left, ButtonState.Down, TartuPalikkaan1, "Ota kiinni palikasta");
        Mouse.ListenOn(palikka2, MouseButton.Left, ButtonState.Down, TartuPalikkaan2, "Ota kiinni palikasta");
        Mouse.ListenOn(palikka3, MouseButton.Left, ButtonState.Down, TartuPalikkaan3, "Ota kiinni palikasta");
        Mouse.ListenOn(palikka4, MouseButton.Left, ButtonState.Down, TartuPalikkaan4, "Ota kiinni palikasta");
        
        //aliohjelma joka siirtää palikkaa hiirenkursorin sijainnin mukaan
        void TartuPalikkaan1()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikanpaikka = palikka1.Position;
            palikka1.Position = Mouse.PositionOnWorld;
            
        }
        void TartuPalikkaan2()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikanpaikka = palikka2.Position;
            palikka2.Position = Mouse.PositionOnWorld;
        }
        void TartuPalikkaan3()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikanpaikka = palikka3.Position;
            palikka3.Position = Mouse.PositionOnWorld;
        }
        void TartuPalikkaan4()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikanpaikka = palikka4.Position;
            palikka4.Position = Mouse.PositionOnWorld;
        }
    }
    /// <summary>
    /// Luodaan pelin kolmiosainen aloitusvalikko
    /// </summary>
        Level.BackgroundColor = Color.Transparent;
        Label otsikko = new Label("Palikat järjestykseen 2023"); // Luodaan otsikko
        otsikko.Y = 150; // Otsikon sijainti
        otsikko.Font = new Font(60, true); // Otsikon fonttikoko ja boldaus
        otsikko.TextColor = Color.DarkBrown;
        valikonKohdat = new List<Label>(); // Alustetaan Label-tyyppinen lista, johon valikon kohdat tulevat
        Label kohta1 = new Label("Aloita uusi peli");  // Luodaan uusi Label-olio, joka toimii uuden pelin aloitusnappina
        kohta1.Position = new Vector(0, 90);  // Asetetaan valikon ensimmäisen napin paikka
        kohta1.TextColor = Color.Brown;
        valikonKohdat.Add(kohta1);  // Lisätään luotu valikon nappi listaan jossa kohtia säilytetään
        Label kohta2 = new Label("Parhaat pisteet");
        kohta2.Position = new Vector(0, 50);
        kohta2.TextColor = Color.Brown;
        valikonKohdat.Add(kohta2);

        Label kohta3 = new Label("Lopeta peli");
        kohta3.Position = new Vector(0, 10);
        kohta3.TextColor = Color.Brown;
        valikonKohdat.Add(kohta3);

        // Lisätään kaikki luodut kohdat peliin foreach-silmukalla
        foreach (Label valikonKohta in valikonKohdat)
        {
            Add(valikonKohta);
        }
        //Lisätään hiirikontrollit valikkoon jokaisen valikon napin kohdalle
        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, Peli, "Aloita uusi peli");
        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, ParhaatPisteet, "Näytä session parhaat tulokset");
        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, Exit, "Poistu ja sulje peli");
    /// <summary>
    /// Aliohjelma jota kutsutaan kun halutaan aloittaa uusi peli ensimmäisen kerran jälkeen
    /// </summary>
        ekaoikein = false;
        tokaoikein = false;
        kolmasoikein = false;
        neljasoikein = false;
    /// Parhaat pisteet näyttävä listaus
    private void ParhaatPisteet()
    {
    /// Aliohjelma jolla luodaan pelikenttä 
    {
        // määritetään pelikentän taustan väri
        Level.BackgroundColor = Color.Black;
        // lisätään pieni paivovoima, jotta palikat asettuvat paikalleen
        Gravity = new Vector(0, -80);
        //Luodaan pelikenttä ja palikat sekä alustat string-taulukosta "kentta"
        TileMap tiles = TileMap.FromStringArray(kentta);
        //Määritetään pelin osien mappaus taulukon merkkeihin ja luodaan ne muutaman attribuutin kera kutsumalla aliohjelmaa
        tiles.SetTileMethod('1', LuoPalikka1, Color.Yellow); //palikka1
        tiles.SetTileMethod('2', LuoPalikka2, Color.Yellow); //palikka2
        tiles.SetTileMethod('3', LuoPalikka3, Color.Yellow); //palikka3
        tiles.SetTileMethod('4', LuoPalikka4, Color.Yellow); //palikka4
        tiles.SetTileMethod('=', LuoAlusta, Color.Gray); //alustat
        tiles.Execute(tileWidth, tileHeight);
        
        //Luodaan ohuet reunat pelialueella ja kohdistetaan kamera pelin osiin
        Level.CreateBorders(5, 5, 2, 1, Color.White);
        Camera.ZoomToAllObjects();
    }
    /// <summary>
    /// Aliohjelma joka luo laskurin, joka laskee montako siirtoa pelaaja on tehnyt
    /// </summary>
    public void LuoPistelaskuri()
    {
        // alustetaan laskuri siten että on alussa oikeasti nolla, nyt ottaa palikoiden "asettumisen" siirtoina +4
        pistelaskuri = new DoubleMeter(-4, -100, 100);
        //Luodaan label johon piste/siirtolaskuri kiinnitetään ja lisätään Label näkyviin pelissä sopivan näköisenä
        Label siirtolaskuri = new Label();
        siirtolaskuri.X = Screen.Right -150;
        siirtolaskuri.Y = Screen.Top -80;
        siirtolaskuri.TextColor = Color.BloodRed;
        siirtolaskuri.Color = Color.Black;
        siirtolaskuri.Font = new Font(40, true);
        siirtolaskuri.DoubleFormatString = "Siirtoja tehty: {0:N0}";
        siirtolaskuri.BindTo(pistelaskuri);
        Add(siirtolaskuri);
    }
    
    /// <summary>
    /// Aliohjelma jolla luodaan siirreltävä palikka omana olionaan, määritellään sen törmäykset ja vaikutukset siirtolaskuriin
    /// </summary>
    /// <param name="paikka"> paikka vektorina johon palikka luodaan</param>
    /// <param name="leveys"> palikan leveys</param>
    /// <param name="korkeus"> palikan korkeus</param>
    /// <param name="vari"> palikan vari</param>
    /// <param name="kuva"> palikan kuva</param>
    /// <param name="kerroin"> palikan leveyden kerroin</param>
    void LuoPalikka1(Vector paikka, double leveys, double korkeus, Color vari)
        palikka1 = new PhysicsObject(leveys*6, korkeus);
        palikka1.Position = paikka;
        palikka1.Color = vari;
        palikka1.Tag = "palikka1";
        palikka1.Image = LoadImage("palikka1");
        //palikat[0] = palikka1;
        Add(palikka1);
        //Määritetään mitä tapahtuu kun palikka törmää toisiin palikoihin tai alustaan
        AddCollisionHandler(palikka1, "alusta", PalikkaOsuuAlustaan);
        AddCollisionHandler(palikka1, "palikka2", Palikka1OsuuPalikkaan2);
        AddCollisionHandler(palikka1, "palikka3", Palikka1OsuuPalikkaan3);
        AddCollisionHandler(palikka1, "palikka4", Palikka1OsuuPalikkaan4);
    }
    
    
    /// <summary>
    /// Aliohjelma jolla luodaan siirreltävä palikka omana olionaan, määritellään sen törmäykset ja vaikutukset siirtolaskuriin
    /// </summary>
    /// <param name="paikka"> paikka vektorina johon palikka luodaan</param>
    /// <param name="leveys"> palikan leveys</param>
    /// <param name="korkeus"> palikan korkeus</param>
    /// <param name="vari"> palikan vari</param>
    void LuoPalikka2(Vector paikka, double leveys, double korkeus, Color vari)
    {
        palikka2 = new PhysicsObject(leveys*4.5, korkeus);
        palikka2.Position = paikka;
        palikka2.Color = vari;
        palikka2.Tag = "palikka2";
        palikka2.Image = LoadImage("palikka2");
        //palikat[1] = palikka2;
        Add (palikka2);
        //Määritetään mitä tapahtuu kun palikka törmää toisiin palikoihin tai alustaan
        AddCollisionHandler(palikka2, "alusta", PalikkaOsuuAlustaan);
        AddCollisionHandler(palikka2, "palikka3", Palikka2OsuuPalikkaan3);
        AddCollisionHandler(palikka2, "palikka4", Palikka2OsuuPalikkaan4);
    }
    
    
    /// <summary>
    /// Aliohjelma jolla luodaan siirreltävä palikka omana olionaan, määritellään sen törmäykset ja vaikutukset siirtolaskuriin
    /// </summary>
    /// <param name="paikka"> paikka vektorina johon palikka luodaan</param>
    /// <param name="leveys"> palikan leveys</param>
    /// <param name="korkeus"> palikan korkeus</param>
    /// <param name="vari"> palikan vari</param>
    void LuoPalikka3(Vector paikka, double leveys, double korkeus, Color vari)
    {
        palikka3 = new PhysicsObject(leveys*3, korkeus);
        palikka3.Position = paikka;
        palikka3.Color = vari;
        palikka3.Tag = "palikka3";
        palikka3.Image = LoadImage("palikka3");
        //palikat[2] = palikka3;
        Add (palikka3);
        //Määritetään mitä tapahtuu kun palikka törmää toisiin palikoihin tai alustaan
        AddCollisionHandler(palikka3, "alusta", PalikkaOsuuAlustaan);
        AddCollisionHandler(palikka3, "palikka4", Palikka3OsuuPalikkaan4);
    
    /// <summary>
    /// Aliohjelma jolla luodaan siirreltävä palikka omana olionaan, määritellään sen törmäykset ja vaikutukset siirtolaskuriin
    /// </summary>
    /// <param name="paikka"> paikka vektorina johon palikka luodaan</param>
    /// <param name="leveys"> palikan leveys</param>
    /// <param name="korkeus"> palikan korkeus</param>
    /// <param name="vari"> palikan vari</param>
    void LuoPalikka4(Vector paikka, double leveys, double korkeus, Color vari)
    {
        palikka4 = new PhysicsObject(leveys*1.5, korkeus);
        palikka4.Position = paikka;
        palikka4.Color = vari;
        palikka4.Tag = "palikka4";
        palikka4.Image = LoadImage("palikka1");
        //palikat[3] = palikka4;
        Add (palikka4);
        
        //Määritetään mitä tapahtuu kun palikka törmää toisiin palikoihin tai alustaan
        AddCollisionHandler(palikka4, "alusta", PalikkaOsuuAlustaan);
    }
    /// <summary>
    /// Aliohjelma joka luo alusta jonka päälle palikoita pelissä järjestelläään
    /// </summary>
    /// <param name="paikka"> paikka vektorina johon palikka luodaan</param>
    /// <param name="leveys"> palikan leveys</param>
    /// <param name="korkeus"> palikan korkeus</param>
    /// <param name="vari"> palikan vari</param>
    void LuoAlusta(Vector paikka, double leveys, double korkeus, Color vari)
        PhysicsObject alusta = new PhysicsObject(leveys*8, korkeus);
        alusta.Position = paikka;
        alusta.Color = vari;
        alusta.Image = LoadImage("platform");
        alusta.Tag = "alusta";
        Add(alusta);
    }
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu alustaa
    /// </summary>
    void PalikkaOsuuAlustaan(PhysicsObject palikka, PhysicsObject alusta)
        pistelaskuri.Value += 1;
        Console.WriteLine("Palikka osui alustaan"); //osuma näkyy konsolissa - poistetaan valmiista
        if (palikka == palikka1 && pistelaskuri.Value > 6)
        {
            ekaoikein = true;
            tokaoikein = false;
            kolmasoikein = false;
            neljasoikein = false;
            Console.WriteLine("Eka palikka oikein!");
        }
    }

    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka1OsuuPalikkaan2(PhysicsObject p1, PhysicsObject p2)
    {
        //laskurin arvo kasvaa yhdellä
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka1 osui palikkaan2"); //osuma näkyy konsolissa - poistetaan valmiista
        
        if (ekaoikein == true && palikka2.Position.Y > palikka1.Position.Y)
        {
            tokaoikein = true;
            kolmasoikein = false;
            neljasoikein = false;
            Console.WriteLine("Toka palikka oikein!");
        }
        //if (palikka2.Position.Y < palikka1.Position.Y && palikka2.Position.X)
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka1OsuuPalikkaan3(PhysicsObject p1, PhysicsObject p2)
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka1 osui palikkaan3"); //osuma näkyy konsolissa - poistetaan valmiista
    }

    
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka1OsuuPalikkaan4(PhysicsObject p1, PhysicsObject p2)
    {
        //laskurin arvo kasvaa yhdellä
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka1 osui palikkaan4"); //osuma näkyy konsolissa - poistetaan valmiista
    }
    
    
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka2OsuuPalikkaan3(PhysicsObject p1, PhysicsObject p2)
    {
        //laskurin arvo kasvaa yhdellä
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka2 osui palikkaan3"); //osuma näkyy konsolissa - poistetaan valmiista
        
        if (tokaoikein == true && palikka3.Position.Y > palikka2.Position.Y && palikka1.Position.Y < palikka2.Position.Y)
            kolmasoikein = true;
            neljasoikein = false;
            Console.WriteLine("KOLMAS palikka oikein!");
    
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka2OsuuPalikkaan4(PhysicsObject p1, PhysicsObject p2)
    {
        //laskurin arvo kasvaa yhdellä
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka2 osui palikkaan4"); //osuma näkyy konsolissa - poistetaan valmiista
    
    /// <summary>
    /// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
    /// </summary>
    void Palikka3OsuuPalikkaan4(PhysicsObject p1, PhysicsObject p2)
        //laskurin arvo kasvaa yhdellä
        pistelaskuri.Value += 1.0;
        Console.WriteLine("Palikka3 osui palikkaan4"); //osuma näkyy konsolissa - poistetaan valmiista
        if (kolmasoikein == true && palikka4.Position.Y > palikka3.Position.Y)
        {
            neljasoikein = true;
            Console.WriteLine("NELJÄS PALIKKA OIKEIN!"); //näkyy konsolissa - poistetaan valmiista
            Voitto();
        }
    }
    
    
    /// <summary>
    /// Aliohjelma jota kutsutaan kun peli on pelattu läpi ja jolla kirjataan highscore
    /// </summary>
    void Voitto()
    {
        topLista.EnterAndShow(pistelaskuri.Value);