[Python] Een matrix checken op negatieve indexen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dotorion
  • Registratie: December 2009
  • Laatst online: 07-06-2023
Mede dankzij het 'Welke tools heb jij al gemaakt' topic had ik besloten om mijn Python te oefenen door een Bejeweled Blitz bot te schrijven.

Hij behaalt degelijke scores (~500k) maar loopt nog regelmatig vast op ongeldige moves en ik heb zo'n vermoeden dat het te maken heeft met de manier waarop ik een geldige move zoek en hoe ik over m'n speelveld loop.

Met ImageGrab maak 'k een screenshot van het speelveld, met getpixel haal ik er 64 pixels uit die ik gebruik om de kleur van de gems te bepalen. Ik steek ze in 'n zelfgemaakt Gem object dat de kleur en coords van de gem bijhoud.

code:
1
2
3
4
5
6
7
8
9
board = [[0 for col in range(8)] for row in range(8)]

for x in range(8):
    for y in range(8):
        gem = im.getpixel((gem_x,gem_y))
        board[x][y] = Gem(determineColor(gem),(gem_x,gem_y))
        gem_y += 40
    gem_x += 40
    gem_y = 23


Om op zoek te gaan naar een geldige move overloop ik mijn lijst en kijk voor iedere gem naar de omliggende gems om te zien of daar drie gelijke gems tussen zitten (en dit in verschillende patronen ... bijv xxox, xoxx etc). Ik ga de meeste weglaten uit mijn voorbeeldcode:

code:
1
2
3
4
5
6
7
8
9
for x in range(8):
    for y in range(8):
        try:
            if board[x][y-2].color == board[x][y-1].color and board[x][y-1].color == board[x][y+1].color:
                makeMove(board[x][y].cords,board[x][y+1].cords)
            elif: (...)                     
            else: pass
        except IndexError:
            break


Het probleem is dus dat de bot een move zoals deze ziet, en doordat Python geen probleem heeft met negatieve indexen ziet hij hierin gewoon een geldige move: de gele is board[x][y] of meer specifiek board[5][0], de rode onderaan is board[x][y-1] of board[5][-1].

Afbeeldingslocatie: http://i.imgur.com/DizdV.jpg

Iemand een idee om een check in te bouwen zodat hij geen negatieve indexen gebruikt?
Alvast bedankt!

Desktop: i5 2500k @ 4Ghz, 4GB ram, GTX560Ti OC Laptop Dell XPS15 i5 2450, 4GB ram, GT525M, backlit keyb.


Acties:
  • 0 Henk 'm!

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 03-06 16:38

Nvidiot

notepad!

Misschien denk ik te simpel, maar even checken of je indexes < 0 zijn met een if-je?

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


Acties:
  • 0 Henk 'm!

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 10:41
y van 2..8 laten lopen?!

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Dit lijkt mij ook de beste oplossing. Nou ja, van 2 naar 10 dan.

[ Voor 7% gewijzigd door djc op 07-09-2012 17:03 ]

Rustacean


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 15:38

Cloud

FP ProMod

Ex-moderatie mobster

Tja het gaat fout door die y-2, y-1 en y+1 optellingen. Je kunt je loop anders laten lopen maar ik weet niet of dat gaat werken gezien de ontbrekende code. Ik verwacht eerlijk gezegd van niet.

Wat misschien praktischer is, is die coördinaten buiten de daadwerkelijke if-then-else bepalen en dan meteen controleren of ze niet ongeldig zijn. Maakt het volgens mij ook nog duidelijker. In de if hoef je dan alleen nog maar de waarden in te vullen (geen optellingen te doen) en je weet op dat punt al zeker dat de indexen daadwerkelijk bestaan. Maar nogmaals, dit is ook een beetje afhankelijk van de rest van je code.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana