- •Перелік скорочень
- •1 Аналіз предеметної області та відомих реалізацій
- •Аналіз предметної області
- •Огляд відомих реалізацій
- •Постановка задачі на розробку програмного забезпечення
- •2 Проектування програмного модуля
- •2.1. Особливості ооп
- •2.2 Універсальна мова проектування uml
- •2.4 Розробка uml-діаграм класів
- •2.3 Розробка алгоритму програми
- •Програмна реалізація спроектованого модуля
- •3.1 Обґрунтування вибору мови та середовища програмування
- •3.2 Програмна реалізація основних модулів
- •3.3 Результати тестування додатку
- •Висновки
- •Список використаної літератури
- •Додатки додаток а
Список використаної літератури
Копитко М. Ф., Іванків К. С. Основи програмування мовою Java: Текстилекцій. – Львів: Видавничи центр ЛНУ ім. Івана Франка, 2002. – 83 с.
Хорстман К., Корнел Г. Java2. Бібліотека професіонала, том 1. Основи. 8 видання. : Пер. з анг./ К. Хорстман, Г. Корнел. – М. :ООО «І. Д. Вільямс», 2011. – 816 с
Беркунський Є.Ю. Об’єктно-орієнтоване програмування мовою Java: Методичні вказівки для студентів напрямку “ Комп’ютерні науки”. – Миколаїв: НУК, 2006. – 52 с.
Буч Г. Язык UML. Руководство пользователя. 2-е изд./ Г. Буч, Д. Рамбо, И. Якобсон // Пер. с англ. Мухин Н. – М.: ДМК Пресс, 2006. – 496 с.: ил.
Фаулер М. UML. Основы / М.Фаулер, К.Скотт// СПб: Символ-Плюс, 2006. – 192 с.
Эккель Б. Философия Java. Библиотека программиста. 4-е изд. // СПб.: Питер, 2009. – 640 с.: ил.
Хорстманн К. Java 2: Библиотека профессионала, том 1. 7-е изд. Основы/ К.Хорстманн, Г. Корнелл // Пер. с англ. – М.: Издательский дом «Вильямс», 2007. – 896 с.: ил. – Парал. тит. англ.
Кривицький О. Мини-отель программа для гостинничного бизнеса [Електронний ресурс] / О. Кривицкий . – Режим доступу: www.kors-soft.ru
Wiliams J. Unified Modeling Language Specification [Електронний ресурс] /www. omg. org.
Додатки додаток а
ТЕХНІЧНЕ ЗАВДАННЯ
Міністерство освіти і науки, молоді та спорту України
Вінницький національний технічний університет
Факультет інформаційних технологій та комп’ютерної інженерії
Кафедра КН
ЗАТВЕРДЖУЮ
Зав. каф. КН, д.т.н., проф.
__________ Перевозніков С.І.
«__» _____________ 2015 р.
ТЕХНІЧНЕ ЗАВДАННЯ
на розробку програмного модуля гри "Сапер"
Найменування та область застосування
Назва курсового проекту – «Розробка програмного модуля для гри "Cапер"».
Підстави для розробки
Завдання на курсове проектування, протокол засідання кафедри КН №_ від “__”________ 2015 р
Найменування та галузь
застосування
Дана робота присвячена розробці програмного модуля для гри "сапер" і призначена для використання користувачами Windows.
Підстава для проведення робіт
Підставою для розробки програмного забезпечення є навчальний план спеціальності 6.050101 «Комп’ютерні науки», робоча програма дисципліни «Об’єктно-орієнтоване програмування», індивідуальне завдання.
Мета: отримання практичних навичок з об’єктно-орієнтованого програмування та проектування програмних продуктів з використанням універсальної мови UML.
6. Технічні вимоги
6.1 Вимоги до функціональних характеристик:
програмний модуль повинен показувати кількість непомічених мін;
програмний модуль повинен показувати час від початку гри;
програмний модуль повинен забезпечити користувачу можливість вибору розмірності поля;
програмний модуль повинен генерувати розміщення мін на полі після відкриття першої комірки випадковим чином;
програмний модуль повинен показувати повідомлення про закінчення гри, виграшу або програшу відповідно.
6.2 Вимоги до програмного середовища:
- операційна система Windows 7 і вище.
ДОДАТОК
Б
БІБЛІОГРАФІЧНІ ДОСЛІДЖЕННЯ
Хорстман К., Корнел Г. Java2. Бібліотека професіонала, том 1. Основи. 8 видання. : Пер. з анг./ К. Хорстман, Г. Корнел. – М. :ООО «І. Д. Вільямс», 2011. – 816 с.
Книга спеціалістів по програмуванню на мові Java представляє собою оновлене видання фундаментальної роботи. Детально розглядаються теми: основні типи даних, ООП і його реалізація в Java, інтерфейси, програмування графіки, обробка подій, колекції та багатопоточність. Книга містить велику кількість прикладів, які не тільки ілюструють концепції, але також демонструють способи правильної розробки, що використовуються в реальних умовах.
2.А.А. Шиян. Теорія ігор: основи та застосування в економіці та менеджменті. Навчальний посібник. / Мороз О. В., Дубовой В.М, Шиян А. А. – Вінниця: ВНТУ, 2009. – 164 с.
Навчальний посібник присвячено викладу теорії ігор як потужного апарату для моделювання задач. Надані до кожного розділу задачі та завдання призначені для використання під час семінарських і практичних занять, а також для самостійних занять студента.
Книга містить велику кількість прикладів, які не тільки ілюструють концепції, але також демонструють способи правильної розробки, що використовуються в реальних умовах.
Фаулер М. UML. Основы / М.Фаулер, К.Скотт// СПб: Символ-Плюс, 2006. – 192 с.
Книга містить основи UML. В роботі було використала загальне визначення мови програмування UML, а також те, що за допомогою засобів автоматизації можна перетворити UML діаграми в вихідний код.
ДОДАТОК
В
ІНСТРУКЦІЯ КОРИСТУВАЧА
Міністерство освіти і науки, молоді та спорту України
Вінницький національний технічний університет
Факультет інформаційних технологій та комп’ютерної інженерії
Кафедра КН
ЗАТВЕРДЖУЮ
Зав. каф. КН, д.т.н., проф.
__________ Перевозніков С.І.
«__» _____________ 2015 р.
ІНСТРУКЦІЯ КОРИСТУВАЧА
,
Перш
за все необхідно відкрити папку з
проектом Minesweeper
та запустити програму.
Рисунок В.1 – Вікно програми
Для зміни розмірності необхідно натиснути на "GAME" і обрати необхідний.
Рисунок В.2 – Вікно програми з вибором розмірності поля
Для введення користувацького розміру поля необхідно обрати "Custom". І вказати кількість рядків(Row), стовпців(Column), і мін(mine), потім натиснути кнопку "OK".
Рисунок В.3 – Вікно програми з введенням користувацького розміру поля
Рисунок В.4 – Вікно програми з користувацькими розмірами поля
У разі програшу користувача, буде відповідне повідомлення на екрані.
Рисунок В.5 – Вікно програми з повідомленням про програш
У разі виграшу користувача, буде відповідне повідомлення на екрані.
Рисунок
В.6 – Вікно програми з повідомленням
про виграш
ДОДАТОК
Г
ГРАФІЧНІ ДОДАТКИ
UML-ДІАГРАМА КЛАСІВ
Рисунок Г.1 – UML-діаграма класу Minesweeper
Рисунок Г.2 – UML-діаграма класу Main
Рисунок Г.3 - UML-діаграма класу Stopwatch
Рисунок Г.4 – UML-діаграма класу MouseHendeler
Рисунок Г.5 – UML-діаграма класу Customizetion
Рисунок Г.8 – UML-діаграма системи бронювання номерів у готелі
ЗОБРАЖЕННЯ
ГОЛОВНИХ ВІКОН ПРОГРАМИ
Рисунок Е.1 – Вікно програми
Рисунок Е.2 – Вікно програми з вибором розмірності поля
Рисунок
Е.3 – Вікно програми з введенням
користувацького
розміру поля
Рисунок Е.4 – Вікно програми з користувацькими розмірами поля
Рисунок Е.5 – Вікно програми з повідомленням про програш
Рисунок
Е.6 – Вікно програми з повідомленням
про
виграш
ДОДАТОК
Д
ЛІСТИНГ ОСНОВНИХ МОДУЛІВ ПРОГРАМИ
Лістинг класу Main
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Minesweeper ob=new Minesweeper();
}
}
Лістинг класу Minesweeper
class Minesweeper extends JFrame implements ActionListener, ContainerListener {
int fw, fh, blockr, blockc, var1, var2, num_of_mine, detectedmine = 0, savedlevel = 1,
savedblockr, savedblockc, savednum_of_mine = 10;
int[] r = {-1, -1, -1, 0, 1, 1, 1, 0};
int[] c = {-1, 0, 1, 1, 1, 0, -1, -1};
JButton[][] blocks;
int[][] countmine;
int[][] colour;
ImageIcon[] ic = new ImageIcon[14];
JPanel panelb = new JPanel();
JPanel panelmt = new JPanel();
JTextField tf_mine, tf_time;
JButton reset = new JButton("");
Random ranr = new Random();
Random ranc = new Random();
boolean check = true, starttime = false;
Point framelocation;
Stopwatch sw;
MouseHendeler mh;
Point p;
Minesweeper() {
super("Minesweeper");
setLocation(400, 300);
setic();
setpanel(1, 0, 0, 0);
setmanue();
sw = new Stopwatch();
reset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try {
sw.stop();
setpanel(savedlevel, savedblockr, savedblockc, savednum_of_mine);
} catch (Exception ex) {
setpanel(savedlevel, savedblockr, savedblockc, savednum_of_mine);
}
reset();
}
});
setDefaultCloseOperation(EXIT_ON_CLOSE);
show();
}
public void reset() {
check = true;
starttime = false;
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
colour[i][j] = 'w';
}
}
}
public void setpanel(int level, int setr, int setc, int setm) {
if (level == 1) {
fw = 200;
fh = 300;
blockr = 10;
blockc = 10;
num_of_mine = 10;
} else if (level == 2) {
fw = 320;
fh = 416;
blockr = 16;
blockc = 16;
num_of_mine = 70;
} else if (level == 3) {
fw = 400;
fh = 520;
blockr = 20;
blockc = 20;
num_of_mine = 150;
} else if (level == 4) {
fw = (20 * setc);
fh = (24 * setr);
blockr = setr;
blockc = setc;
num_of_mine = setm;
}
savedblockr = blockr;
savedblockc = blockc;
savednum_of_mine = num_of_mine;
setSize(fw, fh);
setResizable(false);
detectedmine = num_of_mine;
p = this.getLocation();
blocks = new JButton[blockr][blockc];
countmine = new int[blockr][blockc];
colour = new int[blockr][blockc];
mh = new MouseHendeler();
getContentPane().removeAll();
panelb.removeAll();
tf_mine = new JTextField("" + num_of_mine, 3);
tf_mine.setEditable(false);
tf_mine.setFont(new Font("DigtalFont.TTF", Font.BOLD, 25));
tf_mine.setBackground(Color.BLACK);
tf_mine.setForeground(Color.RED);
tf_mine.setBorder(BorderFactory.createLoweredBevelBorder());
tf_time = new JTextField("000", 3);
tf_time.setEditable(false);
tf_time.setFont(new Font("DigtalFont.TTF", Font.BOLD, 25));
tf_time.setBackground(Color.BLACK);
tf_time.setForeground(Color.RED);
tf_time.setBorder(BorderFactory.createLoweredBevelBorder());
reset.setIcon(ic[11]);
reset.setBorder(BorderFactory.createLoweredBevelBorder());
panelmt.removeAll();
panelmt.setLayout(new BorderLayout());
panelmt.add(tf_mine, BorderLayout.WEST);
panelmt.add(reset, BorderLayout.CENTER);
panelmt.add(tf_time, BorderLayout.EAST);
panelmt.setBorder(BorderFactory.createLoweredBevelBorder());
panelb.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10), BorderFactory.createLoweredBevelBorder()));
panelb.setPreferredSize(new Dimension(fw, fh));
panelb.setLayout(new GridLayout(0, blockc));
panelb.addContainerListener(this);
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
blocks[i][j] = new JButton("");
//blocks[i][j].addActionListener(this);
blocks[i][j].addMouseListener(mh);
panelb.add(blocks[i][j]);
}
}
reset();
panelb.revalidate();
panelb.repaint();
//getcontentpane().setOpaque(true);
getContentPane().setLayout(new BorderLayout());
getContentPane().addContainerListener(this);
//getContentPane().revalidate();
getContentPane().repaint();
getContentPane().add(panelb, BorderLayout.CENTER);
getContentPane().add(panelmt, BorderLayout.NORTH);
setVisible(true);
}
public void setmanue() {
JMenuBar bar = new JMenuBar();
JMenu game = new JMenu("GAME");
JMenuItem menuitem = new JMenuItem("new game");
final JCheckBoxMenuItem beginner = new JCheckBoxMenuItem("Begineer");
final JCheckBoxMenuItem intermediate = new JCheckBoxMenuItem("Intermediate");
final JCheckBoxMenuItem expart = new JCheckBoxMenuItem("Expart");
final JCheckBoxMenuItem custom = new JCheckBoxMenuItem("Custom");
final JMenuItem exit = new JMenuItem("Exit");
final JMenu help = new JMenu("Help");
final JMenuItem helpitem = new JMenuItem("Help");
ButtonGroup status = new ButtonGroup();
menuitem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
//panelb.removeAll();
//reset();
setpanel(1, 0, 0, 0);
//panelb.revalidate();
//panelb.repaint();
}
});
beginner.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
panelb.removeAll();
reset();
setpanel(1, 0, 0, 0);
panelb.revalidate();
panelb.repaint();
beginner.setSelected(true);
savedlevel = 1;
}
});
intermediate.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
panelb.removeAll();
reset();
setpanel(2, 0, 0, 0);
panelb.revalidate();
panelb.repaint();
intermediate.setSelected(true);
savedlevel = 2;
}
});
expart.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
panelb.removeAll();
reset();
setpanel(3, 0, 0, 0);
panelb.revalidate();
panelb.repaint();
expart.setSelected(true);
savedlevel = 3;
}
});
custom.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
//panelb.removeAll();
Customizetion cus = new Customizetion();
reset();
panelb.revalidate();
panelb.repaint();
//Minesweeper ob=new Minesweeper(4);
custom.setSelected(true);
savedlevel = 4;
}
});
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
helpitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "instruction");
}
});
setJMenuBar(bar);
status.add(beginner);
status.add(intermediate);
status.add(expart);
status.add(custom);
game.add(menuitem);
game.addSeparator();
game.add(beginner);
game.add(intermediate);
game.add(expart);
game.add(custom);
game.addSeparator();
game.add(exit);
help.add(helpitem);
bar.add(game);
bar.add(help);
}
public void componentAdded(ContainerEvent ce) {
}
public void componentRemoved(ContainerEvent ce) {
}
public void actionPerformed(ActionEvent ae) {
}
Лістинг класу MouseHendeler
class MouseHendeler extends MouseAdapter {
public void mouseClicked(MouseEvent me) {
if (check == true) {
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
if (me.getSource() == blocks[i][j]) {
var1 = i;
var2 = j;
i = blockr;
break;
}
}
}
setmine();
calculation();
check = false;
}
showvalue(me);
winner();
if (starttime == false) {
sw.Start();
starttime = true;
}
}
}
public void winner() {
int q = 0;
for (int k = 0; k < blockr; k++) {
for (int l = 0; l < blockc; l++) {
if (colour[k][l] == 'w') {
q = 1;
}
}
}
if (q == 0) {
//panelb.hide();
for (int k = 0; k < blockr; k++) {
for (int l = 0; l < blockc; l++) {
blocks[k][l].removeMouseListener(mh);
}
}
sw.stop();
JOptionPane.showMessageDialog(this, "u R a lover");
}
}
public void showvalue(MouseEvent e) {
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
if (e.getSource() == blocks[i][j]) {
if (e.isMetaDown() == false) {
if (blocks[i][j].getIcon() == ic[10]) {
if (detectedmine < num_of_mine) {
detectedmine++;
}
tf_mine.setText("" + detectedmine);
}
if (countmine[i][j] == -1) {
for (int k = 0; k < blockr; k++) {
for (int l = 0; l < blockc; l++) {
if (countmine[k][l] == -1) {
//blocks[k][l].setText("X");
blocks[k][l].setIcon(ic[9]);
//blocks[k][l].setBackground(Color.BLUE);
//blocks[k][l].setFont(new Font("",Font.CENTER_BASELINE,8));
blocks[k][l].removeMouseListener(mh);
}
blocks[k][l].removeMouseListener(mh);
}
}
sw.stop();
reset.setIcon(ic[12]);
JOptionPane.showMessageDialog(null, "sorry u R loser");
} else if (countmine[i][j] == 0) {
dfs(i, j);
} else {
blocks[i][j].setIcon(ic[countmine[i][j]]);
//blocks[i][j].setText(""+countmine[i][j]);
//blocks[i][j].setBackground(Color.pink);
//blocks[i][j].setFont(new Font("",Font.PLAIN,8));
colour[i][j] = 'b';
//blocks[i][j].setBackground(Color.pink);
break;
}
} else {
if (detectedmine != 0) {
if (blocks[i][j].getIcon() == null) {
detectedmine--;
blocks[i][j].setIcon(ic[10]);
}
tf_mine.setText("" + detectedmine);
}
}
}
}
}
}
public void calculation() {
int row, column;
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
int value = 0;
int R, C;
row = i;
column = j;
if (countmine[row][column] != -1) {
for (int k = 0; k < 8; k++) {
R = row + r[k];
C = column + c[k];
if (R >= 0 && C >= 0 && R < blockr && C < blockc) {
if (countmine[R][C] == -1) {
value++;
}
}
}
countmine[row][column] = value;
}
}
}
}
public void dfs(int row, int col) {
int
R,
C;
colour[row][col] = 'b';
blocks[row][col].setBackground(Color.GRAY);
blocks[row][col].setIcon(ic[countmine[row][col]]);
//blocks[row][col].setText("");
for (int i = 0; i < 8; i++) {
R = row + r[i];
C = col + c[i];
if (R >= 0 && R < blockr && C >= 0 && C < blockc && colour[R][C] == 'w') {
if (countmine[R][C] == 0) {
dfs(R, C);
} else {
blocks[R][C].setIcon(ic[countmine[R][C]]);
//blocks[R][C].setText(""+countmine[R][C]);
//blocks[R][C].setBackground(Color.pink);
//blocks[R][C].setFont(new Font("",Font.BOLD,));
colour[R][C] = 'b';
}
}
}
}
public void setmine() {
int row = 0, col = 0;
Boolean[][] flag = new Boolean[blockr][blockc];
for (int i = 0; i < blockr; i++) {
for (int j = 0; j < blockc; j++) {
flag[i][j] = true;
countmine[i][j] = 0;
}
}
flag[var1][var2] = false;
colour[var1][var2] = 'b';
for (int i = 0; i < num_of_mine; i++) {
row = ranr.nextInt(blockr);
col = ranc.nextInt(blockc);
if (flag[row][col] == true) {
countmine[row][col] = -1;
colour[row][col] = 'b';
flag[row][col] = false;
} else {
i--;
}
}
}
public void setic() {
String name;
for (int i = 0; i <= 8; i++) {
name
= i
+ ".gif";
ic[i] = new ImageIcon(name);
}
ic[9] = new ImageIcon("mine.gif");
ic[10] = new ImageIcon("flag.gif");
ic[11] = new ImageIcon("new game.gif");
ic[12] = new ImageIcon("crape.gif");
}
Лістинг класу Stopwatch
public class Stopwatch extends JFrame implements Runnable {
long startTime;
//final static java.text.SimpleDateFormat timerFormat = new java.text.SimpleDateFormat("mm : ss :SSS");
//final JButton startStopButton= new JButton("Start/stop");
Thread updater;
boolean isRunning = false;
long a = 0;
Runnable displayUpdater = new Runnable() {
public void run() {
displayElapsedTime(a);
a++;
}
};
public void stop() {
long elapsed = a;
isRunning = false;
try {
updater.join();
} catch (InterruptedException ie) {
}
displayElapsedTime(elapsed);
a = 0;
}
private void displayElapsedTime(long elapsedTime) {
if (elapsedTime >= 0 && elapsedTime < 9) {
tf_time.setText("00" + elapsedTime);
} else if (elapsedTime > 9 && elapsedTime < 99) {
tf_time.setText("0" + elapsedTime);
} else if (elapsedTime > 99 && elapsedTime < 999) {
tf_time.setText("" + elapsedTime);
}
}
public void run() {
try {
while (isRunning) {
SwingUtilities.invokeAndWait(displayUpdater);
Thread.sleep(1000);
}
}
catch
(java.lang.reflect.InvocationTargetException ite)
{
ite.printStackTrace(System.err);
} catch (InterruptedException ie) {
}
}
public void Start() {
startTime = System.currentTimeMillis();
isRunning = true;
updater = new Thread(this);
updater.start();
}
}
Лістинг класу Customizetion
class Customizetion extends JFrame implements ActionListener {
JTextField t1, t2, t3;
JLabel lb1, lb2, lb3;
JButton b1, b2;
int cr, cc, cm, actionc = 0;
Customizetion() {
super("CUSTOMIZETION");
setSize(180, 200);
setResizable(false);
setLocation(p);
t1 = new JTextField();
t2 = new JTextField();
t3 = new JTextField();
b1 = new JButton("OK");
b2 = new JButton("Cencel");
b1.addActionListener(this);
b2.addActionListener(this);
lb1 = new JLabel("Row");
lb2 = new JLabel("Column");
lb3 = new JLabel("mine");
getContentPane().setLayout(new GridLayout(0, 2));
getContentPane().add(lb1);
getContentPane().add(t1);
getContentPane().add(lb2);
getContentPane().add(t2);
getContentPane().add(lb3);
getContentPane().add(t3);
getContentPane().add(b1);
getContentPane().add(b2);
show();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == b1) {
try {
cr
= Integer.parseInt(t1.getText());
cc = Integer.parseInt(t2.getText());
cm = Integer.parseInt(t3.getText());
//Minesweeper ms=new Minesweeper();
setpanel(4, row(), column(), mine());
dispose();
} catch (Exception any) {
JOptionPane.showMessageDialog(this, "Wrong");
t1.setText("");
t2.setText("");
t3.setText("");
}
//Show_rcm();
}
if (e.getSource() == b2) {
dispose();
}
}
public int row() {
if (cr > 30) {
return 30;
} else if (cr < 10) {
return 10;
} else {
return cr;
}
}
public int column() {
if (cc > 30) {
return 30;
} else if (cc < 10) {
return 10;
} else {
return cc;
}
}
public int mine() {
if (cm > ((row() - 1) * (column() - 1))) {
return ((row() - 1) * (column() - 1));
} else if (cm < 10) {
return 10;
} else {
return cm;
}
}
}
}
