webForumDet fria alternativet

Algorithm för att kolla instängda ytor

Webbutveckling

1 svar · 471 visningar · startad av mollemus

Medlem sedan jan. 200833 inlägg
Frågan#1

Hej!

Jag utvecklar ett nätverksflashspel, nätverksbiten är löst, men nu har jag ett problem. Jag utvecklar ett GO-spel, vilket är ett gammalt asiatiskt spel där man ska stänga in motspelares pjäser. Jag undrar om någon stött på en algorithm för att känna av om en yta är instängd.

XXXXX
XOOOOX
XOOOX
XOOX
XXX

T.ex i ovanstående diagram så ska flashen känna av att alla ringar är instängda. Detta känns som det kanske är samma algorithm som pathfinding men kanske finns det något enklare sätt.

Medlem sedan jan. 200833 inlägg
#2

Så här långt kom jag, men nu vet jag inte riktigt vad jag ska göra härnäst, nu tar den bara bort de stenar som är själva och omringade av fienden men sparar också alla som är kandidater för att tas bort.

//KOLLA OM STENAR ÄR OMRINGADE
_global.killStones = function () {
	prisoners = new Array(); //stenar som kanske ska dö
	prisItr = 0; //iterator för prisoner-arrayn
	tokill = new Array(); //stenar som ska dö
	killItr = 0; //iterator för tokill-arrayn

	//Går igenom hela brädan (19x19 rutor) och kollar vilka stenar som är omringade oavsett färg på grannar.
	//De som har 4 grannar med bara motsatt färg dödas här direkt.
	for(i = 0; i < 19; i++){
		for(j = 0; j < 19; j++){
			//om sten ligger på rutan, kolla om den har grannar
			if(_global.board[i][j] != "0"){
				grannar = 0; // antal grannar, max 4
				fiender = 0; // antal grannar som är fiender, om 4 så dör den
				//kollar vänster
				if(_global.board[i-1][j] != "0"){ //om grannruta inte tom, kant på brädan räknas som inte tom
					grannar++;
					if(_global.board[i-1][j] != _global.dinfarg){ //om granne inte ens egen färg
						fiender++;
					}
				}
				//kollar höger
				if(_global.board[i+1][j] != "0"){ //om grannruta inte tom, kant på brädan räknas som inte tom
					grannar++;
					if(_global.board[i+1][j] != _global.dinfarg){
						fiender++;
					}					
				}
				//kollar uppåt
				if(_global.board[i][j-1] != "0"){ //om grannruta inte tom, kant på brädan räknas som inte tom
					grannar++;
					if(_global.board[i][j-1] != _global.dinfarg){
						fiender++;
					}					
				}			
				//kollar neråt
				if(_global.board[i][j+1] != "0"){ //om grannruta inte tom, kant på brädan räknas som inte tom
					grannar++;
					if(_global.board[i][j+1] != _global.dinfarg){
						fiender++;
					}					
				}
				//om 4 grannar kolla om alla e motsatt färg isåfall dör den, annars spara den som fånge
				if(grannar == 4){
					if(fiender == 4){
						tokill[killItr] = i+","+j;
						killItr++;
					}else{
						prisoners[prisItr] = i+","+j;
						prisItr++;
					}
				}				
			}	
		}
	}
	//Nu när den gått igenom brädan så ska den gå igenom alla fångar
	//och se om deras grannar också är fångar osv.. vet inte riktigt hur jag ska fortsätta...
	
	
	//När den sen bestämt sig för vilka som ska dödas så dödar den alla stenar som ska dödas
	for(i = 0; i < tokill.length; i++){
                    //döda sten
	}
}
256 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)