Массивы - случайный шанс - PullRequest
0 голосов
/ 28 ноября 2018

Я новичок в python и пытаюсь создать простую игру.Я изо всех сил пытаюсь создать функцию, которая должна принимать нулевые аргументы и возвращает сетку, которая содержит случайно размещенные взрывчатые вещества.

Как общее требование, вероятность получить мину должна составлять десять процентов.

Пока это мой код, но я изо всех сил пытаюсь понять, куда идти дальше.Я также не совсем понимаю, какова вероятность того, что шахта будет соответствовать десятипроцентной вероятности, потому что я думала, что должно быть 10 разных коробок?Если бы кто-то мог помочь подтолкнуть меня в правильном направлении, я был бы очень признателен.

def mines():
    gridSize = 3
    createGrid = [[' ' for i in range(gridSize)] for i in range(gridSize)]
    return createGrid
print(initMines())

Все эти ответы были действительно полезны, спасибо!:)

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Если вам нужно гарантированное количество мин, вы можете сделать это:

import random

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]


size = int(input('Enter length of row: '))

# By default 1/size of cells will be mines.
mines = (size**2)//size

# There is probably a better way to get user input, but this will do.
try:
    mines = int(input('Enter number of mines [default=%s]: ' % mines))
except:
    mines = (size**2)//size

# Make an one dimensional list of size square.
field_1d = [' ']*(size**2)

# Stick the mines into the list.
for m in range(mines):
    field_1d[m] = '*'

# Randomly place the mines.
random.shuffle(field_1d)

# Make a 2D list out of the 1D list.
field = [r for r in chunks(field_1d,size)]

# Display it.
for row in field:
    print(row)

Вот вывод:

