Python 矩阵掷骰子程序中的逻辑错误
Logic Error in a matrix roll dice program in Python
我有以下简单游戏代码,让玩家 1 和玩家 2 轮流掷两个六面骰子(骰子)。达到 49(矩阵中的最后一个数字)时,玩家将获胜。玩家从 1 开始,然后向上移动滚动的数字(两个骰子的总数)。
我的代码中有三个错误(逻辑错误),我需要一些帮助。
1)获胜者功能不起作用。 如果玩家达到 49 或接近(见最后的输出),逻辑上不允许他们获胜。 (只需按住 enter 键进行 运行 测试并查看下面粘贴的特殊输出)。玩家 1 和玩家 2 可以达到 49,但不会将他们带到 "winner()" 模块。为什么?我是否正确使用了“>=”?
话虽如此,在一次测试中:玩家 2 达到了 49,但没有进入 winner() 模块:
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 4 and a 6 which gives you a: 10
You have moved 10 spaces to position:....... 49
2) 完全退出程序并重新启动时,player1position 和 player2position 的值将重置为 0,并且可以正常工作。但是如果我只是去 main() 重玩游戏,这些值不会被重置。我不完全理解全局变量和初始化的用法和声明。任何人都可以阐明一些问题,explanation/suggestion 会有所帮助
3)负数处理不准确。 如果玩家在任何回合中掷出两个相同的数字,则他们将返回掷出的数字。例如如果掷出 2 和 2,则玩家返回 4。但是,如果玩家在 5、10 个空格时返回到 -5,则下一回合不会将 player1position 或 player2position 的总数加起来计数被打乱了。我已经尝试了各种修复,我对任何评论、建议和改进都很感兴趣。
错误输出如下:
首先,这是矩阵:
*************LOADING GAME******************
Welcome: player1 and player2
[43, 44, 45, 46, 47, 48, 49]
[42, 41, 40, 39, 38, 37, 36]
[29, 30, 31, 32, 33, 34, 35]
[28, 27, 26, 25, 24, 23, 22]
[15, 16, 17, 18, 19, 20, 21]
[14, 13, 12, 11, 10, 9, 8]
[1, 2, 3, 4, 5, 6, 7]
相关代码如下:
import sys
import csv
import random
def main():
startscreen()
def loadstartgame(player1,player2):
with open("messages.txt","r") as f:
idnumber="1"
fReader=csv.reader(f)
for row in fReader:
for field in row:
if field==idnumber:
print(row[2])
start=input("Start?:>>")
if start=="s" or "S":
callmatrix(player1,player2,7)
def startscreen():
print("******************************Welcome to CONQUER THE MATRIX****************************")
print("You can take on a friend in this game")
player1=input("Enter name of Player 1: ")
player2=input("Enter name of Player 2: ")
print("Welcome ...", player1,"and, ", player2, "...Are you ready?")
response=input("Yes or No? Player 1 - perhaps you could confirm please: ")
if response=="yes" or "Yes" or "yEs" or "YeS":
loadstartgame(player1, player2)
else:
sys.exit()
def matrix(n):
grid = [[1 + i + n * j for i in range(n)] for j in range(n)]
for row in grid[1::2]:
row.reverse()
return grid[::-1][:]
def callmatrix(player1,player2, n):
print("*************LOADING GAME******************")
print("Welcome:", player1,"and", player2)
for i in matrix(n):
print(i)
playing = True
playerturns(player1,player2,playing)
def playerturns(player1,player2,playing):
print(" - - - - - - - - - - ")
print("Press Enter to continue")
while(playing):
roll=input()
if roll=="":
RollTwoDiceP1(player1,player2)
else:
break
RollTwoDiceP2(player1,player2)
global player1position #declare a local variable called player1position
player1position=0 #set the global variable before the start of this sub to 0
def RollTwoDiceP1(player1,player2):
global player1position
print("player1position in PLAYER1ROLL", player1position)
#print("player1position at stat of RollTwoDicep1", player1position) #a test that prints the current value of player 1 position
turn=input("Player 1, it's your turn to roll the dice: Press r to roll:>>>")
die1=random.randint(1,6)
die2=random.randint(1,6)
#die1=5 #for testing purposes
#die2=5 #for testing purposes
roll=die1+die2
print("Player1: You rolled a:", die1, "and a", die2, "which gives you a:", roll)
playing = False
matrixlist=matrix(7)
if die1==die2:
gobackspacesP1(roll,player1,player2)
else:
print("You have moved", roll, "spaces to position:.......",matrixlist[6][0]+(roll+player1position))
#print("playerposition plus roll:", player1position+roll) #a test that prints the playerposition+roll - this always comes up to 1 more than it should do on the location, so below substract 1, to make it produce an accurate location on the matrix for a particular roll
player1position=matrixlist[6][0]+(roll+player1position)
if player1position>=49:
winner()
else:
playerturns(player1,player2,playing)
#global player1position
#global player2position
def gobackspacesP1(roll,player1,player2):
global player1position
if player1position<=1:
player1position=0
print("Oh dear - sorry you are now back to square 1 - literally!")
else:
print("Oh dear -you are now back on the matrix to position:", (1+player1position)-roll)
matrixlist=matrix(7)
#new player1position=the first playerposition minus the roll (rather than add it) and + 1 (as the initial position is always 1)
player1position=1+(player1position-roll)
#player1position=matrixlist[6][0]+(roll+player1position)-roll
playing=False
print("player1position in goback", player1position)
playerturns(player1,player2,playing)
def gobackspacesP2(roll,player1,player2):
global player2position
if player2position<=1:
player2position=0
print("Oh dear - sorry you are now back to square 1 - literally!")
else:
print("Oh dear -you are now back on the matrix to position:", (1+player2position)-roll)
matrixlist=matrix(7)
#new player1position=the first playerposition minus the roll (rather than add it) and + 1 (as the initial position is always 1)
player2position=1+(player2position-roll)
#player1position=matrixlist[6][0]+(roll+player1position)-roll
playing=True
print("player2position in goback", player2position)
playerturns(player1,player2,playing)
global player2position
player2position=0
def RollTwoDiceP2(player1,player2):
global player2position
#Remember you need to add the functioanlity for a double identical dice roll to this subroutine for Player2 as well.
turn=input("Player 2, it's your turn to roll the dice: Press r to roll:>>>")
die1=random.randint(1,6)
die2=random.randint(1,6)
roll=die1+die2
print("Player2: You rolled a:", die1, "and a", die2, "which gives you a:", roll)
playing = True
matrixlist=matrix(7)
if die1==die2:
gobackspacesP2(roll,player1,player2)
else:
print("You have moved", roll, "spaces to position:.......",matrixlist[6][0]+(roll+player2position))
#print("playerposition plus roll:", player1position+roll) #a test that prints the playerposition+roll - this always comes up to 1 more than it should do on the location, so below substract 1, to make it produce an accurate location on the matrix for a particular roll
player2position=matrixlist[6][0]+(roll+player2position)
if player2position>=49:
winner()
else:
playerturns(player1,player2,playing)
def winner():
print("Ahh, it appears you have won! Congratulations!")
sys.exit()
def easygrid():
grid=[[43,44,45,46,47,48,49],[42,41,40,39,38,37,36],[29,30,31,32,33,34,35],[28, 27, 26, 25,24,23,22], [15,16,17, 18, 19, 20, 21], [14, 13, 12, 11, 10, 9, 8], [1, 2, 3,4,5,6,7]]
for i in grid:
print(i)
main()
我也很想知道关于我使用全局变量的任何评论以及如何最好地 use/not 在这种情况下使用它们。
我不想要基于 class 的解决方案,因此答案必须是对此的修复。
错误的输出 1(只有玩家 2 赢了,尽管玩家 1 应该赢)
最后几卷导致胜利:
player1position in PLAYER1ROLL 38
Player 1, it's your turn to roll the dice: Press r to roll:>>>
Player1: You rolled a: 3 and a 5 which gives you a: 8
You have moved 8 spaces to position:....... 47
- - - - - - - - - -
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 6 and a 5 which gives you a: 11
You have moved 11 spaces to position:....... 43
- - - - - - - - - -
Press Enter to continue
player1position in PLAYER1ROLL 46
Player 1, it's your turn to roll the dice: Press r to roll:>>>
Player1: You rolled a: 3 and a 5 which gives you a: 8
You have moved 8 spaces to position:....... 55
- - - - - - - - - -
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 6 and a 1 which gives you a: 7
You have moved 7 spaces to position:....... 50
You've won! Congratulations!
错误出现在这一行:(在 RollTwoDice1 和 RollTwoDice2 subs 中)
player1position=matrixlist[6][0]+(roll+player1position)
matrixlist[6][0] 添加了一个错误的 +1,删除后排序逻辑错误。
另外:(在 gobacktospaces 订阅中)
player2position=1+(player2position-roll)
它有一个额外的 -1,它不断地扭曲获胜者功能和相加的结果。
我有以下简单游戏代码,让玩家 1 和玩家 2 轮流掷两个六面骰子(骰子)。达到 49(矩阵中的最后一个数字)时,玩家将获胜。玩家从 1 开始,然后向上移动滚动的数字(两个骰子的总数)。
我的代码中有三个错误(逻辑错误),我需要一些帮助。
1)获胜者功能不起作用。 如果玩家达到 49 或接近(见最后的输出),逻辑上不允许他们获胜。 (只需按住 enter 键进行 运行 测试并查看下面粘贴的特殊输出)。玩家 1 和玩家 2 可以达到 49,但不会将他们带到 "winner()" 模块。为什么?我是否正确使用了“>=”?
话虽如此,在一次测试中:玩家 2 达到了 49,但没有进入 winner() 模块:
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 4 and a 6 which gives you a: 10
You have moved 10 spaces to position:....... 49
2) 完全退出程序并重新启动时,player1position 和 player2position 的值将重置为 0,并且可以正常工作。但是如果我只是去 main() 重玩游戏,这些值不会被重置。我不完全理解全局变量和初始化的用法和声明。任何人都可以阐明一些问题,explanation/suggestion 会有所帮助
3)负数处理不准确。 如果玩家在任何回合中掷出两个相同的数字,则他们将返回掷出的数字。例如如果掷出 2 和 2,则玩家返回 4。但是,如果玩家在 5、10 个空格时返回到 -5,则下一回合不会将 player1position 或 player2position 的总数加起来计数被打乱了。我已经尝试了各种修复,我对任何评论、建议和改进都很感兴趣。
错误输出如下:
首先,这是矩阵:
*************LOADING GAME******************
Welcome: player1 and player2
[43, 44, 45, 46, 47, 48, 49]
[42, 41, 40, 39, 38, 37, 36]
[29, 30, 31, 32, 33, 34, 35]
[28, 27, 26, 25, 24, 23, 22]
[15, 16, 17, 18, 19, 20, 21]
[14, 13, 12, 11, 10, 9, 8]
[1, 2, 3, 4, 5, 6, 7]
相关代码如下:
import sys
import csv
import random
def main():
startscreen()
def loadstartgame(player1,player2):
with open("messages.txt","r") as f:
idnumber="1"
fReader=csv.reader(f)
for row in fReader:
for field in row:
if field==idnumber:
print(row[2])
start=input("Start?:>>")
if start=="s" or "S":
callmatrix(player1,player2,7)
def startscreen():
print("******************************Welcome to CONQUER THE MATRIX****************************")
print("You can take on a friend in this game")
player1=input("Enter name of Player 1: ")
player2=input("Enter name of Player 2: ")
print("Welcome ...", player1,"and, ", player2, "...Are you ready?")
response=input("Yes or No? Player 1 - perhaps you could confirm please: ")
if response=="yes" or "Yes" or "yEs" or "YeS":
loadstartgame(player1, player2)
else:
sys.exit()
def matrix(n):
grid = [[1 + i + n * j for i in range(n)] for j in range(n)]
for row in grid[1::2]:
row.reverse()
return grid[::-1][:]
def callmatrix(player1,player2, n):
print("*************LOADING GAME******************")
print("Welcome:", player1,"and", player2)
for i in matrix(n):
print(i)
playing = True
playerturns(player1,player2,playing)
def playerturns(player1,player2,playing):
print(" - - - - - - - - - - ")
print("Press Enter to continue")
while(playing):
roll=input()
if roll=="":
RollTwoDiceP1(player1,player2)
else:
break
RollTwoDiceP2(player1,player2)
global player1position #declare a local variable called player1position
player1position=0 #set the global variable before the start of this sub to 0
def RollTwoDiceP1(player1,player2):
global player1position
print("player1position in PLAYER1ROLL", player1position)
#print("player1position at stat of RollTwoDicep1", player1position) #a test that prints the current value of player 1 position
turn=input("Player 1, it's your turn to roll the dice: Press r to roll:>>>")
die1=random.randint(1,6)
die2=random.randint(1,6)
#die1=5 #for testing purposes
#die2=5 #for testing purposes
roll=die1+die2
print("Player1: You rolled a:", die1, "and a", die2, "which gives you a:", roll)
playing = False
matrixlist=matrix(7)
if die1==die2:
gobackspacesP1(roll,player1,player2)
else:
print("You have moved", roll, "spaces to position:.......",matrixlist[6][0]+(roll+player1position))
#print("playerposition plus roll:", player1position+roll) #a test that prints the playerposition+roll - this always comes up to 1 more than it should do on the location, so below substract 1, to make it produce an accurate location on the matrix for a particular roll
player1position=matrixlist[6][0]+(roll+player1position)
if player1position>=49:
winner()
else:
playerturns(player1,player2,playing)
#global player1position
#global player2position
def gobackspacesP1(roll,player1,player2):
global player1position
if player1position<=1:
player1position=0
print("Oh dear - sorry you are now back to square 1 - literally!")
else:
print("Oh dear -you are now back on the matrix to position:", (1+player1position)-roll)
matrixlist=matrix(7)
#new player1position=the first playerposition minus the roll (rather than add it) and + 1 (as the initial position is always 1)
player1position=1+(player1position-roll)
#player1position=matrixlist[6][0]+(roll+player1position)-roll
playing=False
print("player1position in goback", player1position)
playerturns(player1,player2,playing)
def gobackspacesP2(roll,player1,player2):
global player2position
if player2position<=1:
player2position=0
print("Oh dear - sorry you are now back to square 1 - literally!")
else:
print("Oh dear -you are now back on the matrix to position:", (1+player2position)-roll)
matrixlist=matrix(7)
#new player1position=the first playerposition minus the roll (rather than add it) and + 1 (as the initial position is always 1)
player2position=1+(player2position-roll)
#player1position=matrixlist[6][0]+(roll+player1position)-roll
playing=True
print("player2position in goback", player2position)
playerturns(player1,player2,playing)
global player2position
player2position=0
def RollTwoDiceP2(player1,player2):
global player2position
#Remember you need to add the functioanlity for a double identical dice roll to this subroutine for Player2 as well.
turn=input("Player 2, it's your turn to roll the dice: Press r to roll:>>>")
die1=random.randint(1,6)
die2=random.randint(1,6)
roll=die1+die2
print("Player2: You rolled a:", die1, "and a", die2, "which gives you a:", roll)
playing = True
matrixlist=matrix(7)
if die1==die2:
gobackspacesP2(roll,player1,player2)
else:
print("You have moved", roll, "spaces to position:.......",matrixlist[6][0]+(roll+player2position))
#print("playerposition plus roll:", player1position+roll) #a test that prints the playerposition+roll - this always comes up to 1 more than it should do on the location, so below substract 1, to make it produce an accurate location on the matrix for a particular roll
player2position=matrixlist[6][0]+(roll+player2position)
if player2position>=49:
winner()
else:
playerturns(player1,player2,playing)
def winner():
print("Ahh, it appears you have won! Congratulations!")
sys.exit()
def easygrid():
grid=[[43,44,45,46,47,48,49],[42,41,40,39,38,37,36],[29,30,31,32,33,34,35],[28, 27, 26, 25,24,23,22], [15,16,17, 18, 19, 20, 21], [14, 13, 12, 11, 10, 9, 8], [1, 2, 3,4,5,6,7]]
for i in grid:
print(i)
main()
我也很想知道关于我使用全局变量的任何评论以及如何最好地 use/not 在这种情况下使用它们。
我不想要基于 class 的解决方案,因此答案必须是对此的修复。
错误的输出 1(只有玩家 2 赢了,尽管玩家 1 应该赢) 最后几卷导致胜利:
player1position in PLAYER1ROLL 38
Player 1, it's your turn to roll the dice: Press r to roll:>>>
Player1: You rolled a: 3 and a 5 which gives you a: 8
You have moved 8 spaces to position:....... 47
- - - - - - - - - -
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 6 and a 5 which gives you a: 11
You have moved 11 spaces to position:....... 43
- - - - - - - - - -
Press Enter to continue
player1position in PLAYER1ROLL 46
Player 1, it's your turn to roll the dice: Press r to roll:>>>
Player1: You rolled a: 3 and a 5 which gives you a: 8
You have moved 8 spaces to position:....... 55
- - - - - - - - - -
Press Enter to continue
Player 2, it's your turn to roll the dice: Press r to roll:>>>
Player2: You rolled a: 6 and a 1 which gives you a: 7
You have moved 7 spaces to position:....... 50
You've won! Congratulations!
错误出现在这一行:(在 RollTwoDice1 和 RollTwoDice2 subs 中)
player1position=matrixlist[6][0]+(roll+player1position)
matrixlist[6][0] 添加了一个错误的 +1,删除后排序逻辑错误。
另外:(在 gobacktospaces 订阅中)
player2position=1+(player2position-roll)
它有一个额外的 -1,它不断地扭曲获胜者功能和相加的结果。