Najprv si vytvoríme triedu (class) segment , ktorá bude reprezentovať jednu kocku z nášho hadika. Mohla by vyzerať napr. takto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace hra_hadik
{
class Segment : ICloneable
{
private Rectangle rectangle;
public Segment(int width, int height, int x, int y)
{
this.rectangle = new Rectangle(x, y, width, height);
}
public int X
{
get { return this.rectangle.X; }
set { this.rectangle.X = value; }
}
public int Y
{
get { return this.rectangle.Y; }
set { this.rectangle.Y = value; }
}
public Rectangle ToRectangle()
{
return this.rectangle;
}
public object Clone()
{
return MemberwiseClone();
}
}
}
Ďalej nám treba spraviť triedu hadika, ktorú nazveme napr snake a bude vyzerať takto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace hra_hadik
{
class Snake
{
private readonly List<Segment> segments;
public static readonly int width = 10;
public static readonly int height = 10;
private int skore = 0;
public Snake()
{
this.segments = new List<Segment>();
Segment segment = new Segment(width, height, 0, 0);
this.segments.Insert(0, segment);
segment = new Segment(width, height, width, 0);
this.segments.Insert(1, segment);
//hlava hadika
segment = new Segment(width, height, 2 * width, 0);
this.segments.Insert(2, segment);
}
public bool RovnakySegment(Segment mySegment1, Segment mySgment2)
{
return ((mySegment1.X == mySgment2.X) && (mySegment1.Y == mySgment2.Y));
}
public bool PohniHadika()
{
//posunieme telo hadika
for (int i = 0; i < this.PoziciaHlavy; i++)
{
this.segments[i] = this.segments[i + 1].Clone() as Segment;
}
//posunieme hlavu na novu poziciu
switch (SmerHadika)
{
case Pohyb.Left:
this.segments[this.PoziciaHlavy].X -= width;
break;
case Pohyb.Right:
this.segments[this.PoziciaHlavy].X += width;
break;
case Pohyb.Up:
this.segments[this.PoziciaHlavy].Y -= height;
break;
case Pohyb.Down:
this.segments[this.PoziciaHlavy].Y += height;
break;
}
//skontroluje ci hlava hadika sa nedotkla tela
//posunieme zbytok tela
for (int i = 0; i < this.PoziciaHlavy; i++)
{
if (this.RovnakySegment(this.segments[i], this.segments[this.PoziciaHlavy]))
{
return false;
}
}
return true;
}
public void PridajSegmentHadika()
{
Segment segment = new Segment(width, height, -10, -10);
this.segments.Insert(0, segment);
this.skore += 10;
}
public List<Segment> ToSegments
{
get { return this.segments; }
}
public int PoziciaHlavy
{
get { return this.segments.Count - 1; }
}
public int Skore
{
get { return this.skore; }
}
public Pohyb SmerHadika { get; set; }
public enum Pohyb
{
Left,
Right,
Up,
Down
}
}
}
Na začiatku si vykreslíme samotného hadika,ktorý sa bude skladať z 3 segmentov. Ešte vykreslime náhodne jedno jabĺčko, ktorého súradnice sa budu meniť vždy keď ho hadik "zje".Zdrojový kód samotnej hry by mohol vyzerať nejako dakto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Threading;
namespace hra_hadik
{
class SnakeGame
{
private readonly static int WidtHracejPlochy = 500;
private readonly static int HeightHracejPlochy = 500;
private readonly PictureBox canvas;
private readonly Snake hadik = new Snake();
private readonly SolidBrush farbaTela = new SolidBrush(Color.LightBlue);
private readonly SolidBrush farbaTextu = new SolidBrush(Color.Gray);
private readonly SolidBrush farbaJedla = new SolidBrush(Color.Red);
Segment jedlo1 = new Segment(Snake.width, Snake.height, 50, 50);
Random random = new Random();
public SnakeGame(PictureBox canvas)
{
this.canvas = canvas;
this.hadik.SmerHadika = Snake.Pohyb.Right;
this.canvas.Paint += new PaintEventHandler(canvas_Paint);
}
/// <summary>
/// nastavime novy smer pre hadika
/// </summary>
/// <param name="novySmer"></param>
public void NastavSmer(hra_hadik.Snake.Pohyb novySmer)
{
this.hadik.SmerHadika = novySmer;
}
/// <summary>
/// Overime ci je hadik v hracom poli
/// </summary>
/// <returns></returns>
public bool KoniecHry()
{
if (this.hadik.ToSegments[this.hadik.PoziciaHlavy].X < 0 || this.hadik.ToSegments[this.hadik.PoziciaHlavy ].Y < 0)
{
return true;
}
if (this.hadik.ToSegments[this.hadik.PoziciaHlavy].X > WidtHracejPlochy || this.hadik.ToSegments[this.hadik.PoziciaHlavy].Y > HeightHracejPlochy)
{
return true;
}
return false;
}
/// <summary>
/// Vykreslime hracie pole
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void canvas_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("Score :"+this.hadik.Skore, new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold), this.farbaTextu,0,0);
e.Graphics.FillRectangle(this.farbaJedla, jedlo1.ToRectangle());
if (this.KoniecHry())
{
e.Graphics.DrawString("Koniec hry", new Font(FontFamily.GenericSansSerif, 24, FontStyle.Bold), this.farbaTextu, 150, 150);
return;
}
if (this.hadik.PohniHadika() == false)
{
e.Graphics.DrawString("Koniec hry", new Font(FontFamily.GenericSansSerif, 24, FontStyle.Bold), this.farbaTextu, 150, 150);
return;
}
if(this.hadik.RovnakySegment(this.hadik.ToSegments[this.hadik.PoziciaHlavy],this.jedlo1))
{
jedlo1 = new Segment(Snake.width, Snake.height, Snake.width * this.random.Next(0, 50), Snake.height * this.random.Next(0, 50));
this.hadik.PridajSegmentHadika();
}
foreach (Segment telo in this.hadik.ToSegments)
e.Graphics.FillRectangle(this.farbaTela, telo.ToRectangle());
Thread.Sleep(20);
//budeme zvysovat rychlost,ak sa zmeni skore
if(this.hadik.Skore < 100)
Thread.Sleep(20);
if (this.hadik.Skore < 150)
Thread.Sleep(20);
if (this.hadik.Skore < 200)
Thread.Sleep(20);
if (this.hadik.Skore < 250)
Thread.Sleep(20);
if (this.hadik.Skore < 300)
Thread.Sleep(20);
if (this.hadik.Skore < 350)
Thread.Sleep(20);
e.Graphics.DrawString("www.projectik.eu", new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold), this.farbaTextu, 150, 150);
this.canvas.Invalidate();
}
}
}
V prílohe si môžete stiahnuť kompletné zdrojové kódy tejto hry.







