Kółko i Krzyżyk - nadpisywanie postawionego symbolu

Kółko i Krzyżyk - nadpisywanie postawionego symbolu

Wątek przeniesiony 2016-10-18 08:19 z Java przez bogdans.

  • Rejestracja: dni
  • Ostatnio: dni
0

Witam, pozwoliłem sobie założyć temat, ale jestem początkującym programistą i próbuję poprawić program(który zapożyczyłem z bloga) pod kątem tego, że w czasie gry można nadpisać postawiony symbol tzn. na polu postawiony jest X i klikam w to pole i zmienia się na O. Czy mógłby ktoś pomóc i powiedzieć co zmienić, ponieważ próbowałem na kilka sposobów i nie działa, a jestem ciekaw rozwiązania.

Rozumiem, że odbywa się to gdzieś w metodzie:

Kopiuj
public void actionPerformed(ActionEvent e)

dziękuję za pomoc :) !

Kopiuj
package kolkoikrzyzyk;

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class KolkoIKrzyzyk extends JFrame{    
    public static void main(String[] args) {
       KolkoIKrzyzyk kik = new KolkoIKrzyzyk();
       kik.setMinimumSize(new Dimension(400, 400));
       kik.setDefaultCloseOperation(EXIT_ON_CLOSE);
       kik.setResizable(false);
       kik.setTitle("Gra w Kółko i Krzyzyk");
       JPanel plansza = new JPanel();
       plansza.setLayout(new GridLayout(3,3));
       Element a[][]= new Element[3][3];
       int wyniki[][]= new int[3][3];
       for(int i=0;i<3;i++)
       {
           for(int j=0;j<3;j++)
           {
               a[i][j]= new Element();
               wyniki[i][j]=0;
           }
       }
       for(int i=0;i<3;i++)
       {
           for(int j=0;j<3;j++)
           {
               a[i][j].addActionListener(new ElementsListener(a, wyniki, plansza));
               plansza.add(a[i][j]);
           }
       }
       
       kik.add(plansza);
       kik.setVisible(true);
    }
}
Kopiuj
public class Element extends JButton{

