【问题标题】:How to acess matrix's elements and pass matrix as function argument?如何访问矩阵元素并将矩阵作为函数参数传递?
【发布时间】:2019-04-08 18:58:45
【问题描述】:

我的程序应该模拟宾果游戏。它接收一个 5X5 矩阵(宾果卡)作为输入,它应该验证它们是否在卡上的元素数量(它们是整数)以及一系列元素,一个接一个。目标是验证每个元素是否在矩阵中:如果是肯定的,程序应该用“XX”替换相应的元素。该程序应以上述方式连续进行,直到所有元素都得到验证。如果任何行、列或任一对角线的所有元素都替换为“XX”,程序将打印最终场景(矩阵的最后阶段),正确的元素替换为“XX”和单词 BINGO! ,否则只是最后的场景。 矩阵的第一行包含字母 BINGO,因此通过其对应的标签字母标识每个矩阵的列,“B”代表第一个,“I”代表第二个,依此类推,输入应该在形式: label_letter-XY,其中 X 和 Y 代表数字。 我已经设法正确打印了宾果卡,但我仍然无法遍历矩阵的行和列,验证候选编号是否在

那些列,并将它们替换为“XX”。我实际上不确定我的程序实际上在做什么,因为它只打印原始宾果卡,这让我得出结论,我没有正确访问矩阵。如果有人能给我一些关于我做错了什么的见解,我将非常感激!

m=5             #lines
n=5             #columns/rows
mat=[]
data=[]
for i in range(m):
col=input().split() 
    mat.append(col)
num=int(input())
blank=''
def printbingocard(mat):
    print("+", end=blank)
    print((16)*"-" + "+")
print("| ", end=blank)
print("B  ", end=blank)
print("I  ", end=blank)
print("N  ", end=blank)
print("G  ", end=blank)
print("O  ", end=blank)
print("|")
print("+" + (16)*"=" + "+")
for i in range(m):
    print("| ", end=blank)
    for j in range(n):    
        print(mat[i][j] + " ", end='')
    print("|")
print("+" + (16)*"-" + "+")
printbingocard(mat)
for i in range(num):        
    input=str(input()).split("-")
    input_data.append(input)     

    for j in range(n): 
        if input_data[i][0]=="B":
            if mat[0][j]==input_data[i][1]:  
                mat[0][j]="XX"
                printbingocard(mat)
        if input_data[i][0]=="I":
            if mat[1][j]==input_data[i][1]:
                mat[1][j]="XX"
                printbingocard(mat)
        if input_data[i][0]=="N":
            if mat[2][j]==input_data[i][1]:
                mat[2][j]="XX"
                printbingocard(mat)
        if input_data[i][0]=="G":
            if mat[3][j]==input_data[i][1]:
                mat[3][j]="XX"
                printbingocard(mat)
        if input_data[i][0]=="O":
            if mat[4][j]==input_data[i][1]:
                mat[4][j]="XX"
                printbingocard(mat)
for i in range(m):       
    for j in range(n):
        if mat[i][j]== "XX":
            bol=True
        else:
            bol=False
            break
for j in range(n):       
    for i in range(m):
        if mat[i][j]== "XX":
            bol=True
        else:
            bol=False
            break
printbingocard(mat)
if bol==True:
    print("BINGO!")   
for j in range(n):       
    for i in range(m):
        if mat[j][j]=="XX" or mat[i][i]=="XX": 
            bol=True
        else:
            bol=False
            break
printbingocard(mat)
if bol==True:
    print("BINGO!")
for j in range(4,n,-1):          
    for i in range(1,m,1):      
        if mat[i][j]=="XX":
            bol=True
        else:
            bol=False
            break
printbingocard(mat)
if bol==True:
    print("BINGO!")

【问题讨论】:

  • 您能否仅将相关代码作为VMCE 的一部分发布。另外,如果您要共享代码,请使用英文变量名
  • 是您尝试访问矩阵的部分评论部分?如果可以取消注释您需要工作的实际代码,但添加英文 cmets 以了解这部分应该做什么。

