Automatyczne wywołanie zdarzenia ActionEvent

0

Witam, wie ktoś czy istnieje taka możliwość jak wywołanie "sztucznego" zdarzenia w metodzie actionPerformed, tak żeby jakiś blok poleceń wykonał się bez "klikania" czegokolwiek?

Chodzi mi o to żeby komputer postawił kółko automatycznie w zrobionej przeze mnie grze "Kółko i Krzyżyk".

0

Zupełnie nie rozumiem problemu. Niech actionListener wywołuje jakąś metodę wykonajRuch czy coś takiego i po prostu wywołuj ta metodę? o_O

0

A mógłbyś dokładniej opisać co mam zrobić? :)

0

Nie widząc twojego kodu to mogę ci powróżyć z fusów najwyżej. Ale z drugiej strony obawiam się że kod będzie tragiczny skoro masz taki problem...

0

Jest tragiczny bo dopiero zaczynam przygodę z JAVą.

public void actionPerformed(ActionEvent e) {
    Object zrodlo = e.getSource();

dodanie znacznika <code class="java"> - furious programming

0

I co? To jest cały kod? o_O To się upisałeś przy tym kółko i krzyżyk.

0

Nie :p

Pewnie się wystraszysz ale...

 	public void actionPerformed(ActionEvent e) {
		
		Object zrodlo = e.getSource();
		
		
		
		if(chKomputer.isSelected()){
			
			if(getI()==0){
				
				if(zrodlo==b1){
					
					b1.setVisible(false);
					l1.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b2){
					
					b2.setVisible(false);
					l2.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b3){
					
					b3.setVisible(false);
					l3.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b4){
					
					b4.setVisible(false);
					l4.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b5){
					
					b5.setVisible(false);
					l5.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b6){
					
					b6.setVisible(false);
					l6.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b7){
					
					b7.setVisible(false);
					l7.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b8){
					
					b8.setVisible(false);
					l8.setText("X");
					setI(1);
					
				}
				else if(zrodlo==b9){
					
					b9.setVisible(false);
					l9.setText("X");
					setI(1);
					
				}
				
				
			}
			
			
		
		
			else if(getI()==1){
				
				
				
				JButton[] x = new JButton[9];
				
				
				
				x[0] = b1;
				x[1] = b2;
				x[2] = b3;
				x[3] = b4;
				x[4] = b5;
				x[5] = b6;
				x[6] = b7;
				x[7] = b8;
				x[8] = b9;
				
				Random y = new Random();
				Object z = null;	
				z =  x[y.nextInt(8)];
				
			
				if(z==b1&&l1.getText().equals("")){
					
					b1.setVisible(false);
					l1.setText("O");
					setI(0);				
				}
				else if(z==b2&&l2.getText().equals("")){
					
					b2.setVisible(false);
					l2.setText("O");
					setI(0);
					
				}
				else if(z==b3&&l3.getText().equals("")){
					
					b3.setVisible(false);
					l3.setText("O");
					setI(0);
					
				}
				else if(z==b4&&l4.getText().equals("")){
					
					b4.setVisible(false);
					l4.setText("O");
					setI(0);
					
				}
				else if(z==b5&&l5.getText().equals("")){
					
					b5.setVisible(false);
					l5.setText("O");
					setI(0);
					
				}
				else if(z==b6&&l6.getText().equals("")){
					
					b6.setVisible(false);
					l6.setText("O");
					setI(0);
					
				}
				else if(z==b7&&l7.getText().equals("")){

					b7.setVisible(false);
					l7.setText("O");
					setI(0);
					
				}
				else if(z==b8&&l8.getText().equals("")){
					
					b8.setVisible(false);
					l8.setText("O");
					setI(0);
					
				}
				else if(z==b9&&l9.getText().equals("")){
					
					b9.setVisible(false);
					l9.setText("O");
					setI(0);
					
				}
			
			
		}
		}

Dalej jest jeszcze kod normalnej gry 1vs1 oraz wszystko co się dzieje po wygranej lub remisie. Chodzi mi o ten moment kiedy ma zostać wybrane kółko w losowe miejsce.

dodanie znacznika <code class="java"> - furious programming

0

No to jedyny sposób naprawienia tego to:
user image
Nie ma innej rady. Następnie napisz to od nowa. Tym razem stosując pewną modyfikację:
Napisz kółko i krzyżyk dla planszy o rozmiarze NxM gdzie obie wartości podaje użytkownik. Dodatkowo parametrem jest jeszcze K które określa ile tych samych symboli obok siebie powoduje wygraną.
Bo póki co bezmyslnie skopiowałeś kupę kodu. Mam nadzieje że zadana modyfikacja sprawi że zaczniesz myśleć.

0

Hehe, no dobra, chyba nie jestem jeszcze na tyle dobry żeby brać się za takie rzeczy :)

Zrobić plansze czyli dwuwymiarową tablicę obiektów?

0

Ja bym uzył jakiejś kolekcji, ale może to być też tablica. To jest szczegół ;]

