Zápočtový test 30.1.

Předmět zaměřený na praktické programování v jazyku a prostředí Java
Oracions

Zápočtový test 30.1.

Příspěvek od Oracions »

Naprogramujte Pacmana v grafickém okně. Mapa je zadaná v textovém souboru (w=zeď,f=kulička k sebrání,p=startovní pozice), obrázky "wall.png", "dot.png", "pacmanLeft.png"..."pacmanDown.png" jsou k dispozici. Pacman se pohybuje diskrétně po celých políčkách, jednou za 500 milisekund. Hráč ovládá Pacmana šipkama (stiskutí šipky změní směr). Nejsou žádní nepřátelé. Jakmile Pacman sebere poslední kuličku, hra vyhodí JOptionPane s textem "You won" a ukončí se.
Lazybug123

Re: Zápočtový test 30.1.

Příspěvek od Lazybug123 »

Zadanie tohoto terminu bolo v anglictine, aj s cviciacim sa komunikovalo v anglictine. Ale dalo sa s nim uplne v pohode dohovorit.

Kvoli tej anglictine nas tam prislo velmi malo, iba 5. Ale kazdy, kto neprisiel, urobil chybu, lebo to bolo zatial asi najlahsie zadanie. Uspesnost bola 80%, okrem jedneho to dali vsetci. Maly pocet ludi mal aj tu vyhodu, ze cviciaci nam vsetkym stihol dost poradit, ked bolo treba. Navyse tie obrazky nebolo treba nutne pouzit, to bolo len skor na okrasu. Na uznanie stacilo mat miesto obrazkov pismenka. Cas sa nenadstavoval, nebolo treba. Z uspesnych to vsetci s rezervou stihli.

Cviciaci bol velmi mily, naozaj odporucam ist na jeho (teda ten jeden anglicky) termin. Na zaciatku nam este vysvetloval, ze naschval vyberal take zadanie, aby tam neboli thready a podobne krutosti :) Snazil sa, aby sme vsetci presli, a kazdemu poradil, co je na terminoch z Javy velkou vynimkou. Tiez podmienky na uznanie boli velmi prijemne: cestu vstupneho suboru aj obrazkov stacilo zadratovat natvrdo, nemuseli sme riesit zly vstup, a testovalo sa len na jednom vstupe, takze aj velkost vstupu sme tam mohli mat natvrdo.

Jedina tazsia cast bol ten timer, ActionListener a KeyListener. Ale pri tych sa stacilo inspirovat riesenim zadania Tetris, ktore je tu niekde na fore :)

Prikladam moj kod pre dalsie generacie. Miesto obrazkov mam len tie pismenka a rozmery hracej plochy tam mam zadratovane natvrdo, za co sa ospravedlnujem. Ale na uznanie to stacilo :)

Kód: Vybrat vše

package pacman;

import java.io.*;
import javax.swing.*;
import java.awt.*;
import javax.imageio.*;
import java.awt.event.*;

public class Main implements KeyListener {

    JFrame frame;
    JLabel label;
    char[][] pole;
    JButton[][] policka;
    int fruitLeft;
    int x;
    int y;
    int vyska;
    int sirka;
    JButton start;
    ActionListener timerFire;

    enum en {UP, DOWN, LEFT, RIGHT};
    en smer;

    public void keyTyped(KeyEvent e) {
    }
    
    public void keyPressed(KeyEvent e) {
	if (e.getKeyCode()==KeyEvent.VK_UP) smer = en.UP;
        else if (e.getKeyCode()==KeyEvent.VK_DOWN) smer = en.DOWN;
        else if (e.getKeyCode()==KeyEvent.VK_LEFT) smer = en.LEFT;
        else if (e.getKeyCode()==KeyEvent.VK_RIGHT) smer = en.RIGHT;
    }

    public void keyReleased(KeyEvent e) {
    }

