2016-11-15 2 views
1

В настоящее время я сталкиваюсь с проблемой попытки получить что-то повторить. Код ниже для игры, где пользователь должен найти сундуки с сокровищами в сетке (например, боевые корабли). Код помещает случайный сундук с сокровищами в сетке и пользователь должен его найти. (Они попадают под именем переменной treasure_row = random_row(board).......treasure_col = random_col(board)), однако я хотел бы, так что это больше, чем просто сундук с сокровищами, который помещен в сетке (например 10 или 20)Повторение чего-то в python

Как бы я это сделать?

from random import randint 

board = [] 

for x in range(8): 
    board.append(["•"] * 8) 

def print_board(board): 
    for row in board: 
     print (" ".join(row)) 

print ("You have chosen the option to play the game") 
print_board(board) 

def random_row(board): 
    return randint(1, len(board) - 1) 

def random_col(board): 
    return randint(1, len(board[0]) - 1) 

treasure_row = random_row(board) 
treasure_col = random_col(board) 

turn = 0 
for turn in range(64): 
    turn = turn + 1 
    guess_row = int(input("Guess Row:")) 
    guess_col = int(input("Guess Col:")) 

    if guess_row == treasure_row and guess_col == treasure_col: 
     print ("Congratulations! you have found a treasure chest!") 
     break 
    else: 
     if (guess_row>8) or (guess_col>8): 
       print ("Sorry, that isn't on the grid.") 
     elif(board[guess_row][guess_col] == "X"): 
       print ("You guessed that one already.") 
     else: 
      if turn == 64: 
       print ("Game Over") 
      else: 
       print ("Sorry there is no treasure here!") 
       board[guess_row][guess_col] = "X" 
       print ("Turn", turn + 1) 
    # Print (turn + 1) here! 
     print_board(board) 
+1

Незначительные проблемы с отступом здесь, не могли бы вы исправить их, чтобы мы не нарушили ваш код? Например, 'def print_board (board):' является очевидным. – Torxed

+0

Вы можете создать список кортежей '(row, col)', а затем использовать 'random.sample', чтобы случайно выбрать из них –

+0

http://stackoverflow.com/help/someone-answers –

ответ

0

список использования постижений для быстрых & oneline выражений.

  • создать доску
  • создать список возможных координат с использованием 1 линии Л listcomp, используя список tuple вместо 2 отдельных списков
  • использует random.sample, чтобы быть уверенными, чтобы выбрать правильное количество элементов (при повторных random.randint вызовов, вы можете нажать те же места: было бы меньше сокровищ, чем ожидалось)
  • печать список сокровищ (так что вы можете проверить)
  • чек х & у одновременно, используя in в списке сокровищ кортежи

простое доказательство концепции, создавая максимум 5 сокровища:

import random 

board = [["*"]*8 for _ in range(8)] 

possible_coords = [(x+1,y+1) for x in range(len(board[0])) for y in range(len(board))] 

treasure_coords = random.sample(possible_coords,5) 

print(treasure_coords) 

x=int(input("x coord")) 
y=int(input("y coord")) 

if (x,y) in treasure_coords: 
    print("you have found the treasure") 

Примеры расположения сокровищ:

[(2, 3), (8, 8), (4, 1), (8, 7), (6, 4)] 
[(1, 1), (5, 8), (3, 7), (4, 4), (8, 7)] 

комментарии на ваш код:

  • randint(1, len(board[0]) - 1) отсутствует последний e lement.
  • вы увеличиваете turn в пределах for петля, увеличивая turn.
+0

Хорошо, я применил это к коду, и он работает! Однако есть ли способ, чтобы программа продолжала работать, когда пользователь нашел сундук? –

0

Самый простой способ сделать это хранение сундуки через список кортежей:

treasure_chests = [(1, 2), (4, 5), (1, 4)] 

затем сравнивая догадок с помощью x in y:

if (guess_row, guess_col) in treasure_chests: 

Если вы хотите генерировать сокровище, я бы использовал такую ​​функцию:

def generate_treasure(num, max_x, max_y): 
    treasure_chests = [] 
    while len(treasure_chests) < num: 
     new_chest = (random.randint(1, max_x), random.randint(1, max_y)) 
     if new_chest not in treasure_chests: 
      treasure_chests.append(new_chest) 
    return treasure_chests 

Какие выходы:

>>> generate_treasure(5, 10, 10) 
[(10, 5), (2, 3), (2, 9), (9, 4), (2, 2)] 
+0

ОК спасибо, я дам это попытка. –

+0

@ j.don Я добавил, как сгенерировать любое количество сундуков с сокровищами, которые вы хотите. – TemporalWolf

0

В вашем случае, просто создать два различных treasure_row с и treasure_col с. Например:

treasure_row_1 = random_row(board) 
treasure_col_1 = random_col(board) 

treasure_row_2 = random_row(board) 
treasure_col_2 = random_col(board) 

turn = 0 
for turn in range(64): 
    turn = turn + 1 
    guess_row = int(input("Guess Row:")) 
    guess_col = int(input("Guess Col:")) 

    if guess_row == treasure_row_1 and guess_col == treasure_col_1 or guess_row == treasure_row_2 and guess_col == treasure_col_2: 

или сделать это с помощью массивов кортежей. как вы считаете нужным

+0

ОК, я попробую это, а также кортежи. Однако не будет ли этот код возвращать только 2 сундука? Возможно, я ошибаюсь, и я попробую. –

+0

@ j.don конечно. но что именно вы хотите? случайное число сундуков? динамически установленное число? Все это зависит. – feakuru

+0

Теперь это нормально, я решил проблему ... Спасибо –

0

Вы можете всегда иметь list локаций сокровищницы treasure_locations вы проверяете против:

#... 
def random_col(board): 
    return randint(1, len(board[0]) - 1) 

treasure_locations = [] 
    while len(treasure_locations < 10): #Creates 10 locations 
     treasure = random_row(board), random_col(board) 
     if treasure in treasure_locations: #duplicate, try again 
     continue 
     treasure_locations.append(treasure) 

turn = 0 
for turn in range(64): 
    if(not treasure_locations): 
     print "You found all the treasure!" 
     break 
    turn = turn + 1 
    guess_row = int(input("Guess Row:")) 
    guess_col = int(input("Guess Col:")) 
    guess_loc = guess_row, guess_col 
    if guess_loc in treasure_locations: 
     print ("Congratulations! you have found a treasure chest!") 
     treasure_locations.remove(guess_loc) #remove once found 
     break 
    else: 
     #... 
+0

Хорошо, я попробую это. –

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