# TRON：ゲームAIアルゴリズム？

11

ライトサイクルまたはそれがどのように呼ばれたか。

ゲームマップを表す2次元配列があり、各要素は0または1（0は空白を表し、1は塗りつぶされた空間を表す）のいずれかである場合、TRON敵AIに使用されるアルゴリズムは何ですか？

7

ここでソース（および実行可能ファイル）を見つけることができます：http : //armagetronad.net/downloads.php

8

これはGoogle Aiコンテストの 1つのテーマでした

そのページからいくつかの素晴らしいリソースがあります：

1
Google AIコンテストはありますか？！
3Dave

：ウォータールーコンピュータサイエンスクラブからのリンクがダウンしているようだ、ここではインターネットウェイバックマシンからアーカイブされたコピーであるGoogleのAI大会ロバート・シャオのトロン戦略ガイド
Rodia

1

アルゴリズムは知りませんが、Javaで簡単な「アルゴリズム」を作成できます

``````//2D boolean (true/false) array
boolean map[][] = new boolean;
//this represents the position of the AI on the map
int x = 10, y = 10;
//this int will be 1 - 4 and will represent a direction
//1 - up
//2 - right
//3 - down
//4 - left
int direction = 1;

void init(int startX, int startY){
//set the x and y to a starting position
x = startX;
y = startY;
//this will set the entire array to false
int i = 0, j = 0;
while (i<20){
while(j<20){
map[i][j] = false;
j++;
}
j = 0;
i++;
}

//and this will set the starting position to true
map[x][y] = true;
}

void tick(){
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
map[x][y-1] = true;
y--;
}
return;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
map[x+1][y] = true;
x++;
}
return;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
map[x][y+1] = true;
y++;
}
return;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
map[x-1][y] = true;
x--;
}
return;
}
}catch(Exception e){

}
//this next bit will only be  triggered if the AI could not go straight

//define two temporary variables, fairly self explanatory.
boolean canGoLeft = false, canGoRight = false;

//defines whether it is safe to go left
//turn left respectively
//test if straight is safe
direction--;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
canGoLeft = true;
}else canGoLeft = false;
break;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
canGoLeft = true;
}else canGoLeft = false;
break;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
canGoLeft = true;
}else canGoLeft = false;
break;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
canGoLeft = true;
}else canGoLeft = false;
break;
}
}catch(Exception e){
canGoLeft = false;
}
//return to original direction before test
direction++;

//now perform the same test but with turning right
//turn right respectively
direction++;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
canGoRight = true;
}else canGoRight = false;
break;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
canGoRight = true;
}else canGoRight = false;
break;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
canGoRight = true;
}else canGoRight = false;
break;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
canGoRight = true;
}else canGoRight = false;
break;
}
}catch(Exception e){
canGoRight = false;
}
direction--;

if(canGoLeft&&!canGoRight){//can only go left
direction--;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
map[x][y-1] = true;
y--;
}
return;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
map[x+1][y] = true;
x++;
}
return;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
map[x][y+1] = true;
y++;
}
return;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
map[x-1][y] = true;
x--;
}
return;
}
}catch(Exception e){

}
}else if(!canGoLeft&&canGoRight){//can only go right
direction++;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
map[x][y-1] = true;
y--;
}
return;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
map[x+1][y] = true;
x++;
}
return;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
map[x][y+1] = true;
y++;
}
return;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
map[x-1][y] = true;
x--;
}
return;
}
}catch(Exception e){

}
}else if(canGoLeft&&canGoRight){//can go either way so it will pick randomly
if(System.currentTimeMillis()%2==0){//random, will be true half of the time and false the other half
//change direction one anticlockwise
direction--;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
map[x][y-1] = true;
y--;
}
return;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
map[x+1][y] = true;
x++;
}
return;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
map[x][y+1] = true;
y++;
}
return;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
map[x-1][y] = true;
x--;
}
return;
}
}catch(Exception e){

}
}else{
//change direction one clockwise
direction++;
try{
//try to go straight and will error if
//it cannot because it would be out of bounds
switch(direction){
case 1: //up
if(!map[x][y-1]){ //will error out here if the block in front is out of bounds
map[x][y-1] = true;
y--;
}
return;
case 2: //right
if(!map[x+1][y]){ //will error out here if the block in front is out of bounds
map[x+1][y] = true;
x++;
}
return;
case 3: //down
if(!map[x][y+1]){ //will error out here if the block in front is out of bounds
map[x][y+1] = true;
y++;
}
return;
case 4: //left
if(!map[x-1][y]){ //will error out here if the block in front is out of bounds
map[x-1][y] = true;
x--;
}
return;
}
}catch(Exception e){

}
}
}
}``````

Licensed under cc by-sa 3.0 with attribution required.