0

Ale to nadal nie rozwiąże problemu, że w pewnym momencie komputer będzie musiał wykonać ruch...

0

Oczywiście że nie, ale kiedy wreszcie włączysz myślenie zamiast klepania, to nagle stanie się dla ciebie jasne że ruch komputera jest zupełnie trywialną sprawą. Ba, dodałbym nawet jeszcze jedną edukacyjną modyfikację dla ciebie:
Niech użytkownik może wybrać dodatkowe dwa parametry:

  • liczbę graczy komputerowych
  • liczbę graczy ludzkich
    Przemyśl jak mógłbyś to zrealizować.
0

Witam ponownie :)

Dzięki za rady. Poczytałem trochę o ArrayList i wykorzystałem to do programu, czy taki kod jest w porządku?

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Eksperymenty extends JFrame implements ActionListener {
	
	int ID = 0;
	private int x;
	
	public JLabel[][] tablica = new JLabel[5][5];
	public JButton[][] tablica2 = new JButton[5][5];
	ArrayList<JButton> lista = new ArrayList<JButton>();
	ArrayList<JLabel> lista2 = new ArrayList<JLabel>();
	public Eksperymenty(){
		
		setSize(600,600);
		setTitle("lel");
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		int a=0;
		int b=0;
		
		for(int i=0; i<tablica2.length;i++){
				
				a=50;
				b=b+100;
			for(int j=0; j<tablica2[i].length; j++){
				
				tablica2[i][j]=new JButton("");
				tablica2[i][j].setBounds(a, b-50, 100, 100);
				add(tablica2[i][j]);
				tablica2[i][j].addActionListener(this);
				lista.add(tablica2[i][j]);
				a=a+100;
				tablica[i][j]=new JLabel("");
				tablica[i][j].setBounds(a-80, b-50, 100, 100);
				add(tablica[i][j]);
				tablica[i][j].setFont(new Font("SansSerif", Font.BOLD, 80));
				lista2.add(tablica[i][j]);
				
			}	
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object zrodlo = e.getSource();
		int index;
		index = lista.indexOf(e.getSource());
		lista.get(index).setVisible(false);
		
		if(ID==0){
			
			lista2.get(index).setText("X");
			ID=1;
		}
		else if(ID==1){
			
			lista2.get(index).setText("O");
			ID=0;
		}
	}

	public static void main(String[] args) {
		
		Eksperymenty app = new Eksperymenty();
		app.setVisible(true);
	}
}

Nie ma jeszcze mechaniki i szczerze mówiąc nie wiem jak się zabrać za sprawdzanie tych "elementów obok siebie" np. jeżeli będą 3 lub 4 takie same znaki obok siebie (w poziomie pionie i na ukos :) ) Gra się konczy...

dodanie znacznika <code class="java"> - furious programming

0

Troszeszkę lepiej ale:

  1. Nazwanie czegoś "lista1" czy "lista2" jest idiotyczne. Nazwa ma jasno mówić co dany obiekt oznacza!
  2. Nie rób klas "czlowiek orkiestra". Nie bój się tworzyć nowych klas. Projekt powinien składać się ze 100 klas po 50 linijek a nie z 5 klas po 1000. Jeśli masz klasę która jest JFrame to nie implementuj w niej ActionListenera. Zrób do tego nową klasę!
  3. Nadal chcesz robić jakąś ifologie przy ruchu gracza komputerowego. To źle. Niech graczy może być różna liczba a nie tylko 2.
  4. Powinineś mieć cały zstaw klas do obsługi logiki gry. Wydaje mi się że niepotrzebnie skupiłeś sie na wyklikaniu sobie okienek i generalnie słabo jeszcze umiesz programować. Powinieneś mieć klasy reprezentujące Gracza i Planszę przynajmniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1