2010-12-12 1 views
3

Мне задали проблему, чтобы решить головоломку Bubble Breaker. есть две части игры. Игрок 1.User 2.Cpu Игрок. Я написал код для пользователя-пользователя, но понятия не имею, как игрок Cpu будет играть таким образом, чтобы игрок cpu мог получить максимальный результат и полностью очистить доску. если кто-то может мне помочь с этим?Bubble Breaker Puzzle

, когда игра начинается ее загрузка файла с указанным целым числом в диапазоне ч/б 1 и 3. 1 для красного цвета 2 для зеленого 3 для желтого

1111111111 
2323333132 
1131123222 
2222222113 
1111111111 
1111111111 
1111111111 
1111111111 

смежных цветы shold быть удалить.

игра, подобная this. PLZ помогите мне с игроком cpu, дав мне подсказки, чтобы получить лучший результат. благодарит заранее.

+1

Вы знакомы с [альфа-бета-обрезкой] (http://en.wikipedia.org/wiki/Alpha-beta_pruning)? –

+0

Эта игра также называется Poppit. (Просто чтобы добавить к обсуждению) У вас есть границы на входах? Я думаю, что самое легкое решение было бы веткой и связано. –

+1

Мне непонятно, что это вопрос программирования. – Gabe

ответ

2

Если вам нужен только «хороший» счет, а не идеальный результат, вы можете использовать методы Монте-Карло.Основная идея:

Случайно выберите позицию, на которую нужно нажать. Сделайте это, пока не будет возможности удалить шары. Помните счет и точки, на которые вы нажали.

Сделайте это 10000 раз, и вы будете в порядке против большинства людей.

Если вам по-прежнему нужен лучший игрок AI, вы можете взять максимальный балл, полученный выше, как нижний предел. Затем вы оцениваете максимальные точки, которые могут быть достигнуты с определенной позиции, и если это число меньше, чем «лучший случайный балл», вы можете отменить эту конкретную попытку.

0

Вы можете рассматривать сетку как двухмерный массив.

11... 
23... 

означает

arr[0][0]=1; 
arr[0][1]=1; 
arr[1][0]=2; 
arr[1][1]=3; 

И вы можете проверить на существование одного цвета таким образом:

//using arr[0][0] as the base point 
if ((arr[0][0])==(arr[0][1])) //look in your right 
{ 
    //explode 
} 
if ((arr[0][0])==(arr[1][0])) //look below 
{ 
    //explode 
} 
if ((arr[0][0])==(arr[1][1])) //look at lower right (diagonal) 
{ 
    //explode 
} 
+0

отредактируйте свой пост, а не создайте новое сообщение. –

0

Чтобы получить лучший результат, ряд возможностей должны рассчитываться. Факторы, влияющие на такие возможности:

  1. сколько соседних пузырьков потребуется взорвать? Это 3 пузыря подряд? 4 пузыря подряд? 5?

  2. еще один фактор - это то, как многие виды образования образуют ваш пузырь, чтобы взорваться? только горизонтальное образование? вертикально только? включает ли он диагональ?

  3. Третий фактор - это размер вашей сетки. Насколько оно большое?

Так что это действительно даст огромное количество возможностей после рассмотрения этих факторов.

Но давайте попробуем проанализировать простой. Скажем, 2x2 сетки только с горизонтальной и вертикальной формации, принимая 2 пузыри, чтобы взорвать:

[a][b] 
[c][d] 

Возможности: а-b, c-d, а-в, б-д = 4 возможности.

Это уже дает вам 4 возможности.

Таким образом, с сеткой 4x4 с вертикальным и горизонтальным образованием и тремя пузырьками для взрыва действительно будет накапливаться огромное количество вычислений.

+0

Пузыри - , прилегающие к одному или нескольким из 4 возможных направлений (N, S, W, E). Диагонально близко Пузыри не смежны. – devoidfeast

+0

вы можете взорвать кластеры 2+ Пузырьков того же цвета. – devoidfeast

+0

Моя доска - это массив 15x10 – devoidfeast