$ ./minesweeper.py
Enter length of row: 3
Enter number of mines [default=3]: 1
[' ', ' ', ' ']
[' ', '*', ' ']
[' ', ' ', ' ']
$ ./minesweeper.py
Enter length of row: 10
Enter number of mines [default=10]:
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', '*', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ']
[' ', '*', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*']
[' ', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ']

Извините, я не смог устоять.Я пошел дальше и написал полную игру тральщика:

import random

class Cell():

    def __init__(self,i,j,field):
        self.i = i
        self.j = j
        self.exposed = False
        self.field = field
        self.value = self.calc_value()

    def display(self):
        if self.exposed:
            return self.value
        return '_'

    def expose(self):
        self.exposed = True

    def calc_value(self):
        i = self.i
        j = self.j
        f = self.field

        if self.field[i][j] == '*':
            return '*'
        v=0
        try:
            if f[i-1][j-1] == '*':
                v += 1
        except:
            pass
        try:
            if f[i-1][j] == '*':
                v += 1
        except:
            pass
        try:
            if f[i-1][j+1] == '*':
                v += 1
        except:
            pass
        try:
            if f[i][j-1] == '*':
                v += 1
        except:
            pass
        try:
            if f[i][j+1] == '*':
                v += 1
        except:
            pass
        try:
            if f[i+1][j-1] == '*':
                v += 1
        except:
            pass
        try:
            if f[i+1][j] == '*':
                v += 1
        except:
            pass
        try:
            if f[i+1][j+1] == '*':
                v += 1
        except:
            pass
        return str(v)


def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]


size = int(input('Enter size of field: '))

# 1/10th of cells will be mines.
mines = (size**2)//size

try:
    mines = int(input('Enter number of mines [default=%s]: ' % mines))
except:
    mines = (size**2)//size

# Make an one dimensional list of size square.
field_1d = [' ']*(size**2)

# Stick the mines into the list.
for m in range(mines):
    field_1d[m] = '*'

# Randomly place the mines.
random.shuffle(field_1d)

# Make a 2D list out of the 1D list.
field = [r for r in chunks(field_1d,size)]

# Display it.
for row in field:
    print(row)

board_1d = []
for i in range(size):
    for j in range(size):
        print(i,j)
        board_1d.append(Cell(i,j,field))

board = [r for r in chunks(board_1d,size)]
def display(board):
    for i in range(size):
        for j in range(size):
            print(board[i][j].display(), end='|')
        print("")

def win(board):
    unexposed = 0
    for i in range(size):
        for j in range(size):
            if board[i][j].exposed == False:
                unexposed += 1

    if unexposed == mines:
        print('WINNER!!!!')
        return True

    return False

gameover = False

while not gameover:
    display(board)
    I = int(input('Enter I: '))
    J = int(input('Enter J: '))
    c = board[I][J]
    c.expose()
    if c.value == '*':
       print("BOOM!")
       gameover = True
    gameover = win(board)

display(board)
0 голосов
/ 28 ноября 2018

Для <sup>1</sup>/<sub>10</sub> шанса на мину вы можете просто использовать что-то вроде (помня import random):

opts = "M........."
[[random.choice(opts) for c in range(gridSize)] for r in range(gridSize)]

Он просто выбирает один из символов из строки, что происходит сс вероятностью 10% получить мину.

Использование ее в полной программе и повышение ее настраиваемости:

import random

def mines(gsz, pct):
    # Silently enforce int 0-100, create choices, then choose.

    pct = max(0, min(100, int(pct)))
    opts = "M" * pct + ' ' * (100 - pct)
    return [[random.choice(opts) for i in range(gsz)] for i in range(gsz)]

# Test harness. First, create a grid.

sz = 10
grid = mines(sz, 20)

# Then dump it for confirmation.

for line in grid: print(line)
mineCount = sum([cell == 'M' for row in grid for cell in row])
print('\nActual percentage was', 100 * mineCount / sz / sz)

показывает ее в действии:

[' ', ' ', 'M', ' ', ' ', ' ', 'M', ' ', ' ', ' ']
['M', ' ', ' ', ' ', 'M', ' ', ' ', ' ', ' ', ' ']
['M', ' ', ' ', ' ', 'M', 'M', ' ', ' ', ' ', ' ']
[' ', 'M', 'M', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
['M', ' ', ' ', ' ', ' ', 'M', ' ', ' ', ' ', ' ']
['M', ' ', ' ', ' ', ' ', ' ', 'M', 'M', ' ', ' ']
[' ', ' ', 'M', ' ', 'M', ' ', 'M', ' ', ' ', 'M']
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', ' ', 'M', ' ', ' ', ' ']

Actual percentage was 19.0
0 голосов
/ 28 ноября 2018

Я не очень хорошо знаком с Python, поэтому извините, если что-то не работает, но, судя по всему, вы создаете 2d-массив, а затем заполняете их пустой строкой "" илишахта "x", основанная на вероятности.

Исходя из первого ответа здесь , вы в основном идете по правильному пути с инициализацией массива, хотя вам, возможно, придется сделать два«Я другой (учитывая, что они представляют« координаты »в массиве, я бы предложил x и y)

createGrid = [[' ' for x in range(gridSize)] for y in range(gridSize)]

Затем вам нужно заполнить массив, и то, как я бы предложил вам сделать этобудет использовать вложенные для циклов, как показано ниже:

for i in range(gridSize)
    for j in range(gridSize)
        createGrid[i][j] = //code for mine/empty

Это будет перебирать все значения в массиве, а затем обновлять их в зависимости от того, должно ли оно содержать шахту или быть пустым.

Чтобы решить, должен ли он быть моим, лучше всего было бы импортировать случайный модуль и использовать функцию randint или случайную функцию, а затем использовать оператор if дляопределить, гдеили нет, это должна быть моя.(Оператор if идет внутри циклов for, импорт происходит раньше всего в вашем коде)

например

import random

if random.randint(0, 10) <= 1
    createGrid[i][j] = "x"

Надеюсь, что это имеет смысл и полезно!

0 голосов
/ 28 ноября 2018

Используя случайную библиотеку, вы можете использовать randint, чтобы получить шанс 1 к 10, и реализовать с помощью оператора if

import random

GRIDSIZE = 3
CHANCE = 10

def mines():
    createGrid = [[("x" if random.randint(0, CHANCE) == 0  else  " ") for i in range(GRIDSIZE)] for i in range(GRIDSIZE)]
    return createGrid
print(mines())

Пример вывода

[['x', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]

Редактировать: У меня естьдобавил глобальные константы для размера сетки и вероятности на основе вашего вопроса, однако я бы передал их в качестве параметров на вашем месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...