I made a battleships game and I now need to make sure that the computer doesn't attack at the same spot twice.
My idea of it is storing each shot's co-ordinates in a variable which gets added to whenever there is a new shot and then I just have to check and make it check if the current shot is in the variable.
This is the code I have for shooting:
if playerNumber == "1":
eg.msgbox("Player " + str(playerNumber) + " your shot.")
hit=False
shotX=eg.enterbox("Enter the x-coordinate for your shot (1-5): ")
shotY=eg.enterbox("Enter the y-coordinate for your shot (1-5): ")
else:
eg.msgbox("The computer will now attack!")
hit=False
shotX=str(random.randint(1,5))
shotY=str(random.randint(1,5))
eg.msgbox ("The computer shot at " + str(shotX) + ", " + str(shotY) + "")
My idea of making sure the computer chooses something that isn't in the list is using a loop where it keeps choosing a shot until the one it chooses hasn't been chosen already.
The actual code that makes the computer fire his shot is:
hit = haveShot("2", p1ship1, p1ship2 , player2Board)
if hit:
p2 = p2 + 1
eg.msgbox("The Computer has " + str(p2) + " points and Player 1 has " + str(p1) + " points")
if p2 == 2:
eg.msgbox("Unlucky, The computer won. Press enter to continue")
if platform.system() == "Windows": # ONLY PLAY SOUNDS IF ON WINDOWS OS
finish()
break
Thanks!
U can use a random permutation of n targets and shoot a target from this randomly permuted list. Use
random.shuffle
for this like below. I have shown a sample output for non-repetitive randomly generated in range of 5. Use this shuffled list to target without having to check if you have already taken this shot.I first answer in a language agnostic way.
A very efficient way would be to keep a sequential list of all the possible positions (in your case 5x5=25 positions), use a single random choice in that list and then removes the position from the list. This saves you from the what to do when I hit a position I've already hitted
Python implementation :
First generate the list of positions :
Then get a random position and remove it from the list
Edit :
As a prove it should fork :
You could keep a log of all the shots fired:
I've also kept
shotX
andshotY
as integers (you might need them that way later if you want to look up indices in a matrix, for example.