Arrays 连接Scala中的四个游戏

Arrays 连接Scala中的四个游戏,arrays,scala,Arrays,Scala,我想在scala做一个连接四的游戏。目前我已经打印出棋盘,并要求玩家1移动,一旦玩家1选择了一个数字,棋盘就会在玩家1选择的列中打印出一个X。然后玩家2选择一个数字。我的问题是,一旦我选择了一个数字,玩家的字母就会填满整个栏,你就可以在上面构建 下面是一个发生了什么的例子 . X . O X . . . . X . O X . . . . X . O X . . . . X . O X . . . . X . O X . . . . X . O X . . . . X . O X . . . .

我想在scala做一个连接四的游戏。目前我已经打印出棋盘,并要求玩家1移动,一旦玩家1选择了一个数字,棋盘就会在玩家1选择的列中打印出一个X。然后玩家2选择一个数字。我的问题是,一旦我选择了一个数字,玩家的字母就会填满整个栏,你就可以在上面构建

下面是一个发生了什么的例子

. 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
}
。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
//初始化网格
val table=Array.fill(9,8)(“.”)
var i=0;
而(i<8){
表(8)(i)=(i+'0')。toChar
i=i+1;
}
/*printGrid:打印提供的网格*/
def打印网格(表:数组[Array[Char]]){
表.foreach(x=>println(x.mkString(“”))
}
/*//零件位置X
def placeMarker(){
val move=readInt
//var currentRow=7
而(当前行>=0)
如果(表(当前行)(移动)!=('.')){
currentRow=(currentRow-1)
表(当前行)(移动)=('X')
返回(player2)}
否则{
表(当前行)(移动)=('X')
返回(播放机2)
}
}
//件位
def placeMarker2(){
val move=readInt
//var currentRow=7
而(当前行>=0)
如果(表(当前行)(移动)!=('.')){
currentRow=(currentRow-1)
表(当前行)(移动)=('O')
返回(player1)}
否则{
表(当前行)(移动)=('O')
返回(播放者1)
}
}
*/
def placeMarker1(){
val move=readInt
var currentRow=7
而(当前行>=0)
如果(表(当前行)(移动)!=('.'))
{currentRow=(currentRow-1)}
else{table(currentRow)(move)=('X')}
}
def placeMarker2(){
val move=readInt
var currentRow=7
而(当前行>=0)
如果(表(当前行)(移动)!=('.'))
{currentRow=(currentRow-1)}
else{table(currentRow)(move)=('O')}
}
//玩家1
def播放器1(){
打印网格(表格)
println(“玩家1轮到你了。选择一列0-7”)
placeMarker1()
}
//玩家2
def播放器2(){
打印网格(表格)
println(“玩家2轮到你了。选择一列0-7”)
placeMarker2()
}

对于(turn您的全局状态将把您弄得一团糟:
var currentRow=7

与其在所有列中跟踪全局“currentRow”,我建议使用以下两种方法之一:

  • currentRows
    数组中的每一列保留一个单独的“currentRow”
  • 只需在每次放置工件时遍历列,以找到最低的空槽

  • 实际上,看起来您最初是在执行第二个建议,但是您注释掉了本地
    currentRow
    变量,并声明了一个全局(实例级别)因此,当我在函数placeMarker1/placeMaker2中使用var CurrentRows=7时,它只允许我从底部上升到第二行,而不是一直上升。你认为我应该在函数中继续使用它吗@daowen@acolisto-那是因为逻辑不好。如果你从不放弃,为什么会有一个循环对于1次以上的迭代(条件的两个分支(if/else)都有一个
    返回值
    ),真正的分支应该只减少
    currentRow
    ,然后循环将继续执行它的操作:
    if(table(currentRow)(move)!=('.){currentRow=(currentRow-1)}else{…}
    @acolisto-您仍然需要
    else
    分支中的
    return