Sunteți pe pagina 1din 15

Colegiul National Vasile AlecsandriGalati

Proiect pentru
susinerea atestatului profesional
la informatic

Filier: teoretic
Profil: real
Specializare: matematic-informatic-intensiv informatica

Autor:
Rosu Alexandru
Coordonator:
Iordachi Lizeta Mihaela

MAI 2015

LABIRINT

Cuprins:

1. Descrierea temei si motivatia alegerii ei


2. Cerinte de sistem
3. Programe utilizate
4. Prezentarea in ansamblu a aplicatiei.Scurta
descriere
5. Prezentarea in detaliu a aplicatiei
6. Bibliografie

1.Descrierea temei si motivatia alegerii temei


Inca din copilarie am fost fascinat de acest joc si mi-am dorit sa dobandesc cunostintele necesare
pentru a implementa o astfel de aplcatie, de aceeea consider ca acest atestat este ocazia perfecta pentru ami fructifica aceasta pasiune si pentru a putea pune in aplicare tot ce am invatat la orele de informatica.
De asemenea, acest atestat poate reprezenta si un mediu de invatare pentru elevii de liceu sau orice
persoana care doreste sa testeze functionalitatea algoritmului Lee pe un labirint oarecare. Astfel, acesta
poate fi un sprijin pentru profesorii ce doresc sa ofere elevilor o demonstratie grafica a algoritmului sau sa
testeze un alt program. Intrucat labirintul, dimensiunea acestuia si punctual de plecare pot fi personalizate,
programul este personalizabil in functie de nevoi.

2.Cerinte de sistem:
Programul poate fi rulat pe orice calculator ce foloseste un sistem de operare Windows XP SP3
sau mai nou de atat(Vista,7,8,8.1), pe orice tip de arhitectura, si are instalat pachetul .NET Framework 4.
Este recomandat totusi ca procesorul sa fie cel putin Pentium de 1 Ghz si memoria RAM de cel putin 512
MB.

3.Programe utilizate

In proiectarea si realizarea acestui proiect a fost folosit Microsoft Visual Studio 2010 si limbajul
c#. Visual Studio include un set complet de instrumente de dezvoltare pentru generarea de aplicaii
ASP.NET, Servicii Web XML, aplicaii desktop i aplicaii mobile. Visual Basic, Visual C++, Visual C# i
Visual J#, toate folosesc acelai mediu de dezvoltare integrat (IDE) care le permite partajarea
instrumentelor i faciliteaz crearea de soluii folosind mai multe limbaje de programare. Aceste limbaje
permit s beneficieze de caracteristicile .NET Framework care ofer acces la tehnologii cheie care
simplifica dezvoltarea de aplicaii web ASP i XML Web Services cu Visual Web Developer.
Visual Studio 2010 are numele de cod Dev10[15] i a fost lansat pe 12 aprilie 2010 alturi de .NET
Framework 4. Visual Studio 2010 are un editor nou care utilizeaz WPF (Windows Presentation
Foundation), sprin interfaa de tip Ribbon, suport monitoare multiple, Windows 7 multitouch,
funcionalitatea SharePoint, instrumente de Windows Azure i IntelliTrace, un nou produs care ajut la
eradicarea bug-urilor irepetabile.[16] Va veni furnizat mpreun cu Expression Studio, Business &
Enterprise Servers i Microsoft Office i n versiunile Ultimate i Premium.

4. Prezentarea in ansamblu a aplicatiei. Scurta descriere

Aplicatia este constituita din doua ferestre principale. Prima dintre ele, care apare la deschiderea
programului, contine mai multe campuri unde se vor introduce caracteristicile labirintului ce va fi creat,
punctul de plecare si cat de mare se doreste sa fie afisare, urmand ca in cel de-al doilea labirintul sa fie
afisat, alaturi de un buton folosit pentru afisarea iesirii din acesta si unul pentru inchiderea aplicatiei.
In ceea ce priveste rezolvare propriu-zisa a labirintului, a fost folosita o varianta recursiva a
algoritmului Lee.

5. Prezentarea in detaliu a aplicatiei

Fereastra de inceput contine, dupa cum se poate observa in figura 1, 5 campuri in care se vor
introduce date despre labirint si despre modul de afisare al acestuia, dupa cum urmeaza:

Primul camp (Dimensiune punct) determina latimea si lungimea fiecarui gol sau perete din tabel

in pixeli, fiind recomandat un numar mai mare decat 10;


Al doilea camp (Dimensiune tabel) determina latimea si lungimea labirintului, notata N (in puncte,

mentionate mai sus)


Al treilea camp (Labirint) permite introducerea unei matrice de dimensiune N*N cu urmatoare

seminificatie:
o 0 goluri, spatii prin care se poate trece
o 1 pereti, spatii prin care nu se poate trece
Ultimele 2 campuri (Punct de plecare) determina coordonatele punctului de unde va incepe
drumul de iesire din labirint(mai intai pe axa verticala, iar apoi pe cea orizontala)

Un exemplu de completare a campurilor poate fi observat in figura 1. Dupa finalizarea introducerii


datelor se apasa pe butonul Creeaza labirintul.

Figura 1
Cea de a doua fereastra contine reprezentarea grafica a labirintului introdus (figura 2). Peretii sunt marcati
cu rosu, iar golurile cu alb, in timp ce punctul de plecare este reprezentat prin culoarea albastra si numarul
1.

Figura 2
La apasarea butonului Arata solutie se va afisa solutia labirintului, adica cel mai scurt drum
pana la o iesire din acesta, daca exista, sau mesajul Labirintul nu are solutie, daca nu exista. Drumul va
fi marcat cu patrate de culoare verde si numerotat dupa cum se poate observa in figura 3. La apasarea
butonului Inchide aplicatia se va opri.