    int stan=0;
    public Element() {
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        if(stan == 1)
        {
            g.drawLine(0, 0, 160, 150);
            g.drawLine(130, 0, 0, 120);
        }
        else if(stan==2)
        {
            g.drawOval(10, 10, 110, 110);
        }
    }
    
    
}
Kopiuj
package kolkoikrzyzyk;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class ElementsListener implements ActionListener{
    private Element[][] elemenst;
    private int[][] ints;
    JPanel plansza;
    public ElementsListener(Element[][] el, int[][] w, JPanel p) {
        elemenst=el;
        ints=w;
        plansza=p;
    }

    private boolean sprawdz(int a, boolean t)
          {
              if(a==1){
        //===== poziom 
        if(ints[0][0]==1 && ints[0][1]==1 && ints[0][2]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[1][0]==1 && ints[1][1]==1 && ints[1][2]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[2][0]==1 && ints[2][1]==1 && ints[2][2]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
          }
        if(a==2){
        //==== pion dla usera
        if(ints[0][0]==1 && ints[1][0]==1 && ints[2][0]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[0][1]==1 && ints[1][1]==1 && ints[2][1]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[0][2]==1 && ints[1][2]==1 && ints[2][2]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[0][0]==1 && ints[1][1]==1 && ints[2][2]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        
        if(ints[0][2]==1 && ints[1][1]==1 && ints[2][0]==1) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygrales!!");
                  return true;
              }
        

            
        if(ints[0][2]==2 && ints[1][1]==2 && ints[2][0]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
            
        if(ints[0][0]==2 && ints[0][1]==2 && ints[0][2]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                   return true;
              }
        
        if(ints[1][0]==2 && ints[1][1]==2 && ints[1][2]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        
        if(ints[2][0]==2 && ints[2][1]==2 && ints[2][2]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        //========== w dol to pion 
        if(ints[0][0]==2 && ints[1][0]==2 && ints[2][0]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        
        if(ints[0][1]==2 && ints[1][1]==2 && ints[2][1]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        
        if(ints[0][2]==2 && ints[1][2]==2 && ints[2][2]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        
        if(ints[0][0]==2 && ints[1][1]==2 && ints[2][2]==2) {
                  if(t) JOptionPane.showMessageDialog(null, "Wygral komputer!!");
                  return true;
              }
        }
        return false;
        }
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
        Element source = (Element) e.getSource();
        int x = 0,y = 0;
        
        boolean koniec = false;
        
        for(int i=0;i<3;i++)
        {
           for(int j=0;j<3;j++)
           {
               if(elemenst[i][j]== source)//
               {
               x=i;
               y=j;
               break;
               }
           }
        }
        
        elemenst[x][y].stan=1;
        ints[x][y]=1;
        koniec = sprawdz(1, true);
        
        
        if(koniec)
        {
        
            for(int i=0;i<3;i++)
            {
               for(int j=0;j<3;j++)
               {
                   elemenst[i][j].stan=0;
                   ints[i][j]=0;
               }
            }
                plansza.repaint();

         }
        
        Random rn = new Random();
        int rn1=0,rn2=0;

        int time=0;
        if(koniec == false) {
            while(true)
            {
                time++;
                rn1=rn.nextInt(3);
                rn2=rn.nextInt(3); 
                if(time>70)
                {
                    koniec=true;
                    break;
                }
                if(elemenst[rn1][rn2].stan == 0) {
                    elemenst[rn1][rn2].stan=2;
                    ints[rn1][rn2]=2;
                    break;
                }
                else {
                    continue;
                }
               
            
            }
        }
        
        plansza.repaint();
        koniec=sprawdz(2, true);
        boolean end=true;
        for(int i=0;i<3;i++)
            {
               for(int j=0;j<3;j++)
               {
               if(ints[i][j]==0) end = false;
               }
            }        
        if(sprawdz(1, false)==false && sprawdz(2, false)==false && end == true) {
            JOptionPane.showMessageDialog(null, "Remis!");
            koniec=true;
        }
        if(koniec)
        {
        
            for(int i=0;i<3;i++)
            {
               for(int j=0;j<3;j++)
               {
                   elemenst[i][j].stan=0;
                   ints[i][j]=0;
               }
            }
                plansza.repaint();
                koniec=false;

         }
        

        
      
                
    }}
S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 3573
0

Po 1 czemu Swing na JavaFX?
Po 2 po ch... tyle ifów?
Po 3 czemu polskie słowa?
Chyba angielski nie jest tak trudny żeby kółko i krzyżyk było po angielsku

  • Rejestracja: dni
  • Ostatnio: dni
0
scibi92 napisał(a):

Po 1 czemu Swing na JavaFX?
Po 2 po ch... tyle ifów?
Po 3 czemu polskie słowa?
Chyba angielski nie jest tak trudny żeby kółko i krzyżyk było po angielsku

Ale napisałem, że ja ten kod pobrałem i starałem się go pozmieniać. Każde z tych Twoich 3 pytań nie jest do mnie ;).
Ja chciałem prosić o pomoc w kodzie jak zrobić, żeby nie nadpisywać elementów.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Kod jest koszmarny. Zmień blog, z którego się uczysz (pobierasz programy).

Kopiuj
    @Override
    public void actionPerformed(ActionEvent e) {
        Element source = (Element) e.getSource();
        if(source.stan > 0){
            return;
        }
         ...
  • Rejestracja: dni
  • Ostatnio: dni
0
bogdans napisał(a):

Kod jest koszmarny. Zmień blog, z którego się uczysz (pobierasz programy).

Kopiuj
    @Override
    public void actionPerformed(ActionEvent e) {
        Element source = (Element) e.getSource();
        if(source.stan > 0){
            return;
        }
         ...

Dziękuję bardzo, kurcze, takie to proste teraz się wydaje ;).
Rozumiem, będę szukał nowych kursów, może poleciłbyś jakąś sprawdzoną stronę?

I drugie pytanie odnośnie kodu.

Chciałbym nauczyć program, jeśli tak to można nazwać , żeby ruchy były nie losowe , a określone, np blokowanie użytkownika itd.

stworzyłem sobie metodę:

Kopiuj
 private void sprawdzRuch(){
...
}

Nie chodzi mi o wnętrze metody ;), ale podobnie jak powyżej o umieszczenie jej w kodzie, rozumiem , że musi się odbyć to mniej więcej tutaj:

Kopiuj
   Random rn = new Random();
        int rn1=0,rn2=0;
 
        int time=0;
        if(koniec == false) {
            while(true)
            {
                time++;
                rn1=rn.nextInt(3);
                rn2=rn.nextInt(3); 
                if(time>70)
                {
                    koniec=true;
                    break;
                }
                if(elemenst[rn1][rn2].stan == 0) {
                    elemenst[rn1][rn2].stan=2;
                    ints[rn1][rn2]=2;
                    break;
                }
                else {
                    continue;
                }
 
 
            }

bo kod generuje nam losowy ruch czyli ten kod powinienem zmodyfikować, po usunięciu Randomowej opcji, niestety nie wyświetla się ruch komputera, a więc coś schrzaniłem ;).

Reasumując, jak w kodzie umieścić tą moją metodę, żeby zadziałała i sprawdzała jak komputer może się "ruszyć".

I już ostatnie pytanie, odnoszące się do metody, którą będę budował.

Sprawdzanie, że komputer w linii ma już dwa znaki, to musi postawić w 3 polu, to wygra. Próbowałem dwóch opcji, żadna nie działa niestety.

Pierwsza:

Kopiuj
if (ints[0][i] == 'O' && ints[1][i] == 'O' && ints[2][i] == ' ') {
			ints[2][i] = 'O';

Druga z użyciem "for" stąd te i ;).

Kopiuj
if (elemenst[i][0].equals('O') && elemenst[i][2].equals('O') && elemenst[i][1].equals(' ')) {
				elemenst[i][1].equals('O'); 
ints[i][2] = 'O';
  • Rejestracja: dni
  • Ostatnio: dni
0

pomoże ktoś ? :)

T1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 56
0

Do gry komputera najlepiej zaimplementować algorytm mini-max. Sam skorzystałem niedawno z gotowca stąd:
http://hannahaddad-blog.blogspot.com/2014/04/implmenting-minimax-algorithm-on-tic.html
Jedynie zahardkodowałem pierwszy ruch komputera bo mielił kilka sekund.

  • Rejestracja: dni
  • Ostatnio: dni
0
tmk13 napisał(a):

Do gry komputera najlepiej zaimplementować algorytm mini-max. Sam skorzystałem niedawno z gotowca stąd:
http://hannahaddad-blog.blogspot.com/2014/04/implmenting-minimax-algorithm-on-tic.html
Jedynie zahardkodowałem pierwszy ruch komputera bo mielił kilka sekund.

Szczerze powiem, że wygląda ciekawie ten algorytm, jednak nie mam pojęcia jak to przełożyć na to co mam ;), możesz podpowiedzieć?
Bo o ile metodę minmax myślę, że udało by się jakoś skonstruuować, to nie wiem gdzie ją umiejscowić, coś jak poprzedni problem o którym pisałem.

pzdr

  • Rejestracja: dni
  • Ostatnio: dni
0

pomoże ktoś?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.