Результат работы программы
В результате при нажатии клавиши «Начать игру» во всплывающем окне открывается основное поле игры. Фигура начинает падать. С помощью соответствующих клавиш управления фигура меняет направление, при заполнении игрового поля всплывает окно «Конец игры» , ведётся счёт.
На рисунке 3 представлен результат работы программы.
Рисунок 3 – результат программы.
Руководство пользователя
Запуск программы
Запуск программы осуществляется открытием файла Tetris.exe.
Работа с программой
При запуске приложения появляется окно программы (рисунок 4).
Рисунок 4– дополнительное окно программы
Для начала работы программы необходимо сделать клик левой клавиши мыши по кнопке «Меню игры» и нажать «Начать игру» , после чего появится основное окно игры. Далее вы управляете фигурами с помощью клавиш управления.
- Нажмите клавишу UP для поворот фигуры.
- Нажмите клавишу LEFT для перемещение фигуры влево.
- Нажмите клавишу RIGHT для перемещение фигуры вправо.
- Нажмите клавишу DOWN для перемещение фигуры вниз.
1.
ПРИЛОЖЕНИЕ 1
Листинг файла Form1.cs
namespace Tetris
{
public partial class Form1 : Form
{
private Igrovoe_pole Igrovoe_pole;
private Igrovoe_pole Next;
private Label Pkt, Level;
private Label lblPkt, lblPoziom;
private Label info;
public int level;
public int punkty;
public double S;
private bool Fast;
private bool gra;
private bool pauza;
public Form1()
{
InitializeComponent();
Inicjuj();
}
private void Inicjuj()
{
level = 1;
punkty = 0;
gra = false;
pauza = false;
Timer.Interval = 1000;
Fast = false;
// Игровое поле
this.Igrovoe_pole = NEW Igrovoe_pole(10, 18);
this.Next = NEW Igrovoe_pole(9, 4);
this.Igrovoe_pole.Location = NEW System.Drawing.Point(15, 15);
this.Igrovoe_pole.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Igrovoe_pole.Name = "Igrovoe pole";
this.Igrovoe_pole.TabIndex = 0;
this.Igrovoe_pole.Paint += NEW PaintEventHandler(this.Plansza_Paint);
this.Next.Location = NEW System.Drawing.Point(180, 15);
this.Next.Name = "Next";
this.Next.TabIndex = 0;
this.Next.Paint += NEW PaintEventHandler(this.Plansza_Paint);
this.Controls.Add(this.Next);
this.Controls.Add(this.Igrovoe_pole);
this.lblPkt = NEW Label();
this.lblPoziom = NEW Label();
this.Pkt = NEW Label();
this.Level = NEW Label();
this.info = NEW Label();
this.lblPkt.AutoSize = true;
this.lblPkt.Location = NEW System.Drawing.Point(180, 120);
this.lblPkt.Name = "lblPkt";
this.lblPkt.Size = NEW System.Drawing.Size(35, 13);
this.lblPkt.TabIndex = 0;
this.lblPkt.Text = "Очки:";
this.lblPoziom.AutoSize = true;
this.lblPoziom.Location = NEW System.Drawing.Point(180, 100);
this.lblPoziom.Name = "lblPoziom";
this.lblPoziom.Size = NEW System.Drawing.Size(35, 13);
this.lblPoziom.TabIndex = 0;
this.lblPoziom.Text = "Уровень:";
this.Pkt.AutoSize = true;
this.Pkt.Location = NEW System.Drawing.Point(230, 120);
this.Pkt.Name = "Pkt";
this.Pkt.Size = NEW System.Drawing.Size(35, 13);
this.Pkt.TabIndex = 0;
this.Pkt.Text = "0";
this.Level.AutoSize = true;
this.Level.Location = NEW System.Drawing.Point(230, 100);
this.Level.Name = "Level";
this.Level.Size = NEW System.Drawing.Size(35, 13);
this.Level.TabIndex = 0;
this.Level.Text = "1";
this.info.AutoSize = true;
this.info.Location = NEW System.Drawing.Point(180, 140);
this.info.Name = "info";
this.info.Size = NEW System.Drawing.Size(50, 50);
this.info.TabIndex = 0;
this.Controls.Add(this.lblPoziom);
this.Controls.Add(this.lblPkt);
this.Controls.Add(this.Pkt);
this.Controls.Add(this.Level);
this.Controls.Add(this.info);
}
private void timer1_Tick(object sender, EventArgs e)
{
//Правила игры
if (!Igrovoe_pole.wdol())
{
if (Fast)
{
Fast = false;
if (level < 11)
Timer.Interval = 1000 - 100 * (level - 1);
else if (level < 21)
Timer.Interval = 100 - 10 * (level - 1);
else Timer.Interval = 10;
}
int pkt = Igrovoe_pole.linie();
punkty += (pkt * pkt);
Pkt.Text = punkty.ToString();
if (punkty >= level * 10)
{
level++;
Level.Text = level.ToString();
if (level < 11)
Timer.Interval -= 100;
else if (level < 21)
Timer.Interval -= 10;
else Timer.Interval = 10;
}
figura f = Next.getfigura();
if (!Igrovoe_pole.drawfigure(5, 0, f))
{
Timer.Stop();
Timer.Interval = 1000;
MessageBox.Show("Конец игры");
gra = false;
f = null;
Igrovoe_pole.reset();
Next.reset();
level = 1;
punkty = 0;
Pkt.Text = "0";
Level.Text = "1";
return;
}
Next.reset();
Next.drawfigure(0, 0, NEW figura());
}
}
//Запуск игры
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
gra = true;
Igrovoe_pole.drawfigure(5, 0, NEW figura());
Next.drawfigure(0, 0, NEW figura());
Timer.Start();
}
//Пауза
private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
if (pauza)
{
Timer.Start();
pauza = false;
}
else
{
Timer.Stop();
pauza = true;
}
}
private void toolStripMenuItem4_Click(object sender, EventArgs e)
{
gra = false;
Igrovoe_pole.reset();
Next.reset();
level = 1;
punkty = 0;
Level.Text = "1";
Pkt.Text = "0";
Timer.Stop();
Timer.Interval = 1000;
}
//Управление
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Left && gra && !pauza) Igrovoe_pole.left();
if (e.KeyCode == Keys.Right && gra && !pauza) Igrovoe_pole.right();
if ((e.KeyCode == Keys.Up || e.KeyCode == Keys.Up) && gra && !pauza) Igrovoe_pole.turn_right();
if (e.KeyCode == Keys.Down && gra && !pauza)
{
if (Fast)
{
Timer.Interval = 1000 - 100 * (level - 1);
Fast = false;
}
else if (!Fast)
{
Timer.Interval = 50;
Fast = true;
}
}
}
private void Plansza_Paint(object sender, PaintEventArgs e)
{
Igrovoe_pole p = (Igrovoe_pole)sender;
p.odswiez();
}
}
}
Листинг файла Figura.cs
public class figura
{
public enum color { niebieski, yellow, czerwony, biruzoviy, green_1, blue, green, red };
public enum figury { L, J, I, O, T, S, Z };
public bool[,] setka;
public figury what;
public Color kolor;
public int kat;
private static Random random = NEW Random();
int g;
//Цвет фигур
public figura()
{
kat = 0;
setka = NEW bool[4, 4];
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
setka[i, j] = false;
// Рандом цвета
color nowy_kolor = (color)random.Next(8);
switch (nowy_kolor)
{
case color.niebieski: kolor = Color.LightBlue; break;
case color.yellow: kolor = Color.LemonChiffon; break;
case color.biruzoviy: kolor = Color.BurlyWood; break;
case color.czerwony: kolor = Color.Coral; break;
case color.green_1: kolor = Color.YellowGreen; break;
case color.blue: kolor = Color.Blue; break;
case color.red: kolor = Color.Red; break;
case color.green: kolor = Color.Green; break;
default: kolor = Color.Black; break;
}
// Выпадение фигур
figury NEW_figura = (figury)random.Next(7);
switch (NEW_figura)
{
// J
case figury.J:
setka[1, 0] = setka[1, 1] = setka[1, 2] = setka[0, 2] = true;
what = figury.J;
break;
// L
case figury.L:
setka[0, 0] = setka[0, 1] = setka[0, 2] = setka[1, 2] = true;
what = figury.L;
break;
// S
case figury.S:
setka[0, 0] = setka[0, 1] = setka[1, 1] = setka[1, 2] = true;
what = figury.S;
break;
// O
case figury.O:
setka[0, 0] = setka[1, 0] = setka[0, 1] = setka[1, 1] = true;
what = figury.O;
break;
// I
case figury.I:
setka[0, 0] = setka[0, 1] = setka[0, 2] = setka[0, 3] = true;
what = figury.I;
break;
// T
case figury.T:
setka[1, 0] = setka[0, 1] = setka[1, 1] = setka[2, 1] = true;
what = figury.T;
break;
// Z
case figury.Z:
setka[1, 0] = setka[1, 1] = setka[0, 1] = setka[0, 2] = true;
what = figury.Z;
break;
}
}
public figura odwrocona(int fi)
{
if (fi != 0 && fi != 90 && fi != 180 && fi != 270) return this;
figura NEW = NEW figura();
NEW.kat = fi;
NEW.kolor = kolor;
NEW.what = what;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
NEW.setka[i, j] = false;
// Вид фигур после поворота
switch (what)
{
case figury.L:
switch (fi)
{
case 0: NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[0, 2] = NEW.setka[1, 2] = true; break;
case 90: NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[2, 0] = NEW.setka[0, 1] = true; break;
case 180: NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[1, 1] = NEW.setka[1, 2] = true; break;
case 270: NEW.setka[2, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = NEW.setka[2, 1] = true; break;
}
break;
case figury.J:
switch (fi)
{
case 0: NEW.setka[1, 0] = NEW.setka[1, 1] = NEW.setka[1, 2] = NEW.setka[0, 2] = true; break;
case 90: NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = NEW.setka[2, 1] = true; break;
case 180: NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[0, 2] = NEW.setka[1, 0] = true; break;
case 270: NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[2, 0] = NEW.setka[2, 1] = true; break;
}
break;
case figury.I:
switch (fi)
{
case 0:
case 180:
NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[0, 2] = NEW.setka[0, 3] = true; break;
case 90:
case 270:
NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[2, 0] = NEW.setka[3, 0] = true; break;
}
break;
case figury.O:
NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = true; break;
case figury.T:
switch (fi)
{
case 0: NEW.setka[1, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = NEW.setka[2, 1] = true; break;
case 90: NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[0, 2] = NEW.setka[1, 1] = true; break;
case 180: NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[2, 0] = NEW.setka[1, 1] = true; break;
case 270: NEW.setka[1, 0] = NEW.setka[1, 1] = NEW.setka[1, 2] = NEW.setka[0, 1] = true; break;
}
break;
case figury.S:
switch (fi)
{
case 0:
case 180:
NEW.setka[0, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = NEW.setka[1, 2] = true; break;
case 90:
case 270:
NEW.setka[1, 0] = NEW.setka[2, 0] = NEW.setka[0, 1] = NEW.setka[1, 1] = true; break;
}
break;
case figury.Z:
switch (fi)
{
case 0:
case 180:
NEW.setka[1, 0] = NEW.setka[1, 1] = NEW.setka[0, 1] = NEW.setka[0, 2] = true; break;
case 90:
case 270:
NEW.setka[0, 0] = NEW.setka[1, 0] = NEW.setka[1, 1] = NEW.setka[2, 1] = true; break;
}
break;
}
return NEW;
}
}
Листинг файла Grid.cs
public class Grid
{
private Rectangle kwadrat;
private Color kolor;
private int x, y;
private bool zajeta;
public const int wymiar = 15;
public Grid()
{
kwadrat = NEW Rectangle(x * wymiar + 2,
y * wymiar + 2,
wymiar - 2,
wymiar - 2);
zajeta = false;
x = y = 0;
kolor = Color.Black;
}
public Grid(int a, int b)
{
x = a;
y = b;
kwadrat = NEW Rectangle(x * wymiar + 2,
y * wymiar + 2,
wymiar - 2,
wymiar - 2);
zajeta = false;
kolor = Color.Black;
}
public Grid(int a, int b, Color k)
{
x = a;
y = b;
kolor = k;
kwadrat = NEW Rectangle(x * wymiar + 2,
y * wymiar + 2,
wymiar - 2,
wymiar - 2);
zajeta = false;
}
public bool czyzajeta()
{
return zajeta;
}
public void setkolor(Color k)
{
kolor = k;
}
public Color getkolor()
{
return kolor;
}
//Обводка
public void rysuj(Graphics g)
{
SolidBrush p = NEW SolidBrush(kolor);
g.FillRectangle(p, kwadrat);
g.DrawRectangle(Pens.Black, kwadrat);
zajeta = true;
}
public void delete(Graphics g, Color k)
{
SolidBrush p = NEW SolidBrush(k);
g.FillRectangle(p, kwadrat);
g.DrawRectangle(NEW Pen(p), kwadrat);
zajeta = false;
}
Листинг файла Igrovoe_pole.cs
public class Igrovoe_pole : Infographics
{
private int x_figury, y_figury;
private figura block;
public Igrovoe_pole()
{
x_figury = y_figury = 0;
}
public Igrovoe_pole(int a, int b)
: base(a, b)
{
x_figury = y_figury = 0;
}
// Отображение фигуры в окне
public bool drawfigure(int x, int y, figura f)
{
if (!sprawdzwymiary(x, y)) return false;
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (f.setka[i, j])
{
if (!sprawdzwymiary(x + i, y + j)) return false;
if (setka[x + i, y + j].czyzajeta()) return false;
}
x_figury = x;
y_figury = y;
if (block != f) block = f;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (f.setka[i, j])
{
setka[x + i, y + j].setkolor(f.kolor);
drawgrid(x + i, y + j);
}
return true;
}
public bool wdol()
{
if (block == null) return false;
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (block.setka[i, j] && (j == 3 || !block.setka[i, j + 1]))
{
if (!sprawdzwymiary(x_figury + i, y_figury + j + 1)) return false;
if (setka[x_figury + i, y_figury + j + 1].czyzajeta()) return false;
}
}
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (block.setka[i, j]) setka[x_figury + i, y_figury + j].delete(g, BackColor);
drawfigure(x_figury, y_figury + 1, block);
return true;
}
public bool left()
{
if (block == null) return false;
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (block.setka[i, j] && (i == 0 || !block.setka[i - 1, j]))
{
if (!sprawdzwymiary(x_figury + i - 1, y_figury + j)) return false;
if (setka[x_figury + i - 1, y_figury + j].czyzajeta()) return false;
}
}
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (block.setka[i, j]) setka[x_figury + i, y_figury + j].delete(g, BackColor);
drawfigure(x_figury - 1, y_figury, block);
return true;
}
public bool right()
{
if (block == null) return false;
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (block.setka[i, j] && (i == 3 || !block.setka[i + 1, j]))
{
if (!sprawdzwymiary(x_figury + i + 1, y_figury + j)) return false;
if (setka[x_figury + i + 1, y_figury + j].czyzajeta()) return false;
}
}
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (block.setka[i, j]) setka[x_figury + i, y_figury + j].delete(g, BackColor);
drawfigure(x_figury + 1, y_figury, block);
return true;
}
public void turn_left()
{
if (block.kat == 0) block.kat = 270;
else block.kat -= 90;
figura NEW = block.odwrocona(block.kat);
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (NEW.setka[i, j] && !sprawdzwymiary(x_figury + i, y_figury + j)) return;
if (NEW.setka[i, j] &&
!block.setka[i, j] &&
setka[x_figury + i, y_figury + j].czyzajeta())
return;
}
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (block.setka[i, j]) setka[x_figury + i, y_figury + j].delete(g, BackColor);
drawfigure(x_figury, y_figury, NEW);
}
public void turn_right()
{
if (block.kat == 270) block.kat = 0;
else block.kat += 90;
figura NEW = block.odwrocona(block.kat);
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (NEW.setka[i, j] && !sprawdzwymiary(x_figury + i, y_figury + j)) return;
if (NEW.setka[i, j] &&
!block.setka[i, j] &&
setka[x_figury + i, y_figury + j].czyzajeta())
return;
}
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (block.setka[i, j]) setka[x_figury + i, y_figury + j].delete(g, BackColor);
drawfigure(x_figury, y_figury, NEW);
}
public void wyczysclinie(int n)
{
if (!sprawdzwymiary(1, n)) return;
for (int i = 0; i < sz_ekranu; i++)
setka[i, n].delete(g, BackColor);
}
public void przesunlinie(int n)
{
if (n < 0 || n >= wys_ekranu - 1) return;
int i;
for (i = 0; i < sz_ekranu; i++)
{
if (!setka[i, n].czyzajeta())
{
setka[i, n + 1].delete(g, BackColor);
continue;
}
setka[i, n + 1].setkolor(setka[i, n].getkolor());
setka[i, n + 1].rysuj(g);
setka[i, n].delete(g, BackColor);
}
}
public int linie()
{
int n = wys_ekranu - 1;
int i;
int ile = 0;
bool czylinia = true;
while (n > 0 && ile < 4)
{
for (i = 0; i < sz_ekranu; i++)
if (!setka[i, n].czyzajeta()) czylinia = false;
if (czylinia)
{
ile++;
for (int m = n - 1; m >= 0; m--)
przesunlinie(m);
}
else n--;
czylinia = true;
}
return ile;
}
public figura getfigura()
{
return block;
}
}
Листинг файла Infographics.cs
public class Infographics : Panel
{
protected Graphics g;
protected Grid [,] setka;
protected int sz_ekranu;
protected int wys_ekranu;
public Infographics()
{
sz_ekranu = 10;
wys_ekranu = 10;
this.Size = NEW System.Drawing.Size(sz_ekranu * Grid.wymiar + 4, wys_ekranu * Grid.wymiar + 4);
setka = NEW Grid[sz_ekranu, wys_ekranu];
for (int i = 0; i < sz_ekranu; i++)
for (int j = 0; j < wys_ekranu; j++)
setka[i, j] = NEW Grid(i, j);
g = CreateGraphics();
this.Show();
}
public Infographics(int a, int b)
{
if (a <= 0 || b <= 0) a = b = 10;
sz_ekranu = a;
wys_ekranu = b;
this.Size = NEW System.Drawing.Size(sz_ekranu * Grid.wymiar + 4, wys_ekranu * Grid.wymiar + 4);
setka = NEW Grid[sz_ekranu, wys_ekranu];
for (int i = 0; i < sz_ekranu; i++)
for (int j = 0; j < wys_ekranu; j++)
setka[i, j] = NEW Grid(i, j);
g = CreateGraphics();
this.Show();
}
public bool sprawdzwymiary(int x, int y)
{
if (x < 0 || x >= sz_ekranu || y < 0 || y >= wys_ekranu) return false;
else return true;
}
public bool rysujkratke(int x, int y)
{
if (!sprawdzwymiary(x, y)) return false;
if (setka[x, y].czyzajeta()) return false;
setka[x, y].rysuj(g);
return true;
}
public void odswiez()
{
for (int i = 0; i < sz_ekranu; i++)
for (int j = 0; j < wys_ekranu; j++)
{
if (setka[i, j].czyzajeta())
setka[i, j].rysuj(g);
}
}
public void reset()
{
for (int i = 0; i < sz_ekranu; i++)
for (int j = 0; j < wys_ekranu; j++)
setka[i, j].delete(g, BackColor);
}
}
ПРИЛОЖЕНИЕ 2
Блок схема игры "Тетрис"
Заключение
Целью работы была разработка графического приложения, моделирующего игру «Тетрис» в среде разработки Microsoft Visual Studio, цель достигнута полностью. В качестве инструмента использовалась Microsoft Visual Studio. Задачи курсовой работы, разработка и тестирование были решены. В ходе работы написана программа, которая моделирует игру «Тетрис». Для решения задачи были изучены основы программирования, а также некоторые новые классы для работы с графикой.
Список используемых источников
1. Скит, Дж. C# для профессионалов: тонкости программирования. Справочное пособие / Дж. Скит - 3-е издание, «Вильямс», 2014. — 608с.
2. Троелсен, Эндрю. Язык программирования C# 5.0 и платформа .NET 4.5. Справочное пособие / Троелсен, Эндрю - Издательство «Вильямс», 2013 г.—240с.
3. Албахари, Джозеф; Албахари, Бен Полное описание языка C# 5.0. Справочное пособие [Текст] / Албахари, Джозеф; Албахари, Бен -издательство «Вильямс», 5 издание, 2014 г. - стр.304
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|