Figura 3
Mai departe este inclus codul celor doua ferestre, in cel de al doilea putand fi observat algoritmul Lee:
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == null || textBox3.Text==null)
MessageBox.Show("Introduceti dimensiunile!");
else
{
int n1 = Convert.ToInt32(textBox1.Text);
int[,] v1 = new int[20, 20];
string[] linii = textBox2.Text.Split(new string[] { Environment.NewLine },
StringSplitOptions.None);
for (int i = 0; i < n1; i++)
{
string[] linie = linii[i].Split(' ');
for (int j = 0; j < n1; j++)
{
v1[i + 1, j + 1] = Convert.ToInt32(linie[j]);
if (v1[i + 1, j + 1] == 1)
v1[i + 1, j + 1] = -1;
}
}
Variabile.n = n1;
Variabile.v = v1;
Variabile.dim = Convert.ToInt32(textBox3.Text);
Variabile.plecx = Convert.ToInt32(textBox4.Text);
Variabile.plecy = Convert.ToInt32(textBox5.Text);
Hide();
Form2 form2 = new Form2();
form2.Show();
}
}
private void Form1_Load(object sender, EventArgs e)
{

}
}
}

Form2.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
int n = Variabile.n;
int[,] v = Variabile.v;
int dim = Variabile.dim;
Label[] label = new Label[(n + 1) * (n + 1)];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (v[i, j] == -1)
{

label[(i - 1) * n + j] = new Label();


label[(i - 1) * n + j].Text = "";
label[(i - 1) * n + j].Location = new Point(70 + (j - 1) * dim, 70 + (i - 1) * dim);
label[(i - 1) * n + j].AutoSize = false;
label[(i - 1) * n + j].Width = dim;
label[(i - 1) * n + j].Height = dim;
label[(i - 1) * n + j].BackColor = System.Drawing.Color.Red;
this.Controls.Add(label[(i - 1) * n + j]);
}
}
int dim1 = Variabile.dim;
Label label1 = new Label();
label1.Text = "1";
label1.TextAlign = ContentAlignment.MiddleCenter;
label1.ForeColor = Color.White;
label1.Location = new Point(70 + (Variabile.plecy - 1) * dim1, 70 + (Variabile.plecx - 1) * dim1);
label1.AutoSize = false;
label1.Width = dim1;
label1.Height = dim1;
label1.BackColor = System.Drawing.Color.Blue;
this.Controls.Add(label1);
this.Size = new Size(200 + n * dim, 170 + n * dim);
}
private void lee(int x, int y)
{
int n = Variabile.n;
if (x == 1 || y == 1 || x == n || y == n)
Variabile.ok = 1;
if (Variabile.ok == 0)

{
int[,] v = Variabile.v;
if (v[x - 1, y] == 0 || v[x - 1, y] > v[x, y] + 1)
{
v[x - 1, y] = v[x, y] + 1;
lee(x - 1, y);
}
if (v[x + 1, y] == 0 || v[x + 1, y] > v[x, y] + 1)
{
v[x + 1, y] = v[x, y] + 1;
lee(x + 1, y);
}
if (v[x, y - 1] == 0 || v[x, y - 1] > v[x, y] + 1)
{
v[x, y - 1] = v[x, y] + 1;
lee(x, y - 1);
}
if (v[x, y + 1] == 0 || v[x, y + 1] > v[x, y] + 1)
{
v[x, y + 1] = v[x, y] + 1;
lee(x, y + 1);
}
}
}
private void button1_Click_1(object sender, EventArgs e)
{
int x = Variabile.plecx;
int y = Variabile.plecy;
int[,] v = Variabile.v;
Variabile.ok = 0;
v[x, y] = 1;
lee(x, y);
int n = Variabile.n, min = n * n, minx=0, miny=0;
for (int i = 1; i <= n; i++)
{

if (v[1, i] > 0 && v[1, i] < min)


{
min = v[1, i];
minx = 1;
miny = i;
}
if (v[n, i] > 0 && v[n, i] < min)
{
min = v[n, i];
minx = n;
miny = i;
}
if (v[i, 1] > 0 && v[i, 1] < min)
{
min = v[i, 1];
minx = i;
miny = 1;
}
if (v[i, n] > 0 && v[i, n] < min)
{
min = v[i, n];
minx = i;
miny = n;
}
}
x = minx;
y = miny;
if (minx > 0 && miny > 0)
while (v[x, y] != 1)
{
int dim = Variabile.dim;
Label label = new Label();
label.ForeColor = Color.White;
label.Text = Convert.ToString(v[x, y]);
label.TextAlign = ContentAlignment.MiddleCenter;

label.Location = new Point(70 + (y - 1) * dim, 70 + (x - 1) * dim);


label.AutoSize = false;
label.Width = dim;
label.Height = dim;
label.BackColor = System.Drawing.Color.Green;
this.Controls.Add(label);
if (v[x - 1, y] == v[x, y] - 1)
x--;
else if (v[x + 1, y] == v[x, y] - 1)
x++;
else if (v[x, y - 1] == v[x, y] - 1)
y--;
else y++;
}
else MessageBox.Show("Labirintul nu are solutie");
}
private void button2_Click(object sender, EventArgs e)
{
if (System.Windows.Forms.Application.MessageLoop)
{
System.Windows.Forms.Application.Exit();
}
else
{
System.Environment.Exit(1);
}
}
}
}

6. Bibliografie
http://ro.wikipedia.org/wiki/Microsoft_Visual_Studio

S-ar putea să vă placă și