Kółko i krzyzyk - modyfikacja

0

Musz napisać grę kółko i krzyżyk - wiem, że jest "tu" gotowy applet, ale nie o to mi chodzi (chcę to sam napisać, a przynajmniej mocno zmodyfikować ;-) ).
Wszystko mi działa, ale jakbym chciał zrobić wersję 5x5, to czy jest inny (krótszy) sposób na sprawdzenie kto wygrał niż wypisanie wszystkich kombinacji "if" dla każdego z graczy. [???] Wygrana - 5 jednakowych znaków w linii.
Poza tym chciałbym wstawić jako planszę jakiegoś gif'a czy jpg'a, a "x" i "o" jako graficzne elementy. Do tego wpisanie na początku imion graczy (nicków) i ewentualnie na końcu w przypadku wygranej "x" jakiś dźwięk, a dla wygranej "o" inny dźwięk.

Z jakich funkcji muszę skorzystać i czy jest to możliwe. Będę wdzięczny za pomoc, bo z aplletemi nie miałem do czynienia, a z Javą "walczę" od niedawna.

0

Algorytm sprawdzania powinien opierać się o pętle, która będzie przechodziła po wierszach, kolumnach i przekątnych.

Odtwarzanie dźwięków w applecie:

play(getCodeBase(), "nazwa_pliku"); 

Pobranie obrazka w applecie:

img = getImage(getCodeBase(), "images/x.gif");

Rysowanie obrazka w metodzie paint(Graphics g):

g.drawImage(img, współrzędna_X, współrzędna_Y, this);
0

mam coś takiego, ile z tego jest ok?

import java.awt.Button;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Panel;
import java.awt.event.ActionListener;

public class kolko extends javax.swing.JApplet implements ActionListener {
	
	 String user = "O";
	 Button we = new Button("Nowa Gra"); // czy potrzebne są inne przyciski?
	 
	 Panel gridLayoutPanel() { // czy panel jest potrzebny?
		 Panel plansza = new Panel();
		 plansza.setLayout(new GridLayout(3,3)); //plansza
	      //... co tutaj
		 return plansza;
		 }
	 public void paint (Graphics gr, Image img) {
		 img = getImage(getCodeBase(),"opera.gif");
		 gr.drawImage(img, X, Y, this); // jak się do tego odwołać, żeby wyświetlane były "o" i "x"?
		 gr.drawString(user, X, Y); // wyświetlenie stanu gry
		 gr.drawString("Stan gry/kolej:", X, Y); // opis do stanu gry
		 }
	 Panel panel = gridLayoutPanel(); // załadowanie planszy
	 setLayout(new BorderLayout());
	 add("South",panel);
	 
    //...co powinno być tutaj, czy przyciski są potrzebne?
	 add("North",we); // przycisk "nowa gra" u góry
	 we.addActionListener(this);
	 }
}

utknąłem :-/

0
  1. To zależy od Ciebie, czy chcesz mieć jakieś funkcje.
  2. Jeśli rysujesz O i X to nie. Byłby potrzebny gdybyś używał komponentów np przycisków, paneli do rysowania poszczególnych kratek to tak.
  3. Obrazki musisz mieć utworzone wcześniej. Musisz mieć tablice np intów informującą o stanie gry. W metodzie paint rysujesz obrazki w zależności od wartości zapisanych w tej tablicy.
0

w tej chwilii mam coś takiego, plansza jest wyświetlana:

