Jogo da Velha ( Ajuda)

4 respostas
ariadne.tamires

Ola pessoal
eu tenho um problema..
eu tenho um jogo da velha em java..

import java.util.Random;
import java.util.Scanner;
public class JogoDaVelha {
	public static int qualJogador = 3; // 3 = X e 7 = O
	public static int[] tabuleiro = new int[9]; // Inicia com zeros.
	public static boolean contraCPU = false; // false 1x1, true 1xCPU.

	public static void trocaJogador(){
		qualJogador = (qualJogador==3)?7:3; // Se o jogador eh 3 passa a ser 7 e vice-versa.
	}// trocaJogador
	public static boolean eJogadaValida(int linha, int coluna){
		return ((tabuleiro[coluna+(3*linha)]==0)?true:false);
	}// eJogadaValida
	public static void mostraTabuleiro(){
		for(int i=0; i<tabuleiro.length; i++){
			if((i%3)==0){
				System.out.println();
				if(i!=0)
					System.out.println("------");
			}
			if(tabuleiro[i]==0){
				if(((i+1)%3)!=0){
					System.out.print(" |");
				}
			}else{
				if(((i+1)%3)!=0){
					System.out.print((tabuleiro[i]==3)?"X|":"O|");
				}else{
					System.out.print((tabuleiro[i]==3)?"X":"O");
				}
			}
		}
		System.out.println();
	}// mostraTabuleiro
	public static int temVencedor(){
		// Se achar o vencedor retorna o seu numero (3 ou 7).
		int somaLinha=0;
		int[] vSomaColunas = new int[3];
		for(int i=0; i<tabuleiro.length; i++){
			somaLinha += tabuleiro[i];
			if(((i+1)%3)==0){
				if((somaLinha==9)||(somaLinha==21))
					return (somaLinha/3); //Achou um vencedor na linha
				somaLinha=0;
			}
			vSomaColunas[i%3]+=tabuleiro[i];
		}
		for(int i=0; i<vSomaColunas.length;i++){
			if((vSomaColunas[i]==9)||(vSomaColunas[i]==21))
				return (vSomaColunas[i]/3); // Achou um vencedor na coluna
		}
		int diag1 = tabuleiro[0]+tabuleiro[4]+tabuleiro[8];
		if((diag1==9)||(diag1==21))
			return (diag1/3);
		int diag2 = tabuleiro[2]+tabuleiro[4]+tabuleiro[6];
		if((diag2==9)||(diag2==21))
			return (diag2/3);
		return 0; //Nao tem vencedor
	}// temVencedor
	public static boolean deuVelha(){
		for(int i=0; i<tabuleiro.length; i++){
			if(tabuleiro[i]==0)
				return false;
		}
		return true;
	}// deuVelha
	public static void realizaJogada(){
		Scanner in = new Scanner(System.in);
		Random r = new Random();
		int linha;
		int coluna;
		do{
			if((contraCPU)&&(qualJogador!=3)){
				// CPU burra, joga de forma aleatoria.
				linha = r.nextInt(3);
				coluna = r.nextInt(3);
			}else{
				System.out.println("Jogador: "+((qualJogador==3)?"X":"O")+"\n Digite a linha e a coluna + <ENTER>");
				linha = in.nextInt();
				coluna = in.nextInt();
			}
		}while(!eJogadaValida(linha,coluna));
		tabuleiro[coluna+(3*linha)]=qualJogador;
	}// realizaJogada
	public static void loopPrincipalDoJogo(){
		boolean fim = false;
		mostraTabuleiro();
		do{
			realizaJogada();
			trocaJogador();
			mostraTabuleiro();
			if((temVencedor()!=0)||(deuVelha()))
				fim = true;
		}while(!fim);
		if(temVencedor()==0){
			System.out.println("Deu velha...");
		}else{
			System.out.println("O jogador "+((temVencedor()==3)?"X":"O")+" venceu!");
		}
	}// loopPrincipalDoJogo
	
	public static void main(String[] args) {
		loopPrincipalDoJogo();
	}//main
}//classe
mas no caso nesse programa o computador joga de forma aleatoria eu gostaria que o computador efetivamente tente ganhar o jogo Mas não sei oque eu modifico ae, alguem me ajuda por favor? alguma ideia?

Grata (:

4 Respostas

heatcold

http://pt.wikipedia.org/wiki/Minimax

ariadne.tamires

eu andei dando uma olhada nisso e ate peguei um programa de exemlo…
Tenho duvidas, eu teria que criar uma nova classe MiniMax so pra isso?

W

Um jogo da velha eh tao simples, que provavelmente nao eh dificil mapear todas as possibilidades de ganhar o jogo e tomar uma decisao da proxima jogada (PC) baseado na jogada do jogador.

//Daniel

heatcold

você teria que implementar o algoritmo de minimax baseado na arvore de decisões do jogo da velha.
recomendo que pesquise sobre isso na internet.

Criado 27 de outubro de 2011
Ultima resposta 28 de out. de 2011
Respostas 4
Participantes 3