Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE DIPLOM
Coordonator tiinific :
ef lucrri dr. Iordan Anca Elena
Absolvent
Papi Roxana Mihaela
Hunedoara
2015
1
Proiect de diplom
Cuprins
Introducere
Capitolul I: Ce este Java?
Medii de dezvoltare integrate
Compilare vs. Interpretare
Maina virtual Java
Particularitile limbajului Java
NetBeans
Interfaa grafic a utilizatorului
Capitolul II: Sudoku.Elemente Java utilizate
Problema ofierilor
Cum se aplic matematica n Sudoku
Cum rezolv un informatician Sudoku
Strategia mea
Metodele folosite
Elementele Java folosite n Sudoku
Capitolul III: Funcionarea jocului n imagini
Concluzii
Bibliografie
3
4
pag. 5
pag. 5
pag. 7
pag. 8
pag. 9
pag. 10
pag. 11
pag. 11
pag. 13
pag. 14
pag. 15
pag. 16
pag. 26
pag. 31
pag. 47
pag. 48
Proiect de diplom
Introducere
Sudoku este cea mai bun metod de a-i cre te coeficientul de inteligen .
tiai c?
Memoria i logica merg mn cnd jucai Sudoku: v folosi i memoria pentru a
memora locaia numerelor i logica pentru a v da seama unde trebuie puse acele
numere
Sudoku antreneaz gndirea logic
Exist studii tiiinifice care au demonstrate c Sudoku reduce riscul apari iei bolii
Alzeihmer
Dac jucai n fiecare zi Sudoku, v vei sim i mult mai concentra i pe parcursul zilei
ntrecnd efectul cafelei
Sudoku v menine creierul n form i v ajut s v contrenta i mai bine.
Am decis s cercetez acest subiect i de aceea am ales aceast aplica ie,
combinnd elemente de Java, pentru a-mi putea antrena creierul n fiecare zi.
Fie c suntei n metrou,n autobuz sau a teptnd avionul acest joc este un exerci iu
bun pentru a v menine creierul n form i astfel reduce i riscurile apari iei oboselii sau
chiar a unor boli.
n cele ce urmeaz am descris mai bine cum am construit aceste joc,folosind
elemente Java spernd c v voi capta aten ia i v voi trezi curiozitatea n ceea ce
privete efectele dovedite tiinifice ale logicii acestui joc.
Proiect de diplom
Capitolul I
Ce este Java?
Java este
un limbaj
de
programare orientat-obiect, puternic tipizat,
conceput de ctre James Gosling la Sun
Microsystems (acum
filial Oracle)
la
nceputul anilor 90, fiind lansat n 1995. Cele
mai multe aplicaii distribuite sunt scrise n
Java, iar noile evoluii tehnologice permit
utilizarea sa i pe dispozitive mobile gen
telefon, agenda electronic, palmtop etc. n
felul acesta se creeaz o platform unic, la
nivelul programatorului, deasupra unui mediu
eterogen extrem de diversificat. Acesta este
utilizat n prezent cu succes i pentru
programarea aplicaiilor destinate intraneturilor.
Limbajul mprumut o mare parte din
sintax de la C i C++, dar are un model al
obiectelor mai simplu i prezint mai puine
faciliti de nivel jos. Un program Java
compilat, corect scris, poate fi rulat fr
modificri pe orice platform care e instalat o
main virtual Java (englez Java Virtual
Machine, prescurtat JVM). Acest nivel de
portabilitate (inexistent pentru limbaje mai
vechi cum ar fi C) este posibil deoarece
sursele
Java
sunt
compilate
ntr-un
format standard numit
cod
de
octei
(englez byte-code) care este intermediar ntre
codul
main
(dependent
de
tipul
calculatorului) i codul surs.
Maina virtual Java este mediul n care se execut programele Java. n prezent,
exist mai muli furnizori de JVM, printre care Oracle, IBM, Bea, FSF. n 2006, Sun a
anunat c face disponibil varianta sa de JVM ca open-source.
Exist 4 platforme Java furnizate de Oracle:
Java Platform, Micro Edition (Java ME) pentru hardware cu resurse limitate, gen
PDA sau telefoane mobile,
Proiect de diplom
Java Platform, Standard Edition (Java SE) pentru sisteme gen workstation, este
ceea ce se gsete pe PC-uri,
Java Platform, Enterprise Edition (Java EE) pentru sisteme de calcul mari,
eventual distribuite.
JCreator
Eclipse
NetBeans
BEA Workshop
BlueJ
CodeGuide
DrJava
IntelliJ IDEA
JBuilder
JDeveloper
Compilare vs Interpretare
nainte de a prezenta mecanismul de ma in virtual, voi face o scurt descriere a
metodelor de execuie a programelor pentru diferite limbaje de programare.
5
Proiect de diplom
Procesorul unui calculator (sau a unei ma ini de calcul n general) poate executa un
numr fix de instruciuni cunoscute procesorului, numit set de instruciuni. Un program
poate fi scris folosind direct aceste instruciuni (mnemonicile lor), adic n limbaj de
asamblare, sau ntr-un limbaj de nivel nalt. Exist avantaje i dezavantaje pentru ambele
variante.
Un program scris n limbaj de asamblare nu este deloc portabil, deci nu poate fi
executat dect pe maina pentru care a fost scris, adic depinde de setul de instruc iuni pe
care procesorul tie s l execute, de sistemul de operare care ruleaz pe ma in, de
perifericele prezente, etc. Alt dezavantaj este c pentru o func ionalitate relativ simpl a
programului, trebuie scris o cantitate mult mai mare de cod dect ntr-un limbaj de nivel
nalt (cum ar fi C sau Java), lucru care face ca mentenan a codului, ca i posibilit ile de
dezvoltare s fie mult limitate. Pe de alt parte, un programator cu experien poate face
cele mai bune optimizri n limbaj de asamblare, el avnd control absolut asupra tuturor
resurselor disponibile.
Totui, pentru aplicaii foarte complexe, este necesar un compromis ntre
performan i dimensiunea/ complexitatea codului. Astfel au aprut limbaje formale, de
nivel nalt, care sunt mult mai intuitive, mai u or de nv at i de n eles, i care
abstractizeaz o mare parte din straturile de nivel jos ale unei ma ini de calcul (setul de
instruciuni, harta memoriei, structura stivei de execu ie, alocarea memoriei, etc.).
Avantajele sunt uriae, ncepnd cu simplitatea sintactic i semantic a unui program i
terminnd cu faptul c apare acum un anumit grad de portabilitate. Aceast portabilitate
apare datorit faptului c limbajul n sine este unic i un algoritm este descris n acela i fel
pentru orice main, dar astfel apare i problema: din moment ce un procesor nu tie s
execute dect setul lui de instruciuni, cum se face tranzi ia de la un program scris ntr-un
limbaj de nivel nalt generic, la limbajul de asamblare? Exist dou solu ii: interpretarea i
compilarea.
Interpretarea
Interpretarea unui program se face folosind un alt program, numit interpretor. Acesta
parseaz codul surs al programului pe care dori i s-l executa i i l transform n timpul
rulrii n cod main. Avantajul acestui sistem este c exist posibilitatea generrii de
6
Proiect de diplom
program dinamic, la runtime, adic la momentul rulrii acestuia. Un exemplu de limbaj
interpretat este Javascript. Acesta accept construc ii de forma:
eval("x=10;y=20;document.write(x*y)");
document.write("<br />" + eval("2+2"));
document.write("<br />" + eval(x+17));
Compilatorul este un program care are ca rol, traducerea unui limbaj n alt limbaj. n
principiu, acesta este un program de traducere, dar nu ntre dou limbi, ci ntre dou
limbaje formale. Diferena dintre limb i limbaj formal este c acesta din urm are un set
de reguli stricte care fac traducerea riguroas posibil pentru un algoritm. Spre deosebire
de interpretor, compilatorul face traducerea static, adic la ceea ce se nume te compiletime, ntre limbajul de nivel nalt i limbajul de asamblare a unui procesor specific. Odat
programul translatat n limbaj de asamblare, apoi n cod ma in cu ajutorul unui asamblor
i al unui linker, acesta este rulat direct pe procesor, fr alte programe ajuttoare.
Proiect de diplom
n prima faz, programul iniial, care este stocat ntr-un fi ier cu extensia .java, este
compilat, folosind compilatorul Java (javac) i este generat fiierul executabil pentru JVM,
care are extensia .class. Acest fiier este ncrcat de ctre ma ina virtual ( java) i este
interpretat.
Proiect de diplom
n plus fa de aplicaiile de sine stttoare ( standalone), n Java exist suport
pentru un tip de aplicaii numite applet-uri, care se execut n interiorul unui browser de
web. Acest lucru faciliteaz dezvoltarea aplica iilor interactive pe web.
Totui, poate cel mai important avantaj al limbajului Java, este setul de clase puse la
dispoziie de Oracle, numit generic Application Programming Interface, care con ine o
vast colecie de funcii deja implementate, gata de a fi folosite pentru o gam larg de
aplicaii.
NetBeans IDE este un program destul de avansat ce ofer o mul ime de func ii utile.
Lucrul cu fiierele se face prin intermediul unui proiect, astfel toate fi ierele sunt asociate
unui proiect iar modul de lucru este mult mai organizat.
Este o platform de dezvoltarre software creat n Java.Platforma NetBeans ce
permite aplicaiilor s fie dezvoltate pornind de la un pachet modular de component
software numite module.Aplicaiile create pe platform NetBeans, incluznd mediul de
dezvoltare integrat(IDE), se pot extinde i de ctre al i utilizatori.
IDE a fost iniial creat pentru dezvoltarea n Java dar suport i alte limbaje de
programare cum ar fi: PHP,C/C++ i HTML 5.
NetBeans poate rula pe Microsoft Windows,MAC OS X,LINUX,SOLARIS.
Platforma NetBeans
Poate instala module n mod dinamic.Orice aplica ie include modulul Centru de
Update-uri ce permite utilizatorilor aplica iilor s descarce update-urile existente i
elementele noi direct n aplicaia ce ruleaz.Reinstalnd o alt variant sau alte upgrade-uri
nu presupune reinstalarea ntrgii aplica ii.
Platforma ofer servicii ce pot fi reutilizate,permi nd dezvoltatorilor ce lucreaz cu
NetBeans s i mbuntteasc aplicaia.Printre aceste aspecte se numr:
management-ul interfeei de ctre utilizator
management-ul setrilor de ctre utilizator
management-ul salvrilor datelor
NetBeans Visual Library
NetBeans IDE
Este o aplicaie de tip open-source.NetBeans IDE permite dezvoltarea tutror
aplicaiilor JavaJava SE,Java ME,welo i a aplica iilor mobile.Printre caractersitici se
numr un system de proiecte bazate pe Ant,support Maven i controlul versiunii.
Toate funciile provin din module.Fiecare modul are o func ie bine definit cum ar fi in cazul
limbajului Java editarea.NetBeans conine toate modulele de care Java are nevoie pentru a
9
Proiect de diplom
rula dintr-o singura descrcare,permind utilizatorilor folosirea aplica iei imediat dup
descarcare.Modulele mai permit aplicaiei NetBeans s fie extinsa.
10
Proiect de diplom
Capitolul II
Sudoku.Elemente Java utilizate
11
Proiect de diplom
Problema ofierilor
n 1782, matematicianul elveian Leonhard Euler i
imagineaz urmtoarea problem ntr-o gril. Unii atribuie
paternitatea Sudokului elveianului, cu att mai mult cu ct
munca lui Euler consista n studiul ptratelor latine i teoria
grafurilor.
Problema ofierilor se poate enuna astfel: fie ase
regimente diferite, fiecare regiment posednd ase ofi eri de
grade diferite. Se cere s se plaseze cei 36 ofi eri ntr-o gril
de 6 x 6, fiecare ofier ocupnd cte csu, n a a fel c
fiecare rnd i fiecare coloan s conin toate gradele i
toate regimentele.
Legtura ntre Sudoku i problema celor 36 de ofi eri este condi ia care mpiedic
repetiia unui acelai element n gril, ajungndu-se n final tot la un joc care se folose te
de principiul ptratului latin (combinarea a dou ptrate latine n cazul ptratului grecolatin, ptrat latin subdivizat n mai multe regiuni n cazul Sudoku).
Chiar dac grilele clasice sunt cele mai obi nuite, exist mai multe variante:
grile de 55 care conin regiuni n form de pentamino i care au fost publicate sub
numele de Logi-5
12
Proiect de diplom
Exist o variant care n plus impune ca cifrele din diagonalele principale s fie
unice. Number Place Challenger, menionat anterior, i Sudoku X din Daily Mail, o gril
de 66, aparin acestei categorii
O meta-gril compus din cinci grile de 99 n quincunx care se ncalec la col uri
este publicat n Japonia sub numele de Gattai 5 (care nseamn "cinci fuzionai")
sau Samura. n ziarul The Times, aceast form est numit Samurai Su Doku
Proiect de diplom
E simplu! Este evident c numrul de grile este mai mic dect numrul de moduri de
a plasa nou cifre 1, nou cifre 2, ... nou cifre 9 ntr-o gril de 81 de csu e. Numrul
grilelor este deci mai mic dect
x = x sau,
14
Proiect de diplom
y = y sau,
Strategia mea
15
Proiect de diplom
Programul este redus la o serie de func ii care pot fi redate cu ajutorul GUI. Interfa a
GUI este prevzut cu 5 butoane,o imagine mare i pozi ionarea unui mouse.Este
prevzut pentru a apela funciile din central codului-surs.
n Windows am folosit VisualBasic IDE pentru a reda GUI. Func iile sunt redate prin
compilarea codului-surs printr-un ansamblu DLL.
Imaginea SUDOKU const dintr-un fiier necomprimat de tip bitmap n formatul
Windows BMP.Aceasta poate fi afiat n Windows.
Programul este simplu,constnd din:
Simpla GUI
Codul-surs
Nu necesit compilare individual pentru fiecare platfotm capabil s l suporte.
Avantajul acestui program este c acest cod poate fi rulat direct pe orice platform fr
nicio observaie sau vreo modificare.
Se poate folosi i Eclipse.Dar am folosit JavaFoundationClasses(JFC) i
SWING.Codul poate fi scris i modificat cu un editor de texte folosindu-se javac pentru
compilare i java pentru a rula aplicaia.
Metodele folosite
Sudoku este un aranjament special de 9 X 9 ptrate ale numerelelor de la 1 la 9.
Programul funcioneaz prin selectarea aleatorie a unui numr X(de la 0 la 8), a unui
numr Y(de la 0 la 8) i a unui numr oarecare dispus n intervalul [1,9].
Primul numr va fi pus n poziia X i Y. Pentru a arta c acest numr a fost
selectat i-am adugat nc 10.Astfel n loc de numere de la 1 la 9 vor fi numere de la 11 la
16
Proiect de diplom
19.Fiecare cellalt numr din acea pozi ie va fi egalat cu 0 deoarece el nu va mai putea fi
selectat.
De exemplu, dac selectez numrul 5 va aprea 0000150000 n locul irului
123456789.
n continuare fiecare numr de 5 din rndul X selectat l pun pe 0 pentru a nu mai
putea fi selectat.
Acest pas trebuie repetat pentru coloana Y selectat i pentru ptratul de 3 X 3
selectat.
Cu numerele urmtoare,trebuie verificat c nu au fost selectate(cele de la 11 la 19)
sau c nu pot fi selectate(egalate cu 0).
Pe msura ce ruleaz, numerele selectate vor rmne singurele din ptratele de 3 X
3.i aceste numere vor rmne unicele ce vor putea fi selectate.Aplica ia va selecta orice
numr din irul acesta.
La fiecare ncercare a codului numerele nu vor mai putea fi selectate.Astfel numrul
din ptratul de 3 X 3 va fi 000000000. Atunci programul a terminat i voi spune c am ajuns
n punctual final al secvenei.Sudoku se va termina.
Va ncepe urmtoarea secven Sudoku.Se va ajunge la cele 9 X 9 posibilt i pn
cnd acestea au fost excluse i atunci voi spune c am ajuns la un SUDOKU complet si
fr goluri.
La rularea codului va aprea urmtoarea imagine:
Principal
genereaz vizulizarea jocului
panoul central ce conine butoanele i pentru vizualizarea jocului
La nceput se declar variabilele pentru rezolvarea jocului,pentru a re ine pa ii parcur i n
soluionare,pentru a stabili limea i nal imea panoului central.
public static byte[][] joc = new byte[729][82];
public static byte pas = 0;
17
Proiect de diplom
private static final int latime = 777;
private static final int inaltime = 636;
Clasa pentru vizualizarea jocului ShowGUI ncepe prin iniializarea pailor de parcurgere a
jocului cu 0 deoarece niciun numar nu a fost selectat.Se afi eaz careul Sudoku dear
nainte de asta am fixat limea,nl imea i pozi ia cursorului.Se fixeaz imaginea de
fundal pe negru peste care se adaug careul Sudoku pe care l-am construit.
Strategie.start(joc);
final byte border = 14;
JFrame f = new JFrame("Principal");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BufferedImage image = null;
try {
image = ImageIO.read(new File("joc.png"));
} catch (IOException e) {
}
f.setResizable(false);
f.setIconImage(image);
f.setSize(latime, inaltime);
f.setLocation(0, 0);
f.setLayout(new BorderLayout());
f.add(new PanouS(new Dimension(latime,border)), BorderLayout.NORTH);
f.add(new PanouS(new Dimension(latime,border)), BorderLayout.SOUTH);
f.add(new PanouS(new Dimension(border,inaltime)), BorderLayout.EAST);
f.add(new PanouS(new Dimension(0,inaltime)), BorderLayout.WEST);
VizualizareJoc dp =new VizualizareJoc();
dp.setBackground(Color.BLACK);
f.add(dp, BorderLayout.CENTER);
f.setVisible(true);
Ultima clas sic ea principal este cea n care se apeleaz func ia ShowGUI i o ruleaz
avnd ca rezultat afisarea careului pe fundalul negru dup care se opre te rularea GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
vizualizareInterfata();
Vizualizare Joc
Conine panoul central.Are 6 butoane pe partea stng i o regiune desenat pentru
a viazualiza careul Sudoku.
18
Proiect de diplom
Am creat panoul de afiare.Am fixat careul principal Sudoku la 557 pixeli l ime,580
pixeli nlime i butoanele la 200 pixeli l ime.Am stabilitt culorile liniilor groase,sub iri i a
numerelor.
private static final long versiune1 = 1L;
private int latime = 557;
private int inaltime = 580;
private int latimeButoane = 200;
private final Color LB = new Color(0xAD,0xD8, 0xE6);
private final Color DB = new Color(0x1E,0x90, 0xFF);
private final Color P = new Color(0x80,0, 0x80);
Am continuat prin a construi panoul de vizualizare Sudoku dup care am adugat
cursorul mouse-ului. Procedura jocului ncepe prin a fixa cursorul pe coordonatele
numrului ce urmeaz a fi selectat.
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
selectareNumar(e.getX(),e.getY());
}
});
this.setLayout(new BorderLayout());
Urmtorul pas a fost s creez butoanele. Am setat nl imea,l imea i fundalul. Am
denumit butoanele pentru a permite utilizatorilor aplica iei s n eleag mai bine structura.
JPanel pb = new JPanel();
pb.setPreferredSize(new Dimension(latimeButoane,inaltime));
pb.setBackground(LB);
FlowLayout FL = new FlowLayout();
FL.setVgap(55);
FL.setHgap(100);
pb.setLayout(FL);
Butoane EYS = new Butoane("Creaza Sudoku Nou", "EYS");
EYS.addActionListener(this);
pb.add(EYS);
Butoane SHS = new Butoane("Dificultate ridicata", "SHS");
SHS.addActionListener(this);
pb.add(SHS);
Butoane SMS = new Butoane("Dificultate medie", "SMS");
SMS.addActionListener(this);
pb.add(SMS);
19
Proiect de diplom
Butoane SES = new Butoane("Dificultate redusa", "SES");
SES.addActionListener(this);
pb.add(SES);
Butoane GBS = new Butoane("Sterge ultima miscare", "GBS");
GBS.addActionListener(this);
pb.add(GBS);
Butoane STS = new Butoane("Solutii", "STS");
STS.addActionListener(this);
pb.add(STS);
this.add(pb,BorderLayout.WEST);
Urmeaz selectarea numerelor din careurile de 3 X 3. Ele sunt situate ntr-un
system de coordinate xOy fiecare ax avnd numere de la 0 la 8. Pe msur ce un numr
este selctat, poziia lui va fi notat. n felul acesta numrul nu se repet evitnd apari ia
erorilor. Exist 2 variabile ce numr selctarea pozi iilor numarPozX i numarPozY de pe
cele 2 axe. Cnd aceste variabile ating valoarea maxima,numerele nu mai pot fi selectate
deoarece toate pobilitile au fost eliminate. Dac sunt selectate butoanele, comenzile
acestora se vor apela ntr-o structur IF.
int numarPozitie[] = {3,63,124,187,248,309,372,433,494};
final byte numarPozY = 19;
if( x < latimeButoane + numarPozitie[0])
return;
x -= latimeButoane - numarPozitie[0];
byte count;
byte pozitieX = 0;
for(count = 0; count < 9; count++)
{
if(x > numarPozitie[count])
pozitieX = count;
}
byte pozitieY = 0;
for(count = 0; count < 9; count++)
{
if(y > numarPozitie[count])
pozitieY = count;
}
byte pozitie = (byte) (pozitieX + pozitieY*9);
byte numarX = 0;
x -= numarPozitie[pozitieX];
for(count = 0; count < 3; count++)
{
if(x > numarPozY*count)
20
Proiect de diplom
numarX = count;
}
byte numarY = 0;
y -= numarPozitie[pozitieY];
for(count = 0; count < 3; count++)
{
if(y > numarPozY*count)
numarY = count;
}
byte numar = (byte) (numarX + numarY*3);
Principal.pas = Strategie.select(Principal.joc, numar, pozitie, Principal.pas);
repaint(latimeButoane,0, latime,inaltime);
}
public Dimension getPreferredSize()
{
return new Dimension(latime + latimeButoane,inaltime);
}
protected void paintComponent(Graphics g)
{
final byte mas = 24;
final byte nrX = 11;
final byte nrY = 54;
final byte marime = 59;
final byte pnrX = 4;
final byte pnrY = 18;
final byte numarPozX = 20;
final byte numarPozY = 19;
final int masMesajX = 96;
final int masMesajY = 574;
final int masnrX = 211;
final int masnrY = 574;
int liniiMari[] = {0, 184, 369, 554, 577};
int liniiMici[] = {62, 123, 247, 308, 432, 493};
int numarPozitie[] = {3,63,124,187,248,309,372,433,494};
Font fontSelected = new Font("SansSerif", Font.ROMAN_BASELINE, 50);
Font fontmas = new Font("SansSerif", Font.ROMAN_BASELINE, 20);
Font fontPencil = new Font("SansSerif", Font.ROMAN_BASELINE, 20);
super.paintComponent(g);
g.setColor(DB);
21
Proiect de diplom
g.setFont(fontPencil);
byte count;
for(count = 0; count < 5; count++)
g.fillRect(0, liniiMari[count], latime + latimeButoane, 3);
for(count = 0; count < 6; count++)
g.drawLine(0, liniiMici[count], latime + latimeButoane, liniiMici[count]);
g.fillRect(liniiMari[0] + latimeButoane , 0, 3, inaltime);
g.fillRect(liniiMari[1] + latimeButoane , 0, 3, inaltime - mas);
g.fillRect(liniiMari[2] + latimeButoane , 0, 3, inaltime - mas);
g.fillRect(liniiMari[3] + latimeButoane , 0, 3, inaltime);
for(count = 0; count < 6; count++)
g.drawLine(liniiMici[count] + latimeButoane, 0, liniiMici[count] + latimeButoane,
inaltime -mas);
g.setFont(fontmas);
g.drawString("Miscarea
in rezolvarea careului", masMesajX + latimeButoane,
masMesajY);
g.drawString(String.valueOf(Principal.pas), masnrX + latimeButoane, masnrY);
byte numarcount;
for(numarcount = 0; numarcount < 81; numarcount++)
{
g.setColor(DB);
byte numarNul = 0;
byte outercount;
for(outercount = 0; outercount < 3; outercount++)
{
for(count = 0; count < 3; count++)
{
byte creion = Principal.joc[count + outercount*3 + numarcount*9][ Principal.pas];
if(creion > 0)
{
if(creion < 10)
{
g.setFont(fontPencil);
g.drawString(String.valueOf(creion ), numarPozitie[numarcount%9] +
(count*numarPozX) + pnrX + latimeButoane, numarPozitie[numarcount/9] +
outercount*numarPozY + pnrY);
}
else
{
g.setFont(fontSelected);
g.drawString(String.valueOf(creion - 10), numarPozitie[numarcount%9] +
latimeButoane + nrX, numarPozitie[numarcount/9] + nrY);
}
22
Proiect de diplom
}
else
numarNul += 1;
}
}
if(numarNul == 9)
{
g.setColor(P);
g.fillRect(numarPozitie[numarcount%9] + latimeButoane,
numarPozitie[numarcount/9], marime, marime);
}
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand() == "EYS")
Principal.pas = 0;
else if(e.getActionCommand() == "SHS")
{
Strategie.incercarisudoku(Principal.joc, (byte) 0);
Principal.pas = 25;
}
else if(e.getActionCommand()== "SMS")
{
Strategie.incercarisudoku(Principal.joc, (byte) 0);
Principal.pas = 35;
}
else if(e.getActionCommand() == "SES")
{
Strategie.incercarisudoku(Principal.joc, (byte) 0);
Principal.pas = 45;
}
else if(e.getActionCommand() == "STS")
{
Strategie.incercarisudoku(Principal.joc, Principal.pas);
}
else if(e.getActionCommand() == "GBS")
{
if(Principal.pas > 0)
Principal.pas -= 1;
}
repaint(latimeButoane,0, latime,inaltime);
}
PanouS
23
Proiect de diplom
Creaz marginile paginii principale.
Aceast clas creaz marginile panoului de afisare si stabile te culoarea de fundal.
public class PanouS extends Panel
{
private static final long versiuneS = 1L;
Color LB = new Color(0xAD,0xD8, 0xE6);
public PanouS(Dimension set)
{
super();
this.setBackground(LB);
this.setPreferredSize(set);
}
}
Strategie
Conine codul-surs folosit pentru soluionarea careului meu Sudoku.
Se ncepe procedura. Am iniiat o variabil numarat care va numra toate cele 81 de
posibili.
public static void start(byte[][] sudoku)
{
int numarat = 0;
for(numarat = 0; numarat < 729; numarat++)
sudoku[numarat][0] = (byte) (1 + (numarat % 9));
}
Clasa incercarisudoku iniiaz o variabil pas care numr totalul posibilitilor
pentru a soluiona careul.Am folosit o structur DO pentru a parcurge toate cele 81 de
posibili fr goluri.
public static void incercarisudoku(byte[][] sudoku, byte startpas)
{
java.util.Random generator = new java.util.Random(System.currentTimeMillis());
byte pas = startpas;
int incercari = 0;
do
{
incercari += 1;
boolean faragoluri = true;
pas = startpas;
while((pas < 81) && (faragoluri))
Urmtoarea structur DO caut i verific numerele care sunt unice n careu. Totul
se repet pn cnd careul este completat cu numerele deja puse.
24
Proiect de diplom
byte nmr = (byte) generator.nextInt(9);
byte pozitie = (byte) generator.nextInt(81);
pas = Strategie.select(sudoku,nmr,pozitie,pas);
boolean ind = false;
do
{
ind = false;
byte numarat;
byte numaratinv;
for(numarat = 0; numarat < 81; numarat++)
{
byte nzeros = 0;
for(numaratinv = 0; numaratinv < 9; numaratinv++)
{
if(sudoku[numarat * 9 + numaratinv][pas] == 0)
nzeros += 1;
else
nmr = (byte) (sudoku[numarat * 9 + numaratinv][pas] - 1);
if(nzeros == 9)
faragoluri = false;
}
if((nzeros == 8) && (nmr < 10))
{
pas = Strategie.select(sudoku,nmr,numarat,pas);
ind = true;
}
}
}
while(ind);
}
Principal.pas = pas;
}
while((pas != 81) && (incercari < 500));
}
Ultima clas reprezint alegerea numerelor care sunt selectate manual. Pe masur
ce ele sunt alese dispar att de pe orizontal ct i de pe vertical. Dup care urmeaz a fi
verificate dac nu se repet n careul de 3 X 3.
public static byte select(byte[][] sudoku, byte nmr, byte pozitie, byte pas)
{
if((sudoku[pozitie*9 + nmr][pas] == 0) || (sudoku[pozitie*9 + nmr][pas] > 9))
return pas;
pas += 1;
int numarat = 0;
for(numarat = 0; numarat < 729; numarat++)
25
Proiect de diplom
sudoku[numarat][pas] = sudoku[numarat][pas - 1];
for(numarat = 0; numarat < 9; numarat++)
sudoku[pozitie*9 + numarat][pas] = 0;
byte rand = (byte) (pozitie/9);
for(numarat = 0; numarat < 9; numarat++)
sudoku[rand * 81 + numarat * 9 + nmr][pas] = 0;
byte coloana = (byte) (pozitie%9);
for(numarat = 0; numarat < 9; numarat++)
sudoku[coloana * 9 + numarat * 81 + nmr][pas] = 0;
int brand = (pozitie/27)*243;
coloana = (byte) (((pozitie%9)/3)*27);
byte numaratinv;
for(numaratinv = 0; numaratinv < 3; numaratinv++)
{
for(numarat = 0; numarat < 3; numarat++)
sudoku[brand + coloana + numarat * 9 + numaratinv * 81 + nmr ][pas] = 0;
}
sudoku[pozitie*9 + nmr][pas] = (byte) (nmr + 11);
return pas;
}
Butoane
Se creaz butoanele folosite pentru a putea controla jocul.
Prima clas creaza un JButton cu proprieti stabilite.
class Butoane extends JButton
{
private static final long versiuneS = 1L;
Color DB = new Color(0x1E,0x90, 0xFF);
Color LB = new Color(0xAD,0xD8, 0xE6);
A doua clas l construiete.
public Butoane(String actionare, String comanda)
{
super(actionare);
this.setBackground(LB);
this.setForeground(DB);
this.setBorder(BorderFactory.createBevelBorder(0, DB, DB));
this.setActionCommand(comanda);
}
Iar ultima i stabilete dimensiunea.
26
Proiect de diplom
public Dimension getPreferredSize()
{
return new Dimension(130,30);
}
Clasa Strategie
java.lang.Object
Smethods
Metode motenite de la clasa java.langObject:
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Clasa Panou
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
PanouS
Interfeele implementate:
ava.awt.image.ImageObserver,
javax.accessibility.Accessible
java.awt.MenuContainer,
java.io.Serializable,
LEFT_ALIGNMENT,
Proiect de diplom
Metode motenite de la clasa java.awt.Container:
add, add, add, add, add, addContainerListener, addPropertyChangeListener,
addPropertyChangeListener,
applyComponentOrientation,
areFocusTraversalKeysSet,
countComponents,
deliverEvent,
doLayout,
findComponentAt,
findComponentAt,
getAlignmentX,
getAlignmentY,
getComponent,
getComponentAt,
getComponentAt,
getComponentCount,
getComponents,
getComponentZOrder,
getContainerListeners,
getFocusTraversalKeys,
getFocusTraversalPolicy,
getInsets,
getLayout,
getListeners,
getMaximumSize,
getMinimumSize,
getMousePosition,
getPreferredSize,
insets,
invalidate,
isAncestorOf,
isFocusCycleRoot,
isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet,
layout, list, list, locate, minimumSize, paint, paintComponents, preferredSize, print,
printComponents,
remove,
remove,
removeAll,
removeContainerListener,
removeNotify, setComponentZOrder, setFocusCycleRoot, setFocusTraversalKeys,
setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, setLayout,
transferFocusBackward, transferFocusDownCycle, update, validate
Metode motenite de la clasa java.awt.Component:
action,
add,
addComponentListener,
addFocusListener,
addHierarchyBoundsListener,
addHierarchyListener,
addInputMethodListener,
addKeyListener,
addMouseListener,
addMouseMotionListener,
addMouseWheelListener, bounds, checkImage, checkImage, contains, contains,
createImage, createImage, createVolatileImage, createVolatileImage, disable,
dispatchEvent, enable, enable, enableInputMethods, firePropertyChange,
firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange,
firePropertyChange, getBackground, getBaseline, getBaselineResizeBehavior,
getBounds,
getBounds,
getColorModel,
getComponentListeners,
getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor,
getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics,
getForeground,
getGraphics,
getGraphicsConfiguration,
getHeight,
getHierarchyBoundsListeners,
getHierarchyListeners,
getIgnoreRepaint,
getInputContext,
getInputMethodListeners,
getInputMethodRequests,
getKeyListeners, getLocale, getLocation, getLocation, getLocationOnScreen,
getMouseListeners,
getMouseMotionListeners,
getMousePosition,
getMouseWheelListeners,
getName,
getParent,
getPeer,
getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize,
getToolkit, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus,
hide, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable,
isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable,
isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet,
isOpaque, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list,
list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit,
mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage,
prepareImage, printAll, remove, removeComponentListener, removeFocusListener,
removeHierarchyBoundsListener,
removeHierarchyListener,
removeInputMethodListener,
removeKeyListener,
removeMouseListener,
28
Proiect de diplom
removeMouseMotionListener,
removeMouseWheelListener,
removePropertyChangeListener, removePropertyChangeListener, repaint, repaint,
repaint, repaint, requestFocus, requestFocusInWindow, reshape, resize, resize,
setBackground, setBounds, setBounds, setComponentOrientation, setCursor,
setDropTarget,
setEnabled,
setFocusable,
setFocusTraversalKeysEnabled,
setForeground,
setIgnoreRepaint,
setLocale,
setLocation,
setLocation,
setMaximumSize, setMinimumSize, setName, setPreferredSize, setSize, setSize,
setVisible, show, show, size, toString, transferFocus, transferFocusUpCycle
Metode motenite de la clasa java.lang.Object:
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
Clasa VizualizareJoc
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JPanel
VizualizareJoc
Cmpuri motenite de la clasa javax.swing.JComponent:
TOOL_TIP_TEXT_KEY,
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT,
WHEN_IN_FOCUSED_WINDOW
UNDEFINED_CONDITION,
WHEN_FOCUSED,
LEFT_ALIGNMENT,
Proiect de diplom
getPopupLocation,
getRegisteredKeyStrokes,
getRootPane,
getSize,
getToolTipLocation,
getToolTipText,
getToolTipText,
getTopLevelAncestor,
getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners,
getVisibleRect,
getWidth,
getX,
getY,
grabFocus,
isDoubleBuffered,
isLightweightComponent,
isManagingFocus,
isOpaque,
isOptimizedDrawingEnabled,
isPaintingForPrint,
isPaintingTile,
isRequestFocusEnabled, isValidateRoot, paint, paintImmediately, paintImmediately,
print, printAll, putClientProperty, registerKeyboardAction, registerKeyboardAction,
removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint,
repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow,
resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap,
setAlignmentX,
setAlignmentY, setAutoscrolls,
setBackground,
setBorder,
setComponentPopupMenu,
setDebugGraphicsOptions,
setDefaultLocale,
setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground,
setInheritsPopupMenu,
setInputMap,
setInputVerifier,
setMaximumSize,
setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize,
setRequestFocusEnabled,
setToolTipText,
setTransferHandler,
setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
Metode motenite de la clasa java.awt.Container:
add, add, add, add, add, addContainerListener, addPropertyChangeListener,
addPropertyChangeListener,
applyComponentOrientation,
areFocusTraversalKeysSet,
countComponents,
deliverEvent,
doLayout,
findComponentAt,
findComponentAt,
getComponent,
getComponentAt,
getComponentAt, getComponentCount, getComponents, getComponentZOrder,
getContainerListeners,
getFocusTraversalKeys,
getFocusTraversalPolicy,
getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot,
isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet,
layout, list, list, locate, minimumSize, paintComponents, preferredSize,
printComponents,
remove,
remove,
removeAll,
removeContainerListener,
setComponentZOrder,
setFocusCycleRoot,
setFocusTraversalPolicy,
setFocusTraversalPolicyProvider,
setLayout,
transferFocusBackward,
transferFocusDownCycle, validate
Metode motenite de la clasa java.awt.Component:
action,
add,
addComponentListener,
addFocusListener,
addHierarchyBoundsListener,
addHierarchyListener,
addInputMethodListener,
addKeyListener,
addMouseListener,
addMouseMotionListener,
addMouseWheelListener,
bounds,
checkImage,
checkImage,
contains,
createImage,
createImage,
createVolatileImage,
createVolatileImage,
dispatchEvent,
enable,
enableInputMethods,
firePropertyChange,
firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange,
getBackground,
getBounds,
getColorModel,
getComponentListeners,
getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor,
getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground,
30
Proiect de diplom
getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners,
getIgnoreRepaint,
getInputContext,
getInputMethodListeners,
getInputMethodRequests,
getKeyListeners,
getLocale,
getLocation,
getLocationOnScreen,
getMouseListeners,
getMouseMotionListeners,
getMousePosition, getMouseWheelListeners, getName, getParent, getPeer,
getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit,
getTreeLock, gotFocus, handleEvent, hasFocus, hide, imageUpdate, inside,
isBackgroundSet,
isCursorSet,
isDisplayable,
isEnabled,
isFocusable,
isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight,
isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid,
isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown,
mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus,
paintAll,
postEvent,
prepareImage,
prepareImage,
remove,
removeComponentListener,
removeFocusListener,
removeHierarchyBoundsListener,
removeHierarchyListener,
removeInputMethodListener,
removeKeyListener,
removeMouseListener,
removeMouseMotionListener,
removeMouseWheelListener,
removePropertyChangeListener, removePropertyChangeListener, repaint, repaint,
repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor,
setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint,
setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size,
toString, transferFocus, transferFocusUpCycle
Metode motenite de la clasa java.lang.Object:
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
Capitolul III
Funcionarea jocului n imagini
31
Proiect de diplom
32
Proiect de diplom
33
Proiect de diplom
34
Proiect de diplom
35
Proiect de diplom
36
Proiect de diplom
37
Proiect de diplom
38
Proiect de diplom
39
Proiect de diplom
40
Proiect de diplom
41
Proiect de diplom
42
Proiect de diplom
Concluzii
43
Proiect de diplom
Bibliografie
Kirk Knoernschild,
Proiect de diplom
Prentice Hall 2015
https://www.oracle.com/java/index.html
https://ro.wikipedia.org/wiki/Java_(limbaj_de_programare)
https://en.wikipedia.org/wiki/NetBeans#/media/File:NetBeans.sv
g
https://ro.wikipedia.org/wiki/Sudoku
http://perdevelopment.org/top-3-editoare-de-text-pentruprogramatori/
http://wiki.dcae.pub.ro/index.php/No%C8%9Biuni_despre_Java
https://en.wikipedia.org/wiki/NetBeans
http://crististefan.com/inteligent1/
45