package kolko;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class kolko extends javax.swing.JApplet implements ActionListener,
		MouseListener {

	public void init() {
		this.resize(260, 265);
		Panel panel = gridLayoutPanel();
		setLayout(new BorderLayout());
		add("North", we);
		addMouseListener(this);
	}
	int gracz_x; // gracz 1
	int gracz_o; // gracz 2
	final static int moves[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; // tablica - czy w tym miejscu?
	Button we = new Button(":: Nowa Gra ::");
	String user = "gracz_x";

	Panel gridLayoutPanel() {
		Panel plansza = new Panel();
		return plansza;
	}
	public void repaint() {
		repaint();
	}

	Image img;
	Image kolko;
	Image krzyzyk;

	public void start() {
		img = getImage(getDocumentBase(), "plansza.png");
		kolko = getImage(getDocumentBase(), "kolko.png");
		krzyzyk = getImage(getDocumentBase(), "krzyzyk.png");
	}

	public void paint(Graphics gr) {

		gr.drawImage(img, 5, 30, this);
		gr.drawImage(kolko, 80, 30, this);  // na razie wyświetlam, dla sprawdzenia
		gr.drawImage(krzyzyk, 5, 30, this); //j.w.
		gr.drawString(user, 140, 260);
		gr.drawString("Stan gry / kolej:", 40, 260);
	}

	public void actionPerformed(ActionEvent klik) {}
	
	public void mouseClicked(MouseEvent evt) {
		// int button - potrzebne w ogóle?
		}

	public void mousePressed(MouseEvent klik) {}
	public void mouseReleased(MouseEvent klik) {}
	public void mouseEntered(MouseEvent klik) {}
	public void mouseExited(MouseEvent klik) {}
	
}

w którym miejscu najlepiej zacząć działać z rysowaniem "O" "X" i jak to ugryźć, jak się odwołać do tablicy w metodzie paint tablicę i jak się do niej odwołać. Nie jestem pewien, czy idę w dobrym kierunku. [???]

0

Nie wiem czy dobrze zrozumialem o co pytasz, ale :

  • nie wiem do czego Ci tablica ruchow(moves), ja bym stworzyl tablice 5x5 z zerami na samym poczatku.
  • nastepnie czytasz kliki myszki i sprawdzasz gdzie kliknela (w odpowiednim 'actionperformed')
  • sprawdzasz, ktory to kwadrat planszy i oznaczasz odpowiednie miejsce w tablicy jako 1(kolko) albo 2(krzyzyk) w zaleznosci od tego, ktory gracz akurat klika
  • w metodzie paint, ktora jest de facto niezalezna od tego ZAWSZE rysujesz w jeden sposob:
    • plansza
    • przelatujesz po tablicy i rysujesz w odpowiednim miejscu
      • 0 w tablicy - nic
      • 1 w tablicy - kolko
      • 2 w tablicy - krzyzyk
        Dzieki temu po kliknieciu zmieni sie zawartosc tablicy, a paint, jako ze z niej korzysta bedzie o tym wiedzialo i od razu narysuje. Czyli rysujesz tylko w paincie i przekazujesz mu informacje o tym co rysowac poprzez skladowe klasy. Oczywiscie tablica 5x5 jest skladowa klasy wlasnie dlatego :)

Mam nadzieje, ze to popchnie do przodu, i ze o to Ci chodzilo.

pozdrawiam
johny

0

Tak jak pisze Johny najbardziej narutalne jest użycie tablicy 2-wymiarowej. Jeśli chodzi o rozwiązanie Twojego problemu to odsyłam do przykładu, który znajduje się w standardowej instalacj SDK Javy. Katalog: ..\demos\applets\TicTacToe - gra w OX z komputerem

0

Ponizej zamieszczam algorytm na twoje kółko i krzyrzyk , napisałem tak na szybkiego mam nadzieje że nima błędów , niechciało mi się też optymalizować więc proszę o wyrozumiałość pozdrawiam :)

N : wielkosc macierzy
war : od jakiej ilosci takich samych znakow na przekatnej zależy wygrana

for(y=0;y<=N;y++)
for(x=0;x<=N;x++)
{
if (((N-y)>=war-1)&&((N-x)>=war-1)&&(tab[x][y] == "x"))
{
while(l<3)
{
if (tab[x+1][y+1] == "x")
licz++;
l++;
}
if (licz==2){
y = N+1; break; }
licz = 0;
l = 1;
}
if (((N-y) >= war-1)&&(x>=war-1)&&(tab[x][y] == "x"))
{
while(l<3)
{
if (tab[x-l][y+l] == "x")
licz++;
l++;
}
if (licz==2){
y = N+1; break; }
licz = 0;
l = 1;

     }
}

if (licz == 2) println(" x - wygral " );

0

Ginę, tworzę i nie wiem do końca co.

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

class Kwadrat {

	int wspx; // wpółrzędna pola x
	int wspy; // wpółrzędna pola y
	int nr; // nr pola
	int status = 0; // info, czy pole zostało kliknięte
	int obrazekid = 2; //aktualny obrazek
	Image obr; // obrazek załadowany w dane pole
	}

public class nn extends Applet implements MouseListener {
	
	double px, py;
	Point point;
	int i, x = 1, wx, wy, kontr = 0;
	int koniec, count = 0;
	Image plansza, kolko, krzyzyk, obrinfo, blank;
	Kwadrat pole1[] = new Kwadrat[10];  
	
	public void init() {

		this.resize(400, 400);
		addMouseListener(this);
		Image o;
		blank = getImage(getDocumentBase(), "puste.png");
		plansza = getImage(getDocumentBase(), "plansza.png");
		krzyzyk = getImage(getDocumentBase(), "krzyzyk.png");
		kolko = getImage(getDocumentBase(), "kolko.png");
		o = blank;
		pole1 = intPola(o);
	}

