SORU
29 HAZİRAN 2009, PAZARTESİ


Algoritma Belirleme Tic Tac Toe Oyun için

Java tic-tac-toe bir oyun yazdım ve oyunun sonunu belirleyen benim şimdiki yöntem oyunun içinde olmak için aşağıdaki Olası senaryolar için hesapları:

  1. Yönetim Kurulu dolu ve henüz galip ilan edildi: Oyun berabere biter.
  2. Haç kazandı.
  3. Daire kazandı.

Ne yazık ki, bunu yapmak için, bir tablo bu senaryolar önceden tanımlanmış bir dizi ile okur. Bu ille de kötü bir gemide sadece 9 boşluk olduğunu düşünüyor, değil mi, ve böylece tablo biraz küçük ama varsa oyun bitti belirleme daha iyi algoritmik bir yolu var mı? Biri kazandı olup olmadığını belirlenmesi halinde 9 boşluk dolu olması durumunda, kontrol önemsiz olduğundan sorunun et.

Tablo yöntemi çözüm olabilir, ama değilse, nedir? Eğer tahta boyutu olsa da, ne n=9? Ne oLsa çok daha büyük kurulu, diyelim ki n=16, n=25, ve bu yüzden, neden sayının ardışık olarak yerleştirilen öğeleri kazanmak için x=4, x=5, vb? Tüm kullanmak için genel bir algoritma n = { 9, 16, 25, 36 ... }?

CEVAP
29 HAZİRAN 2009, PAZARTESİ


Biliyorsun bir kazanma yöntemi tek başına sonra X ya da O yaptı, onların en son hareket, bu yüzden sadece arama satır/sütun ile isteğe bağlı tanı bulunan bu hareket sınırı aramanızı uzay zaman belirlemeye çalışan bir kazanan kurulu. Ayrıca son hareket edersen kazanan bir hareket olmasaydı yapıldıktan sonra beraberlik-tac-toe tic oyunda hamle sabit bir sayı olduğundan varsayılan olarak bu beraberlik bir oyun.

edit: bu kodu (satır, vb) 3 x 3 Yönetim Kurulu requries 3 kazanmak için üst n n Kurulu tarafından bir n için

edit: anti tanı kontrol etmek için eklenen kod, sigara döngü bir şekilde nokta, anti olup olmadığını belirlemek için çözemedim bu adım eksik bu yüzden tanı

public class TripleT {

    enum State{Blank, X, O};

    int n = 3;
    State[][] board = new State[n][n];
    int moveCount;

    void Move(int x, int y, State s){
    	if(board[x][y] == State.Blank){
    		board[x][y] = s;
    	}
    	moveCount  ;

    	//check end conditions

    	//check col
    	for(int i = 0; i < n; i  ){
    		if(board[x][i] != s)
    			break;
    		if(i == n-1){
    			//report win for s
    		}
    	}

    	//check row
    	for(int i = 0; i < n; i  ){
    		if(board[i][y] != s)
    			break;
    		if(i == n-1){
    			//report win for s
    		}
    	}

    	//check diag
    	if(x == y){
    		//we're on a diagonal
    		for(int i = 0; i < n; i  ){
    			if(board[i][i] != s)
    				break;
    			if(i == n-1){
    				//report win for s
    			}
    		}
    	}

            //check anti diag (thanks rampion)
    	for(int i = 0;i<n;i  ){
    		if(board[i][(n-1)-i] != s)
    			break;
    		if(i == n-1){
    			//report win for s
    		}
    	}

    	//check draw
    	if(moveCount == (n^2 - 1)){
    		//report draw
    	}
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • natescamp

    natescamp

    30 NİSAN 2009
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011
  • olinerd

    olinerd

    23 AĞUSTOS 2007