Newer
Older
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
Tuliainen Atte
committed
/// @version 23.11.2023
/// Tämä on 2020-luvun versio klassisesta pulmapelistä, jossa erikokoiset palikat siirretään pinosta toiseen pinoon koko järjestykseen.
/// </summary>
public class Palikat : PhysicsGame
{
private List<Label> valikonKohdat;
private DoubleMeter pistelaskuri;
Tuliainen Atte
committed
private int peliKerrat = 0;
Tuliainen Atte
committed
private PhysicsObject palikka1;
private PhysicsObject palikka2;
private PhysicsObject palikka3;
private PhysicsObject palikka4;
Tuliainen Atte
committed
private PhysicsObject alusta;
private bool ekaoikein;
private bool tokaoikein;
private bool kolmasoikein;
private bool neljasoikein;
Tuliainen Atte
committed
private EasyHighScore topLista = new EasyHighScore();
private Vector palikanpaikka;
Tuliainen Atte
committed
private static readonly String[] kentta = //Luodaan taulukko jonka pohjalta luodaan pelikenttä ja palikat
{
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" 4 ",
" 3 ",
" 2 ",
" 1 ",
" = = = ",
};
Tuliainen Atte
committed
//asetetaan yhden ruudun leveys ja korkeus
private static readonly int tileWidth = 1500 / kentta[0].Length;
private static readonly int tileHeight = 1000 / kentta.Length;
public override void Begin()
Tuliainen Atte
committed
{
Tuliainen Atte
committed
}
Tuliainen Atte
committed
/// <summary>
/// Aliohjelma luo pelikentän ja tarvittavat oliot sekä laskurin kentälle
/// </summary>
Tuliainen Atte
committed
if (peliKerrat > 0)
Tuliainen Atte
committed
AloitaAlusta();
return;
Tuliainen Atte
committed
}
Tuliainen Atte
committed
Tuliainen Atte
committed
LuoKentta();
Tuliainen Atte
committed
Kontrollit();
Tuliainen Atte
committed
LuoPistelaskuri();
peliKerrat++;
/// <summary>
/// Luodaan pelaamisen mahdollistavat ohjaimet hiirelle
/// </summary>
Tuliainen Atte
committed
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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
Tuliainen Atte
committed
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);
}
Tuliainen Atte
committed
//Lisätään hiirikontrollit valikkoon jokaisen valikon napin kohdalle
Tuliainen Atte
committed
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");
Tuliainen Atte
committed
/// <summary>
/// Aliohjelma jota kutsutaan kun halutaan aloittaa uusi peli ensimmäisen kerran jälkeen
/// </summary>
Tuliainen Atte
committed
private void AloitaAlusta()
{
Tuliainen Atte
committed
ClearControls();
ClearAll();
LuoKentta();
Tuliainen Atte
committed
Kontrollit();
Tuliainen Atte
committed
ekaoikein = false;
tokaoikein = false;
kolmasoikein = false;
neljasoikein = false;
Tuliainen Atte
committed
LuoPistelaskuri();
Tuliainen Atte
committed
Valikko();
Tuliainen Atte
committed
peliKerrat++;
}
private void ParhaatPisteet()
{
Tuliainen Atte
committed
topLista.Show();
Tuliainen Atte
committed
Tuliainen Atte
committed
public void LuoKentta()
{
// 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);
Tuliainen Atte
committed
//Määritetään pelin osien mappaus taulukon merkkeihin ja luodaan ne muutaman attribuutin kera kutsumalla aliohjelmaa
Tuliainen Atte
committed
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();
}
Tuliainen Atte
committed
/// <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);
Tuliainen Atte
committed
//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);
Tuliainen Atte
committed
siirtolaskuri.DoubleFormatString = "Siirtoja tehty: {0:N0}";
siirtolaskuri.BindTo(pistelaskuri);
Add(siirtolaskuri);
}
Tuliainen Atte
committed
Tuliainen Atte
committed
/// Aliohjelma jolla luodaan siirreltävä palikka omana olionaan, määritellään sen törmäykset ja vaikutukset siirtolaskuriin
Tuliainen Atte
committed
/// <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>
Tuliainen Atte
committed
void LuoPalikka1(Vector paikka, double leveys, double korkeus, Color vari)
Tuliainen Atte
committed
palikka1 = new PhysicsObject(leveys*6, korkeus);
palikka1.Position = paikka;
palikka1.Color = vari;
palikka1.Tag = "palikka1";
palikka1.Image = LoadImage("palikka1");
//palikat[0] = palikka1;
Add(palikka1);
Tuliainen Atte
committed
//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>
Tuliainen Atte
committed
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);
Tuliainen Atte
committed
Tuliainen Atte
committed
//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>
Tuliainen Atte
committed
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);
Tuliainen Atte
committed
Tuliainen Atte
committed
//Määritetään mitä tapahtuu kun palikka törmää toisiin palikoihin tai alustaan
AddCollisionHandler(palikka3, "alusta", PalikkaOsuuAlustaan);
AddCollisionHandler(palikka3, "palikka4", Palikka3OsuuPalikkaan4);
Tuliainen Atte
committed
/// <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>
Tuliainen Atte
committed
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);
}
Tuliainen Atte
committed
/// Aliohjelma joka luo alusta jonka päälle palikoita pelissä järjestelläään
/// <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>
Tuliainen Atte
committed
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";
Tuliainen Atte
committed
/// <summary>
/// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu alustaa
/// </summary>
Tuliainen Atte
committed
void PalikkaOsuuAlustaan(PhysicsObject palikka, PhysicsObject alusta)
{
Tuliainen Atte
committed
//laskurin arvo kasvaa yhdellä
pistelaskuri.Value += 1;
Tuliainen Atte
committed
Console.WriteLine("Palikka osui alustaan"); //osuma näkyy konsolissa - poistetaan valmiista
Tuliainen Atte
committed
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>
Tuliainen Atte
committed
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)
Tuliainen Atte
committed
Tuliainen Atte
committed
}
Tuliainen Atte
committed
/// <summary>
/// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
/// </summary>
Tuliainen Atte
committed
void Palikka1OsuuPalikkaan3(PhysicsObject p1, PhysicsObject p2)
{
Tuliainen Atte
committed
//laskurin arvo kasvaa yhdellä
Tuliainen Atte
committed
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>
Tuliainen Atte
committed
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>
Tuliainen Atte
committed
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)
Tuliainen Atte
committed
{
Tuliainen Atte
committed
kolmasoikein = true;
neljasoikein = false;
Console.WriteLine("KOLMAS palikka oikein!");
Tuliainen Atte
committed
}
Tuliainen Atte
committed
}
/// <summary>
/// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
/// </summary>
Tuliainen Atte
committed
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
}
Tuliainen Atte
committed
/// <summary>
/// Aliohjelma jollla määritellään mita tapahtuu kun palikka osuu toiseen palikkaan
/// </summary>
Tuliainen Atte
committed
void Palikka3OsuuPalikkaan4(PhysicsObject p1, PhysicsObject p2)
Tuliainen Atte
committed
//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>
Tuliainen Atte
committed
void Voitto()
{
topLista.EnterAndShow(pistelaskuri.Value);