    public Main() {

        timerFire = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                Move();
            }
        };

        String subor = "/afs/ms/u/d/blablabla/Desktop/resources/map.txt";
        frame = new JFrame("Pacman");
        JFrame.setDefaultLookAndFeelDecorated(true);
        Container pane = frame.getContentPane();
        pane.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fruitLeft = 0;
        Container vrch = new Container();
        
        Container spodok = new Container();
        spodok.setLayout(new FlowLayout());

        smer = en.UP; //defaultny smer

        try
        {
            FileInputStream fstream = new FileInputStream(subor);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));

            String line = br.readLine();
            sirka = line.length(); //10
            vyska = 8;

            vrch.setLayout(new GridLayout(vyska, sirka));
            
            pole = new char[vyska][sirka];
            policka = new JButton[vyska][sirka];
            for (int i = 0; i< sirka; i++)
            {
                pole[0][i] = line.charAt(i);
            }
            int i = 1;
            while ((line = br.readLine()) != null)
            {
                for (int j = 0; j< sirka; j++)
                {
                        pole[i][j] = line.charAt(j);
                        if (pole[i][j] == 'f')
                            fruitLeft++;
                        else if (pole[i][j] == 'p')
                        {
                            y = i;
                            x = j;
                        }
                }
                i++;
            }

            for (i = 0; i< vyska; i++)
            {
                for (int j = 0; j< sirka; j++)
                {
                    policka[i][j] = new JButton(Character.toString(pole[i][j]));
                    policka[i][j].setText(Character.toString(pole[i][j]));
                    policka[i][j].setPreferredSize( new Dimension(50, 50));
                    vrch.add(policka[i][j]);
                }
            }
        }
        catch (Exception e)
        {
            System.out.println("Chyba vstupu!");
        }

        label = new JLabel("Fruit left: " + Integer.toString(fruitLeft));
        spodok.add(label);
        frame.add(vrch);
        frame.add(spodok);
        
        start = new JButton("Start game");
        spodok.add(start);
        start.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent ae) 
            {
                javax.swing.Timer timer = new Timer(500, timerFire);
                timer.setRepeats(true);
                timer.start();
            }
        });

        //asi stacilo iba jedno z toho, ale nechcelo sa mi to riesit
        frame.addKeyListener(this);
        start.addKeyListener(this);
        vrch.addKeyListener(this);

        frame.pack();
        frame.setVisible(true);
    }


    private void Move()
    {
        if (smer == en.UP && y - 1 >= 0 && !policka[y-1][x].getText().equals("w"))
        {
            policka[y][x].setText(" ");

            y = y-1;//posun sa
            if (policka[y][x].getText().equals("f"))
            {
                fruitLeft--;
            }
            policka[y][x].setText("p");
            label.setText("Fruit left: " + Integer.toString(fruitLeft));
        }
        else if (smer == en.DOWN && y + 1 < vyska && !policka[y+1][x].getText().equals("w"))
        {
            policka[y][x].setText(" ");

            y = y+1;//posun sa
            if (policka[y][x].getText().equals("f"))
            {
                fruitLeft--;
            }
            policka[y][x].setText("p");
            label.setText("Fruit left: " + Integer.toString(fruitLeft));
        }
        else if (smer == en.RIGHT && x + 1 >= 0 && !policka[y][x+1].getText().equals("w"))
        {
            policka[y][x].setText(" ");

            x = x+1;//posun sa
            if (policka[y][x].getText().equals("f"))
            {
                fruitLeft--;
            }
            policka[y][x].setText("p");
            label.setText("Fruit left: " + Integer.toString(fruitLeft));
        }
        else if (smer == en.LEFT && x - 1 < sirka && !policka[y][x-1].getText().equals("w"))
        {
            policka[y][x].setText(" ");

            x = x-1;//posun sa
            if (policka[y][x].getText().equals("f"))
            {
                fruitLeft--;
            }
            policka[y][x].setText("p");
            label.setText("Fruit left: " + Integer.toString(fruitLeft));
        }

        if (fruitLeft == 0)
        {
            JOptionPane.showMessageDialog(frame, "You won!");
            System.exit(0);
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run()
            {
                Main frame = new Main();
            }
        });
    }
}
Návštěvník

Re: Zápočtový test 30.1.

Příspěvek od Návštěvník »

Na poobednajsom termine bolo naprogramovat hru waterlogic, kde mate vodovod, umyvadlo a zopar vedier s vodou a cielom hry je dosiahnut aby v nejakom z nich bol nakonci nejaky pocet.
obrazok ... takto vyzera obrazok na internete...

bola prilozena kniznica ktora nam vytvarala vsetky potrebne obrazky, resp. zoznam levelov, teda o to sme sa uz nemuseli starat.
kompletne zadanie aj s kniznicou TU
(ked chcete vytvorit projekt v netbeans, tak treba vytvorit novy projekt, skopirovat obsah src/waterlogicgame.java (ukazkovy program) a pridat v netbeans k projektu addlibrary-> jar balik WaterLogics_support.jar
Lazybug123

Re: Zápočtový test 30.1.

Příspěvek od Lazybug123 »

Holy shit. Toto vyzera teda o dost drsnejsie nez nase doobednajsie zadanie. Zapocty z Javy su fakt z velkej casti o stasti. Aku to malo uspesnost?
Odpovědět

Zpět na „PGR013 Java“