标签: python matrix multidimensional-array nested-lists


【解决方案1】:

我的看法是,我在 python 编程中使用 atom 文本编辑器,所以我没有 input() 函数,所以我不得不随机化我的 bingo 数组

import random
import numpy as np

m=5             #lines
n=5             #columns/rows
mat=[]
bingo_numbers = np.linspace(1,n*m,n*m,dtype=int)
remaining_numbers = bingo_numbers # I need this later on to know what numbers are left
random.shuffle(bingo_numbers)
print(bingo_numbers)
completed_lines = 0

for i in range(m):
    col=bingo_numbers[i*5:(i+1)*5]
    mat.append(list(col))

def imprimecartela(mat, completed_lines):  # Function to print the bingo card
    print("+", end=branco)
    print((16)*"-" + "+")
    print("| ", end=branco)
    if (completed_lines == 0):
        print(5*"_  ", end=branco)
    elif(completed_lines == 1):
        print("B  ", end=branco)
        print(4*"_  ", end=branco)
    elif(completed_lines == 2):
        print("B  ", end=branco)
        print("I  ", end=branco)
        print(3*"_  ", end=branco)
    elif(completed_lines == 3):
        print("B  ", end=branco)
        print("I  ", end=branco)
        print("N  ", end=branco)
        print(2*"_  ", end=branco)
    elif(completed_lines == 4):
        print("B  ", end=branco)
        print("I  ", end=branco)
        print("N  ", end=branco)
        print("G  ", end=branco)
        print("_  ", end=branco)
    else:
        print("B  ", end=branco)
        print("I  ", end=branco)
        print("N  ", end=branco)
        print("G  ", end=branco)
        print("O  ", end=branco)
    print("|")
    print("+" + (16)*"=" + "+")
    for i in range(m):
        print("| ", end=branco)
        for j in range(n):
            if mat[i][j] != 0:  # Check values of <mat>: if non zero print number with 2 digits, if zero print 'XX'
                print(str(mat[i][j]).zfill(2) + " ", end='')
            else:
                print("XX" + " ", end='')
        print("|")
    print("+" + (16)*"-" + "+")

def check_completed_lines(mat):
    completed_lines = 0
    for i in range(m):
        temp = [x[i] for x in mat]
        if (temp == [0,0,0,0,0]):
            completed_lines += 1
    for x in mat:
        if x==[0,0,0,0,0]:
            completed_lines += 1
    if (mat[0][0] == 0 and mat[1][1] == 0 and mat[2][2] == 0 and mat[3][3] == 0 and mat[4][4] == 0):
        completed_lines += 1
    if (mat[0][4] == 0 and mat[1][3] == 0 and mat[2][2] == 0 and mat[3][1] == 0 and mat[4][0] == 0):
        completed_lines += 1
    return completed_lines

imprimecartela(mat,completed_lines)

while (len(remaining_numbers) != 0): # Looping through turns  
    call_number = random.choice(remaining_numbers) # <-- Next number
    print("next number is : ", call_number)
    remaining_numbers = np.delete(remaining_numbers, np.where(remaining_numbers==call_number)) # Remove the number so it doesn't occur again
    for i in mat:
        if call_number in i:
            i[i.index(call_number)] = 0  # Change the value current round number to 0 in <mat>
    completed_lines = check_completed_lines(mat) # This function checks rows and columns and diagonals for completeness, every completed line will add a letter to "BINGO" on the card
    imprimecartela(mat, completed_lines)
    if completed_lines == 5:
        break    # When 5 lines are completed, you win, break

我在代码中添加了 cmets 来解释该过程,但基本上您不需要更改矩阵以包含 'XX' 只需将值更改为 0 因为零已经不是宾果游戏数字并使用您的打印如果值为0,则函数打印'XX'。干杯。

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多