2014-11-22 2 views
0

Я пытаюсь подключить четыре игры в scala. В настоящее время у меня есть распечатка платы и прошу игрока 1 за ход, как только игрок 1 выберет номер, который выдает печатная плата с X в столбце, где выбрал игрока 1. то игрок 2 выбирает номер. Моя проблема заключается в том, что, как только я выберу номер, письмо игрока заполняет весь столбец, и вы создаете его поверх этого.Connect Four игра в Scala

Вот пример того, что происходит

. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
. X . O X . . . 
0 1 2 3 4 5 6 7 


// Initialize the grid 
val table = Array.fill(9,8)('.') 
var i = 0; 
while(i < 8){ 
table(8)(i) = (i+'0').toChar 
i = i+1; 
} 

/* printGrid: Print out the grid provided */ 
def printGrid(table: Array[Array[Char]]) { 
table.foreach(x => println(x.mkString(" "))) 
    } 


/*//place of pieces X 
def placeMarker(){ 
val move = readInt 
//var currentRow = 7 
while (currentRow >= 0) 
    if (table(currentRow)(move) != ('.')){ 
     currentRow = (currentRow-1) 
     table(currentRow)(move) = ('X') 
      return (player2)} 
     else{ 
     table(currentRow)(move) = ('X') 
      return (player2) 
      } 
    } 

//place of pieces O 
def placeMarker2(){ 
    val move = readInt 
    //var currentRow = 7 
    while (currentRow >= 0) 
     if (table(currentRow)(move) != ('.')){ 
      currentRow = (currentRow-1) 
      table(currentRow)(move) = ('O') 
       return (player1)} 
     else{ 
      table(currentRow)(move) = ('O') 
       return (player1) 
      } 
     } 
*/ 

def placeMarker1(){ 
val move = readInt 
var currentRow = 7 
while (currentRow >= 0) 
    if (table(currentRow)(move) !=('.')) 
     {currentRow = (currentRow-1)} 
    else{table(currentRow)(move) = ('X')} 
} 

def placeMarker2(){ 
val move = readInt 
var currentRow = 7 
while (currentRow >= 0) 
    if (table(currentRow)(move) !=('.')) 
     {currentRow = (currentRow-1)} 
    else{table(currentRow)(move) = ('O')} 
} 

//player 1 
def player1(){ 
    printGrid(table) 
    println("Player 1 it is your turn. Choose a column 0-7") 
    placeMarker1() 
} 

//player 2 
def player2(){ 
    printGrid(table) 
    println("Player 2 it is your turn. Choose a column 0-7") 
    placeMarker2() 
} 

for (turn <- 1 to 32){ 
    player1 
    player2 
} 

ответ

0

Ваше глобальное состояние Мессинг вас: var currentRow = 7

Вместо того, чтобы пытаться следить за глобальной «currentRow» во всех колонках, я бы рекомендовал одна из двух вещей:

  1. Держите отдельный «currentRow» для каждого столбца в массиве currentRows.
  2. Просто перебирайте столбец каждый раз, когда вы кладете кусок, чтобы найти самый низкий пустой слот.

На самом деле, похоже, что вы изначально делали второе предложение, но вы закомментировали свои локальные переменные currentRow и вместо этого объявили глобальный (экземпляр-уровень).

+0

Итак, когда у меня было var CurrentRows = 7 в функции placeMarker1/placeMaker2, это позволило бы мне подняться во 2-ю строку снизу и не продолжить весь путь вверх. Как вы думаете, я должен продолжать с ним в функциях @daowen – acolisto

+0

@acolisto - Это потому, что логика плохая. Почему у вас есть цикл, если вы никогда не отпускаете его на более чем 1 итерацию? (У обоих ветвей (если/else) условного есть 'return' внутри.) Истинная ветвь должна * только * декрементировать' currentRow', а затем цикл будет продолжать делать свою вещь: 'if (table (currentRow) (move)! = ('.')) {currentRow = (currentRow-1)} else {...} ' – DaoWen

+0

@acolisto - Вам все еще нужно' return' в ветке 'else'. Другими словами, как только вы разместите кусок, вы закончите, и вы вернетесь. – DaoWen

Смежные вопросы