2-dim array i python [LÖST]

Här diskuteras programmering och utveckling
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

2-dim array i python [LÖST]

Inlägg av skaggapa »

Hej

jag håller på å skriver en screenlet. ms-röj-screenlet. Jag behöver en tom 2-dim array för att spara alla fält i och det vill sig inte riktigt.

Kod: Markera allt

#!/usr/bin/env python

class PlayField:

	def __init__(self,size_x,size_y,num_mines):
		self.bricks = [size_x][size_y]
		self.num_mines = num_mines
		self.place_mines()
		self.width = size_x
		self.height = size_y	

	def get_num_mines_left(self):
		return self.num_mines

	# loops over all possible bricks
	# and calls place mine on all as
	# long as there are mines left
	# to place

	def place_mines(self):
		num_left = self.num_mines
		bricks_left = self.width*self.height
		for x in range(0,self.width):
			for y in range(0,self.height):
				if num_left > 1 :
					num_left=self.place_mine(x,y,num_left,bricks_left)
				bricks_left = bricks_left -1


	# places a mine if a random number * playfield area
	# is smaller than equal to 1
	#
	# also places a mine if there are only as mines
	# as bricks left

	def place_mine(self,posx,posy,num_mines_left,bricks_left):
		# If there is only place for as many mines
		# as there are bricks left place one
		# Otherwise do some random thing to se if 
		# one should place one

		if num_mines_left==bricks_left :
			self.bricks[posx][posy]=Brick(True,False,False)
			num_mines_left = num_mines_left -1
			return num_mines_left
		else :
			if random.random()*self.playfield_width*self.playfield_height <= 1:
				self.bricks[posx][posy]=Brick(True,False,False)
				num_mines_left = num_mines_left -1
				return num_mines_left
			else :
				self.bricks[posx][posy]=Brick(False,False,False)
				return num_mines_left
	
	def check_brick(self,posx,posy):
		if self.Bricks[posx][posy].checked :
			return False
		else :
			return self.Bricks[posx][posy].explosive

	def mark_brick(self,posx,posy):
		self.Bricks[posx][posy].set_marked()
		self.num_mines = self.num_mines-1

	def is_marked(self,posx,posy):
		return self.Bricks[posx][posy].marked

När jag i huvudprogrammet ropar på

Kod: Markera allt

		self.my_field = PlayField(self.playfield_width,self.playfield_height, self.num_mines)
så får jag denna error.

Kod: Markera allt

Traceback (most recent call last):
  File "./MineFielsScreenlet.py", line 160, in <module>
    screenlets.session.create_session(MineFieldScreenlet)
  File "/usr/lib/python2.5/site-packages/screenlets/session.py", line 392, in create_session
    session.start()
  File "/usr/lib/python2.5/site-packages/screenlets/session.py", line 177, in start
    if self.__load_instances():
  File "/usr/lib/python2.5/site-packages/screenlets/session.py", line 322, in __load_instances
    sl.on_init()
  File "./MineFielsScreenlet.py", line 124, in on_init
    self.new_game()
  File "./MineFielsScreenlet.py", line 129, in new_game
    self.my_field = PlayField(self.playfield_width,self.playfield_height, self.num_mines)
  File "/home/cissi/.screenlets/Minefield/PlayField.py", line 6, in __init__
    self.bricks = [size_x][size_y]
IndexError: list index out of range

hur skapar man en tom 2-dim array för objekt i python är alltså min enkla fråga?
Senast redigerad av 1 DrMegahertz, redigerad totalt 6 gånger.
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: 2-dim array i python

Inlägg av Smygis »

arrays finns inte i python. Man måste tänka på ett lite annorlunda sätt än andra språk.
Nämligen listor med listor.


>>> arr = [[0 for i in range(10)] for c in range(10)]
>>> for i in arr: print i
...
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> arr[1][2] = 1
>>> for i in arr: print i
...
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>>


Sedan borde du läsa PEP8, det är lite svårt att läsa vissa saker i din kod.
Senast redigerad av 1 Smygis, redigerad totalt 6 gånger.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Urban Anjar
Inlägg: 7306
Blev medlem: 05 nov 2006, 22:59
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Vickleby
Kontakt:

SV: 2-dim array i python

Inlägg av Urban Anjar »

Jag har för mig att array finns i någon tilläggsmodul (math?), har dock inte lekt med det.
Ubuntu från början: http://ubuntufranborjan.wordpress.com/
Vill påminna om den här lilla filmen http://video.google.com/videoplay?docid ... 522818645#
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: 2-dim array i python

Inlägg av skaggapa »

Ang formatering av kod. Jag vet, än så länge var koden enbart tänkt för mig och jag tänkte inte på det när jag laddade upp den.

Så jag borde alltså skapa spelplan med

Kod: Markera allt

self.bricks = [[Brick(False,False,False) for i in range(size_y)]for c in range(size_x)]
Återigen ledsen för formateringen. Hade inte en tanke på den.

mvh
Anders
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: 2-dim array i python

Inlägg av Smygis »

skaggapa skrev: Ang formatering av kod. Jag vet, än så länge var koden enbart tänkt för mig och jag tänkte inte på det när jag laddade upp den.

Så jag borde alltså skapa spelplan med

Kod: Markera allt

self.bricks = [[Brick(False,False,False) for i in range(size_y)]for c in range(size_x)]
Återigen ledsen för formateringen. Hade inte en tanke på den.

mvh
Anders
self.bricks = [[Brick(False, False, False) for i in range(size_y)] for c in range(size_x)]
Ser helt rätt ut ja.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
skaggapa
Inlägg: 154
Blev medlem: 29 jun 2007, 20:21
OS: Ubuntu
Utgåva: 18.04 Bionic Beaver LTS

SV: 2-dim array i python

Inlägg av skaggapa »

Japp det funkar! Perfekt tack för hjälpen!!

Lite OT måste säga att python är ett rätt skönt språk. Det här är mitt första försök och om man jämför med java o assembler, som jag mest hållit på med tidigare, går det fort att få ihop saker!!

mvh
Anders
Skriv svar

Återgå till "Programmering och webbdesign"