Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.92 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;
  8. import java.io.Serializable;
  9. import java.util.ArrayList;
  10. import java.util.Random;
  11. import javax.swing.*;
  12. import javax.swing.border.LineBorder;
  13.  
  14. import java.awt.*;
  15. import javax.swing.plaf.basic.BasicArrowButton;
  16.  
  17. class Dane implements Serializable {
  18. int rozmiar = 7;
  19. int szerokoscOkna = 1280;
  20. int wysokoscOkna = 720;
  21. Pole kratki[][] = new Pole[rozmiar][rozmiar];
  22. ArrayList<Point> historia = new ArrayList<Point>();
  23. ArrayList<Point> historia2 = new ArrayList<Point>();
  24. JButton cofnij = new JButton("cofnij");
  25. JButton przywroc = new JButton("przywroc");
  26. }
  27.  
  28. class Pole extends JButton {
  29.  
  30. /**
  31. *
  32. */
  33. private static final long serialVersionUID = 1L;
  34. int x;
  35. int y;
  36. Color kolorek = new Color(182, 126, 226);
  37. Color kolorek2 = new Color(164, 95, 220);
  38. Color kolorek3 = new Color(143, 61, 211);
  39. boolean czyKlik = false;
  40. boolean ukryty = false;
  41. boolean czyCofnij = false;
  42. int wartosc;
  43. Random random = new Random();
  44.  
  45. private void czyWygrana() {
  46. int roz = Sekwencje.dane.rozmiar;
  47. int dobrze = 0;
  48. for(int i = 1; i < roz - 1; i++) {
  49. boolean v = false;
  50. boolean v2 = false;
  51. boolean v3 = false;
  52. boolean v4 = false;
  53. int val = Sekwencje.dane.kratki[0][i].wartosc; // gora
  54. int val2 = Sekwencje.dane.kratki[roz - 1][i].wartosc; // dol
  55. int val3 = Sekwencje.dane.kratki[i][0].wartosc; // lewo
  56. int val4 = Sekwencje.dane.kratki[i][roz - 1].wartosc; // prawo
  57. if(val == 0)
  58. v = true;
  59. else if(val2 == 0)
  60. v2 = true;
  61. else if(val3 == 0)
  62. v3 = true;
  63. else if(val4 == 0)
  64. v4 = true;
  65. int vals = 0;
  66. int vals2 = 0;
  67. int vals3 = 0;
  68. int vals4 = 0;
  69. for(int j = 1; j < roz - 1; j++) {
  70. if(Sekwencje.dane.kratki[j][i].czyKlik == false) { // gora i dol
  71. vals ++;
  72. if(vals >= val)
  73. v = true;
  74. vals2 = 0;
  75. }
  76. else {
  77. vals2 ++;
  78. if(vals2 >= val2)
  79. v2 = true;
  80. vals = 0;
  81. }
  82. if(Sekwencje.dane.kratki[i][j].czyKlik == false) { // lewo i prawo
  83. vals3 ++;
  84. if(vals3 >= val3)
  85. v3 = true;
  86. vals4 = 0;
  87. }
  88. else {
  89. vals4 ++;
  90. if(vals4 >= val4)
  91. v4 = true;
  92. vals3 = 0;
  93. }
  94. }
  95. if(v == true && v2 == true && v3 == true && v4 == true)
  96. dobrze ++;
  97. }
  98. if(dobrze == Sekwencje.dane.rozmiar - 2)
  99. ((Plansza) this.getParent().getParent().getParent().getParent().getParent().getParent()).wygrana();
  100. }
  101.  
  102. //nadpisuje rysowanie guzikow, zeby miec dostep do rollover itp, uzywam tego zamiast actionlistenera
  103. @Override
  104. protected void paintComponent(Graphics g) {
  105. if(getModel().isEnabled() == true){
  106. if (getModel().isPressed()) {
  107. if(this.czyKlik == false) {
  108. this.setBackground(kolorek);
  109. this.czyKlik = true;
  110. }
  111. else {
  112. this.setBackground(kolorek3);
  113. this.czyKlik = false;
  114. }
  115. getModel().setPressed(false);
  116. getModel().setRollover(false);
  117. if(czyCofnij == false) {
  118. Sekwencje.dane.historia.add(new Point(x, y));
  119. Sekwencje.dane.cofnij.setEnabled(true);
  120. Sekwencje.dane.przywroc.setEnabled(false);
  121. Sekwencje.dane.historia2.clear();
  122. }
  123. czyCofnij = false;
  124. czyWygrana();
  125. }
  126. else if (getModel().isRollover())
  127. this.setBackground(kolorek2);
  128. else {
  129. if(this.czyKlik == false)
  130. this.setBackground(kolorek);
  131. else
  132. this.setBackground(kolorek3);
  133. }
  134. }
  135. super.paintComponent(g);
  136. }
  137.  
  138. //konstruktor guzikow
  139. Pole(int a, int b) {
  140. x = a;
  141. y = b;
  142. this.setText("");
  143. this.setFont(new Font(this.getFont().getFontName(), this.getFont().getStyle(), 48));
  144. this.setBackground(kolorek);
  145. this.setBorder(new LineBorder(new Color(180, 184, 29)));
  146. this.setFocusPainted(false);
  147. this.ukryty = random.nextBoolean();
  148. UIManager.getDefaults().put("Button.disabledText", Color.BLACK); //zmiana koloru tekstu na guzikach jesli sa wylaczone
  149. UIManager.getDefaults().put("TextArea.disabledText", Color.BLACK); //zmiana koloru tekstu na pomocy
  150. }
  151. }
  152.  
  153. class Plansza extends JFrame {
  154. JSplitPane split = new JSplitPane();
  155. JPanel plansza = new JPanel();
  156. JPanel opcje = new JPanel();
  157. JPanel help = new JPanel();
  158. JPanel wygrana = new JPanel();
  159. Container cp = getContentPane();
  160. JTextField rozmiarText = new JTextField();
  161. JTextArea pomocText = new JTextArea();
  162.  
  163. class NowaGra implements ActionListener {
  164. public void actionPerformed(ActionEvent e) {
  165. Sekwencje.dane.kratki = new Pole[Sekwencje.dane.rozmiar][Sekwencje.dane.rozmiar];
  166. Sekwencje.dane.historia.clear();
  167. Sekwencje.dane.historia2.clear();
  168. plansza = new JPanel();
  169. init();
  170. stworz();
  171. zlicz();
  172. }
  173. }
  174.  
  175. class Cofnij implements ActionListener {
  176. public void actionPerformed(ActionEvent e) {
  177. Point poz = new Point(Sekwencje.dane.historia.get(Sekwencje.dane.historia.size() - 1).x, Sekwencje.dane.historia.get(Sekwencje.dane.historia.size() - 1).y);
  178. Sekwencje.dane.kratki[poz.x][poz.y].czyCofnij = true;
  179. if(Sekwencje.dane.kratki[poz.x][poz.y].getModel().isPressed() == true)
  180. Sekwencje.dane.kratki[poz.x][poz.y].getModel().setPressed(false);
  181. else
  182. Sekwencje.dane.kratki[poz.x][poz.y].getModel().setPressed(true);
  183. Sekwencje.dane.historia2.add(Sekwencje.dane.historia.get(Sekwencje.dane.historia.size() - 1));
  184. Sekwencje.dane.historia.remove(Sekwencje.dane.historia.size() - 1);
  185. Sekwencje.dane.przywroc.setEnabled(true);
  186. if(Sekwencje.dane.historia.size() == 0)
  187. Sekwencje.dane.cofnij.setEnabled(false);
  188. }
  189. }
  190.  
  191. class Przywroc implements ActionListener {
  192. public void actionPerformed(ActionEvent e) {
  193. Point poz = new Point(Sekwencje.dane.historia2.get(Sekwencje.dane.historia2.size() - 1).x, Sekwencje.dane.historia2.get(Sekwencje.dane.historia2.size() - 1).y);
  194. Sekwencje.dane.kratki[poz.x][poz.y].czyCofnij = true;
  195. if(Sekwencje.dane.kratki[poz.x][poz.y].getModel().isPressed() == true)
  196. Sekwencje.dane.kratki[poz.x][poz.y].getModel().setPressed(false);
  197. else
  198. Sekwencje.dane.kratki[poz.x][poz.y].getModel().setPressed(true);
  199. Sekwencje.dane.historia.add(Sekwencje.dane.historia2.get(Sekwencje.dane.historia2.size() - 1));
  200. Sekwencje.dane.historia2.remove(Sekwencje.dane.historia2.size() - 1);
  201. Sekwencje.dane.cofnij.setEnabled(true);
  202. if(Sekwencje.dane.historia2.size() == 0)
  203. Sekwencje.dane.przywroc.setEnabled(false);
  204. }
  205. }
  206.  
  207. class RozmiarGuzik implements ActionListener {
  208. public void actionPerformed(ActionEvent e) {
  209. if(((BasicArrowButton) e.getSource()).getDirection() == 1)
  210. Sekwencje.dane.rozmiar ++;
  211. else
  212. Sekwencje.dane.rozmiar --;
  213.  
  214. if(Sekwencje.dane.rozmiar < 5)
  215. Sekwencje.dane.rozmiar = 5;
  216. if(Sekwencje.dane.rozmiar > 22)
  217. Sekwencje.dane.rozmiar = 22;
  218.  
  219. rozmiarText.setText(Integer.toString(Sekwencje.dane.rozmiar - 2));
  220. }
  221. }
  222.  
  223. class Zapisz implements ActionListener {
  224. public void actionPerformed(ActionEvent e) {
  225. JFileChooser j = new JFileChooser();
  226. j.setApproveButtonText("Zapisz");
  227. int r = j.showOpenDialog(null);
  228. if(r == JFileChooser.APPROVE_OPTION){
  229. try {
  230. FileOutputStream f = new FileOutputStream(j.getSelectedFile());
  231. ObjectOutputStream os = new ObjectOutputStream(f);
  232. os.writeObject(Sekwencje.dane);
  233. f.close();
  234. } catch (IOException x) {}
  235. }
  236. }
  237. }
  238.  
  239. class Wczytaj implements ActionListener {
  240. public void actionPerformed(ActionEvent e) {
  241. JFileChooser j = new JFileChooser();
  242. j.setApproveButtonText("Wczytaj");
  243. int r = j.showOpenDialog(null);
  244.  
  245. if(r == JFileChooser.APPROVE_OPTION){
  246. try {
  247. FileInputStream f = new FileInputStream(j.getSelectedFile());
  248. ObjectInputStream is = new ObjectInputStream (f);
  249. Sekwencje.dane = (Dane)is.readObject();
  250. f.close();
  251. } catch (IOException x) {} catch (ClassNotFoundException x){}
  252. plansza = new JPanel();
  253. opcje = new JPanel();
  254. if(Sekwencje.dane.historia.size() > 0)
  255. Sekwencje.dane.cofnij.setEnabled(true);
  256. if(Sekwencje.dane.historia2.size() > 0)
  257. Sekwencje.dane.przywroc.setEnabled(true);
  258. init();
  259. zlicz();
  260. opcje();
  261. for (int i = 0; i < Sekwencje.dane.rozmiar; i++) {
  262. for (int i2 = 0; i2 < Sekwencje.dane.rozmiar; i2++) {
  263. plansza.add(Sekwencje.dane.kratki[i][i2]);
  264. }
  265. }
  266. }
  267. }
  268. }
  269.  
  270. class Pomoc implements ActionListener {
  271. public void actionPerformed(ActionEvent e) {
  272. if(split.getLeftComponent().getName() == "plansza")
  273. split.setLeftComponent(help);
  274. else
  275. split.setLeftComponent(plansza);
  276. rozmiarUpdate();
  277. }
  278. }
  279.  
  280. private void rozmiarUpdate() {
  281. Sekwencje.dane.szerokoscOkna = this.getWidth();
  282. Sekwencje.dane.wysokoscOkna = this.getHeight();
  283. split.setDividerLocation(this.getWidth() / 10 * 7);
  284. pomocText.setSize(Sekwencje.dane.szerokoscOkna / 10 * 7, Sekwencje.dane.wysokoscOkna);
  285. }
  286.  
  287. private void init() {
  288. this.setSize(Sekwencje.dane.szerokoscOkna, Sekwencje.dane.wysokoscOkna);
  289. this.setVisible(true);
  290.  
  291. // zmiana wielkosci okna przesuwa podzial ekranu w odpowiednie miejsce
  292. this.addComponentListener(new ComponentAdapter() {
  293. public void componentResized(ComponentEvent componentEvent) {
  294. rozmiarUpdate();
  295. }
  296. });
  297. Sekwencje.dane.cofnij.setEnabled(false);
  298. Sekwencje.dane.przywroc.setEnabled(false);
  299. plansza.setLayout(new GridLayout(Sekwencje.dane.rozmiar, Sekwencje.dane.rozmiar));
  300. plansza.setName("plansza");
  301. opcje.setLayout(new GridLayout(3, 3));
  302. split.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
  303. split.setLeftComponent(plansza);
  304. split.setRightComponent(opcje);
  305. split.setEnabled(false);
  306. rozmiarUpdate();
  307. cp.add(split);
  308. }
  309.  
  310. private void opcje() {
  311. BasicArrowButton rozmiarZwieksz = new BasicArrowButton(BasicArrowButton.NORTH);
  312. BasicArrowButton rozmiarZmniejsz = new BasicArrowButton(BasicArrowButton.SOUTH);
  313. JTextField wygranaText = new JTextField();
  314. pomocText.setText("Cyfry przy brzegu diagramu oznaczają, z ilu pól jasnych (cyfry u góry i z lewej strony) lub ciemnych (cyfry u dołu i z prawej strony) składa się najdłuższa sekwencja (nieprzerwany ciąg pól) w danym rzędzie lub kolumnie. Zaczernione przy wykorzystaniu tych współrzędnych odpowiednie pola - utworzą rysunek.");
  315. pomocText.setFont(new Font(this.getFont().getFontName(), this.getFont().getStyle(), 48));
  316. pomocText.setWrapStyleWord(true);
  317. pomocText.setDisabledTextColor(Color.BLACK);
  318. pomocText.setLineWrap(true);
  319. pomocText.setOpaque(false);
  320. pomocText.setEnabled(false);
  321. rozmiarText.setText(Integer.toString(Sekwencje.dane.rozmiar - 2));
  322. rozmiarText.setFont(new Font(this.getFont().getFontName(), this.getFont().getStyle(), 48));
  323. rozmiarText.setHorizontalAlignment(JTextField.CENTER);
  324. rozmiarText.setEditable(false);
  325. wygranaText.setBackground(new Color(0, 0, 0, 0));
  326. wygranaText.setFont(new Font(this.getFont().getFontName(), this.getFont().getStyle(), 48));
  327. wygranaText.setHorizontalAlignment(JTextField.CENTER);
  328. wygranaText.setText("WYGRANA!");
  329. wygranaText.setLayout(null);
  330. rozmiarZwieksz.addActionListener(new RozmiarGuzik());
  331. rozmiarZmniejsz.addActionListener(new RozmiarGuzik());
  332. Sekwencje.dane.cofnij.addActionListener(new Cofnij());
  333. Sekwencje.dane.przywroc.addActionListener(new Przywroc());
  334. JButton nowaGra = new JButton("Nowa gra");
  335. JButton zapisz = new JButton("Zapisz");
  336. JButton wczytaj = new JButton("Wczytaj");
  337. JButton pomoc = new JButton("Pomoc");
  338. nowaGra.addActionListener(new NowaGra());
  339. zapisz.addActionListener(new Zapisz());
  340. wczytaj.addActionListener(new Wczytaj());
  341. pomoc.addActionListener(new Pomoc());
  342. help.add(pomocText);
  343. opcje.add(nowaGra);
  344. opcje.add(zapisz);
  345. opcje.add(wczytaj);
  346. opcje.add(rozmiarText);
  347. opcje.add(rozmiarZwieksz);
  348. opcje.add(rozmiarZmniejsz);
  349. opcje.add(Sekwencje.dane.cofnij);
  350. opcje.add(Sekwencje.dane.przywroc);
  351. opcje.add(pomoc);
  352. rozmiarUpdate();
  353. }
  354.  
  355. // zliczanie wartosci brzegow planszy
  356. private void zlicz() {
  357. for (int i = 1; i < Sekwencje.dane.rozmiar - 1; i++) {
  358. int maxKlik = 0;
  359. int tempKlik = 0;
  360. int maxnKlik = 0;
  361. int tempnKlik = 0;
  362. int maxKlik2 = 0;
  363. int tempKlik2 = 0;
  364. int maxnKlik2 = 0;
  365. int tempnKlik2 = 0;
  366. for (int j = 1; j < Sekwencje.dane.rozmiar - 1; j++) {
  367. if (Sekwencje.dane.kratki[i][j].ukryty == true) {
  368. tempnKlik = 0;
  369. tempKlik++;
  370. if (tempKlik > maxKlik)
  371. maxKlik = tempKlik;
  372. } else {
  373. tempKlik = 0;
  374. tempnKlik++;
  375. if (tempnKlik > maxnKlik)
  376. maxnKlik = tempnKlik;
  377. }
  378. if (Sekwencje.dane.kratki[j][i].ukryty == true) {
  379. tempnKlik2 = 0;
  380. tempKlik2++;
  381. if (tempKlik2 > maxKlik2)
  382. maxKlik2 = tempKlik2;
  383. } else {
  384. tempKlik2 = 0;
  385. tempnKlik2++;
  386. if (tempnKlik2 > maxnKlik2)
  387. maxnKlik2 = tempnKlik2;
  388. }
  389. }
  390. Sekwencje.dane.kratki[i][0].wartosc = maxnKlik;
  391. Sekwencje.dane.kratki[i][Sekwencje.dane.rozmiar - 1].wartosc = maxKlik;
  392. Sekwencje.dane.kratki[0][i].wartosc = maxnKlik2;
  393. Sekwencje.dane.kratki[Sekwencje.dane.rozmiar - 1][i].wartosc = maxKlik2;
  394.  
  395. Sekwencje.dane.kratki[i][0].setText(Integer.toString(maxnKlik));
  396. Sekwencje.dane.kratki[i][Sekwencje.dane.rozmiar - 1].setText(Integer.toString(maxKlik));
  397. Sekwencje.dane.kratki[0][i].setText(Integer.toString(maxnKlik2));
  398. Sekwencje.dane.kratki[Sekwencje.dane.rozmiar - 1][i].setText(Integer.toString(maxKlik2));
  399. }
  400. }
  401.  
  402. // tworzenie planszy
  403. private void stworz() {
  404. for (int i = 0; i < Sekwencje.dane.rozmiar; i++) {
  405. for (int j = 0; j < Sekwencje.dane.rozmiar; j++) {
  406. Sekwencje.dane.kratki[i][j] = new Pole(i, j);
  407. if (i == 0 || i == Sekwencje.dane.rozmiar - 1 || j == 0 || j == Sekwencje.dane.rozmiar - 1) {
  408. if (i == Sekwencje.dane.rozmiar - 1 && j == Sekwencje.dane.rozmiar - 1)
  409. Sekwencje.dane.kratki[i][j].setBackground(new Color(143, 61, 211));
  410. else if (i == 0 && j == 0)
  411. Sekwencje.dane.kratki[i][j].setBackground(new Color(208, 173, 237));
  412. else if ((i == 0 && j == Sekwencje.dane.rozmiar - 1) || (i == Sekwencje.dane.rozmiar - 1 && j == 0))
  413. Sekwencje.dane.kratki[i][j].setVisible(false);
  414. Sekwencje.dane.kratki[i][j].setEnabled(false);
  415. }
  416. plansza.add(Sekwencje.dane.kratki[i][j]);
  417. }
  418. }
  419. }
  420.  
  421. public void wygrana() {
  422. System.out.println("tet");
  423. Sekwencje.dane.cofnij.setEnabled(false);
  424. Sekwencje.dane.przywroc.setEnabled(false);
  425. Sekwencje.dane.kratki[Sekwencje.dane.rozmiar / 2][Sekwencje.dane.rozmiar / 2].setText(":)");
  426. for(Component component : plansza.getComponents()) {
  427. component.setEnabled(false);
  428. }
  429. }
  430. // konstruktor planszy
  431. Plansza() {
  432. init();
  433. stworz();
  434. zlicz();
  435. opcje();
  436. setDefaultCloseOperation(EXIT_ON_CLOSE);
  437. }
  438.  
  439. }
  440.  
  441. public class Sekwencje {
  442. static Dane dane = new Dane();
  443. public static void main(String arg[]) {
  444. JFrame gra = new Plansza();
  445. }
  446. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement