I have this code:

import pygame
from pygame.locals import *
from sys import exit
from random import randint
from sys import argv
from gameobjects.vector2 import Vector2


def Intersect(s1_x, s1_y, s2_x, s2_y, image):
        if (s1_x > s2_x - image.get_width()):
		if(s1_x < s2_x + image.get_width()):	
			if(s1_y > s2_y - image.get_height()):
				if(s1_y < s2_y + image.get_height()):
                			return 1
	return 0

def doMenu(question, options, retur=False):
	font = pygame.font.SysFont("arial", 20)
	while True:		 
		text = font.render(question, True, (0,0,0))
		screen.fill((255,255,255))
		screen.blit(text, (10,10))
		i = 50
		for t in options:
			text = font.render(t, True, (0,0,0))
			screen.blit(text, (30,i))
			i += 50
		for event in pygame.event.get():
	    		if event.type == QUIT:
            			print score
				exit()
			if event.type == KEYDOWN:
				if event.key == K_1:
					return 1
				if event.key == K_2:
					return 2
				if event.key == K_3:
					return 3
				if event.key == K_4:
					return 4
				if event.key == K_5:
					return 5
				if event.key == K_6:
					return 6
				if retur:
					return
													
		pygame.display.update()

class map1:
	def __init__(self):
		self.d = {"tavern" : tavern(Tavern, Vector2(1,1), "You are in the tavern, what do you want to do?", ["1 - Buy beer", "2 - Rob a drinker", "3 - exit"]),"loanshark" : loanshark(Loanshark, Vector2(600 - Loanshark.get_width(),1), "You are in the loan shark's office, what do you want to do? ", ["(You have to pay back double on loans)","1 - Borrow 100", "2 - Borrow 250", "3 - Borrow 500", "4 - Borrow 1000", "5 - Borrow 10000", "6 - Rob the shark", "7 - Exit"])}
		self.back = pygame.image.load("data/map1.png")
		self.name = "map1"

class map2:
	def __init__(self):
		self.d = {"shop" : shop(Shop, Vector2(173,371), "You are in the shop, what do you want to do?",[]), "shipyard" : shipyard(Shipy, Vector2(232, 87), "You are in the shipyard, what do you want to do?", [])}
		self.back = pygame.image.load("data/map2.png")
		self.name = "map2"

class place:
	def __init__(self, image, pos, q, o):
		self.image = image
		self.pos = pos
		self.q = q
		self.o = o
	def blit(self, screen):
		screen.blit(self.image, (self.pos.x, self.pos.y))	

class tavern(place):
	def __init__(self, image, pos, q, o):
		place.__init__(self,image, pos, q, o)
		self.limit = randint(120, 480)
		self.last_rob = self.limit
	def check(self, position, heading, score):
		self.last_rob += 0.33
		if self.last_rob < self.limit:
			m = doMenu("Hey, you were here when my mate mick was robbed", ["You run away before he calls for guards", "Press any key"], True)
			position.x = 10 + self.image.get_width()
			heading = Vector2()
			return position, heading, score	
		m = doMenu(d.q, d.o)
		position.x = 10 + self.image.get_width()
		heading = Vector2()
		if m == 1:
			score -= 10	
		if m == 2:
			rand = randint(1,200)
			if rand % 5 == 0:
				rand = randint(1, 200)
				score += rand
				xxx = doMenu("You got: $" + str(rand), ["Press any key"], True)
				self.last_rob = 0
			elif rand == 1:
				xxx = doMenu("You were caught! You bribe the soldiers with $100", ["Press any key"], True)
				score -= 100
			else:
				xxx = doMenu("You didn't rob anyone, but you got away", ["Press any key"], True)
		return position, heading, score	

class shop(place):
	def __init__(self, image, pos, q, o):
		place.__init__(self,image, pos, q, o)
		self.limit = randint(120, 480)
		self.last_rob = self.limit
		self.items = {"silk" : 10, "wood" : 5, "gold" : 100, "chocolate" : 15}
		self.keys = ["silk", "wood", "gold", "chocolate"]
		self.pair = [10,5,100,15]
		self.reversed = {10 : "silk", 5 : "wood", 100 : "gold", 15 : "chocolate"}
		self.o = []
		i = 1
		for key, d in self.items.iteritems():
			self.o.append("%i - Buy %s at $%s" % (i, key, d))
			i += 1
		self.o.append("%i - Rob the shop keeper" % (i))
		self.o.append("%i - Exit" % (i + 1))
	def check(self, position, heading, score):
		self.last_rob += 0.33
		if self.last_rob < self.limit:
			m = doMenu("Hey, you robbed me", ["You run away before he calls for guards", "Press any key"], True)
			position.x = self.pos.x + 5 + self.image.get_width()
			heading = Vector2()
			return position, heading, score	
		m = doMenu(d.q, d.o)
		position.x = self.pos.x + 5 + self.image.get_width()
		heading = Vector2() 
		for i in self.keys:
			try:
				if i == self.reversed[self.pair[m - 1]]:
					if score - self.items[self.keys[m - 1]] < 0:
						m = doMenu("You don't have enough money for that!", ["Press any key"], True)
						print self.items[self.keys[m - 1]]
					else:
						score -= self.items[self.keys[m - 1]]
			except:
				pass
		l = len(self.keys)			
		if m == l + 1:
			rand = randint(1,200)
			if rand % 5 == 0:
				rand = randint(200, 1000)
				score += rand
				xxx = doMenu("You got: $" + str(rand), ["Press any key"], True)
				self.last_rob = 0
			elif rand == 1:
				xxx = doMenu("You were caught! You bribe the soldiers with $100", ["Press any key"], True)
				score -= 100
			else:
				xxx = doMenu("You didn't rob anyone, but you got away", ["Press any key"], True)						

		return position, heading, score

class shipyard(place):
	def __init__(self, image, pos, q, o):
		place.__init__(self,image, pos, q, o)
		self.limit = randint(120, 480)
		self.last_rob = self.limit
		self.items = {"rowing boat" : 150, "sloon" : 1400, "merchant ship" : 3650, "galleon" : 40000}
		self.keys = ["rowing boat", "sloon", "merchant ship", "galleon"]
		self.pair = [1400,150,3650,40000]
		self.reversed = {150 : "rowing boat", 1400 : "sloon", 3650 : "merchant ship", 40000 : "galleon"}
		print self.keys
		self.o = []
		i = 1
		for key, d in self.items.iteritems():
			self.o.append("%i - Buy %s at $%s" % (i, key, d))
			i += 1
		self.o.append("%i - Rob the ship builder" % (i))
		self.o.append("%i - Exit" % (i + 1))
		print self.o
		print self.items
	def check(self, position, heading, score):
		self.last_rob += 0.33
		if self.last_rob < self.limit:
			m = doMenu("Hey, you robbed me", ["You run away before he calls for guards", "Press any key"], True)
			position.x = self.pos.x + 5 + self.image.get_width()
			heading = Vector2()
			return position, heading, score	
		m = doMenu(d.q, d.o)
		position.x = self.pos.x + 5 + self.image.get_width()
		heading = Vector2() 
		for i in self.keys:
			try:
				if i == self.reversed[self.pair[m - 1]]:
					print self.items[self.keys[m - 1]]
					if score - self.items[self.keys[m - 1]] < 0:
						m = doMenu("You don't have enough money for that!", ["Press any key"], True)
					else:
						score -= self.items[self.keys[m - 1]]
			except:
				pass
		l = len(self.keys)			
		if m == l + 1:
			rand = randint(1,200)
			if rand % 5 == 0:
				rand = randint(200, 1000)
				score += rand
				xxx = doMenu("You got: $" + str(rand), ["Press any key"], True)
				self.last_rob = 0
			elif rand == 1:
				xxx = doMenu("You were caught! You bribe the soldiers with $100", ["Press any key"], True)
				score -= 100
			else:
				xxx = doMenu("You didn't rob anyone, but you got away", ["Press any key"], True)						

		return position, heading, score
				

class loanshark(place):
	def __init__(self, image, pos, q, o):
		place.__init__(self,pygame.image.load("data/loan.png"), pos, q, o)
		self.owed = 0
		self.limit = randint(120, 480)
		self.last_rob = self.limit

	def check(self, position, heading, score):
		self.last_rob += 0.33
		if self.last_rob < self.limit:
			m = doMenu("Hey, you robbed me", ["You run away before he calls for guards", "Press any key"], True)
			position.x = 10 + self.image.get_width()
			heading = Vector2()
			return position, heading, score	
		if self.owed == 0:
			m = doMenu(d.q, d.o)
			if m == 1:
				score += 100
				self.owed = 100
			if m == 2:
				score += 250
				self.owed = 250
			if m == 3:
				score += 500
				self.owed = 500
			if m == 4:
				score += 1000
				self.owed = 1000
			if m == 5:
				score += 10000
				self.owed = 10000
			if m == 6:
				rand = randint(1,200)
				if rand == 1:
					rand = randint(20000, 100000)
					score += rand
					xxx = doMenu("You got: $" + str(rand), ["Press any key"], True)
					self.last_rob = 0
				elif rand % 5 == 0:
					xxx = doMenu("You were caught! You bribe the soldiers with $" + str((score/100)*33), ["Press any key"], True)
					score -= (score/100)*33
				else:
					xxx = doMenu("You didn't rob anyone, but you got away", ["Press any key"], True)

		else:
			m = doMenu(d.q, ["1 - Pay money back", "2 - Rob the shark", "3 - Exit"])
			if m == 1:
				score -= self.owed * 2
				self.owed = 0
			if m == 2:
				rand = randint(1,200)
				if rand == 1:
					rand = randint(20000, 100000)
					score += rand
					xxx = doMenu("You got: $" + str(rand), ["Press any key"], True)
					self.last_rob = 0
				elif rand % 5 == 0:
					xxx = doMenu("You were caught! You bribe the soldiers with $" + str((score/100)*33), ["Press any key"], True)
					score -= (score/100)*33
				else:
					xxx = doMenu("You didn't rob anyone, but you got away", ["Press any key"], True)
		position.x = 575 - self.image.get_width()
		heading = Vector2()	
		return position, heading, score	
		
				

screen = pygame.display.set_mode((600,480), 0, 32)
pygame.init()
back = pygame.image.load("data/map1.png")
me = pygame.image.load("data/me.png")
Tavern = pygame.image.load("data/tavern.png")
Loanshark = pygame.image.load("data/loan.png")
Shop = pygame.image.load("data/shop.png")
Shipy = pygame.image.load("data/shipy.png")
clock = pygame.time.Clock()
score = 1000
x = 10
y = screen.get_height()/2 - me.get_height()
distance_moved = 0
speed = 100.
position = Vector2(400.0, 400.0)
heading = Vector2()
destination = Vector2()
left = False
top = False
map = map1()
while True:
	time_passed = clock.tick(30) / 1000.0
	screen.blit(map.back, (0,0))
	for event in pygame.event.get():
	    	if event.type == QUIT:
            		print score
			exit()
		if event.type == MOUSEBUTTONDOWN:
			destination = Vector2(*event.pos) - Vector2(*me.get_size())/2.
			heading = Vector2.from_points(position, destination)
			heading.normalize()
	
	heading2 = Vector2.from_points(position, destination)
	heading.normalize()
	if position.x < screen.get_width()/2:
		left = True
	if position.y < screen.get_height()/2:
		top = True
	if heading.x != 0 and heading.x != 0:
		if heading.x < 0:
			if heading.y < 0:
				if heading2.x > 0 and heading2.y > 0 :
					heading = Vector2()	
			else:
				if heading2.x > 0 and heading2.y < 0:
					heading = Vector2()	
		else:
			if heading.y < 0:
				if heading2.x < 0 and heading2.y > 0 :
					heading = Vector2()	
			else:
				if heading2.x < 0 and heading2.y < 0:
					heading = Vector2()	
	distance_moved = time_passed * speed
	position += heading * distance_moved
	screen.blit(me, (position))
	if map.name == "map1" and position.x <= 0:
		map = map2()
		position.x = 598 - me.get_width()
		heading = Vector2()
	if map.name == "map2" and position.x + me.get_width() >= 600:
		map = map1()
		position.x = 0 + me.get_width()
		heading = Vector2()
	for key, d in map.d.iteritems():
		d.blit(screen)
		if d.pos.x > screen.get_width()/2:
			i = Intersect(position.x, position.y, 600, d.pos.y, d.image)
		else:
			i = Intersect(position.x, position.y, d.pos.x, d.pos.y, d.image)
		if i == 1:
			position, heading, score = d.check(position, heading, score)					
	pygame.display.update()

when run the intersect doesn't always work and when entering the building marked "sy" on map2 and you try to buy a rowing boat it says you don't have enough money because the dictionary seams to be mixed up?

Recommended Answers

All 4 Replies

It would be nice to get the game going and put in some test prints or send it through a debugger. However, without the module gameobjects it is hard to get the needed vector2 stuff. Also looks like there is a mixed tab/space indentation issue.

you know, pygame has it's own rect collision system:

g=Rect(0,0,50,50)
h=Rect(30,30,60,60)
if Rect.colliderect(g,h)==1:
     print "g and h have collided!"
else:
     print "g and h have not collided yet"

hope that helps!

pymatio, your code would be easier to read if you would stick with the 4 space indentation that every else uses. Yes, you have managed to mix up tabs and spaces according to my editor.

I see you may have took some ideas from my text based version? Very cool indeed..

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.