	int tab[][] = new int[3][3]; // tablica
	/* w jaki sposób odczytać wartości pól
         {
		// dla gracza x
		tab[1][1] = gracz_x;
		tab[1][2] = gracz_x;
		tab[1][3] = gracz_x;
		tab[2][1] = gracz_x;
		tab[2][2] = gracz_x;
		tab[2][3] = gracz_x;
		tab[3][1] = gracz_x;
		tab[3][2] = gracz_x;
		tab[3][3] = gracz_x;
		// dla gracza o
		tab[1][1] = gracz_o;
		tab[1][2] = gracz_o;
		tab[1][3] = gracz_o;
		tab[2][1] = gracz_o;
		tab[2][2] = gracz_o;
		tab[2][3] = gracz_o;
		tab[3][1] = gracz_o;
		tab[3][2] = gracz_o;
		tab[3][3] = gracz_o;
	}*/

	public Kwadrat[] intPola(Image o) {
		int i = 0, j = 0, w1 = 30, w2 = 90, w3 = 0;
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 3; j++) {
				pole1[w3] = new Kwadrat();
				pole1[w3].wspx = w1;
				pole1[w3].wspy = w2;
				pole1[w3].nr = w3;
				pole1[w3].obr = o;
				pole1[w3].obrazekid = 2;
				pole1[w3].status = 0;
				w1 += 100;
				w3++;
			}
			w2 += 100;
			w1 = 30;
		}
		kontr = 0;
		return pole1;
	}

	public void paint(Graphics gr) {

		gr.drawImage(plansza, 5, 30, this);
		int i = 0;
		for (i = 0; i < 9; i++) {
			gr.drawImage(pole1[i].obr, pole1[i].wspx, pole1[i].wspy, this);
		}
		
		/*for (int  gracz=1; gracz<3; gracz++ )
			for (int i=0; i<3; i++); */

                 //  if (tab[i][0] == tab[i][1] == tab[i][2]  - ?
	        //  if (tab[0][i] == tab[1][i] == tab[2][i]  - ?
	}
	
	public void mousePressed(MouseEvent evt) {}
	public void mouseClicked(MouseEvent evt) {
		
		if (koniec == 0) {
			point = new Point(1, 1);
			point.x = evt.getX();
			point.y = evt.getY();
			px = point.x;
			py = point.y;
			ktorePole(px, py);
			wygrana();
		}
	}
	public void mouseReleased(MouseEvent evt) {}
	public void mouseEntered(MouseEvent evt) {}
	public void mouseExited(MouseEvent evt) {}
	
	public Image kLubK(int kik) {
		if (kontr == 0) {  
			obrinfo = krzyzyk;
			kontr = 1;
			pole1[kik].status = 1;
			pole1[kik].obrazekid = 0; 
		} else if (kontr == 1) { 
			obrinfo = kolko;
			kontr = 0; 
			pole1[kik].status = 1; 
			pole1[kik].obrazekid = 1; 
		}
		return obrinfo;
	}
	public void ktorePole(double wx, double wy) {
		int i = 0;
		for (i = 0; i < 9; i++) {
			if ((wx >= pole1[i].wspx) && (wx <= pole1[i].wspx + 60)
					&& (wy >= pole1[i].wspx) && (wy <= pole1[i].wspx + 60)
					&& (pole1[i].status == 0)) {
				count++;
				pole1[i].obr = kLubK(i);
				//j = i;
			}
		}
		repaint();
	}

// możliwe kombinacje wygranych
	public void wygrana() {
		if ((pole1[0].status == pole1[1].status)
				&& (pole1[1].status == pole1[2].status)
				&& (pole1[0].obrazekid == pole1[1].obrazekid)
				&& (pole1[1].obrazekid == pole1[2].obrazekid) && (pole1[0].obrazekid < 2)) {
			koniec = 1;
			repaint();
		}
//... itd
		
	}
	public void koniecGry() {
		if (koniec == 1){
			koniec = 0;
			count = 0;
			intPola(blank);
		}
		if ((koniec == 0) && (count == 9)) {
			count = 0;
			intPola(blank);
		}
	}
}

za duzo sugestii mam z różnych stron i się kręcę.
Jak mam tablicę, w jaki sposób się do niej odwołać odczytując wartości pól?
Czy jest sens tworzyć dodatkową klasę i wszystko co się z nią wiąże?
Wiem, co należy zrobić itd, ale problemy są z poskładaniem tego w całość :-/ Nie wspominając o czasie.
Znalazłem wersję TicTacToe, ale tam tablica jest zapisana w sposób, jaki miałem wcześniej. Zgodnie z sugestiami stworzyłem dwuwymiarową.

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