User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the Python section within the Software Development category of DaniWeb, a massive community of 456,534 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 3,030 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Python advertiser: Programming Forums
Views: 748 | Replies: 4
Reply
Join Date: Oct 2007
Posts: 13
Reputation: acwbrat is an unknown quantity at this point 
Rep Power: 2
Solved Threads: 0
acwbrat acwbrat is offline Offline
Newbie Poster

Pacman for Python

  #1  
Oct 13th, 2007
I am new to Python and I am trying to write an updated version 2007 of Pacman for my program. I am in dire need of help. Thanks!

Computer Nerd
AddThis Social Bookmark Button
Reply With Quote  
Join Date: Aug 2005
Posts: 1,196
Reputation: Ene Uran is on a distinguished road 
Rep Power: 6
Solved Threads: 67
Ene Uran's Avatar
Ene Uran Ene Uran is offline Offline
Veteran Poster

Re: Pacman for Python

  #2  
Oct 14th, 2007
So what is your exact problem?
drink her pretty
Reply With Quote  
Join Date: Oct 2007
Posts: 13
Reputation: acwbrat is an unknown quantity at this point 
Rep Power: 2
Solved Threads: 0
acwbrat acwbrat is offline Offline
Newbie Poster

Re: Pacman for Python

  #3  
Oct 15th, 2007
I have never written a pacman code for python. Some of the articles that I have found were outdated. I am suppose to use Fedora to perform the codes. The articles and codes that I have viewed were pygame and also livewire.
Reply With Quote  
Join Date: Jul 2006
Posts: 562
Reputation: jrcagle is on a distinguished road 
Rep Power: 4
Solved Threads: 72
jrcagle jrcagle is offline Offline
Posting Pro

Re: Pacman for Python

  #4  
Oct 15th, 2007
This would be a text-based version, I hope?

Start with a plan: Pretend to be the computer and work out a nice high-level description of how you, the computer, would let the user play pac-man. Good coding is about 50% planning, 10% coding, and 40% debugging (or so). Even more planning can lead to even less debugging.

Once you have the plan, post it here; we might be able to point out some things.

Jeff
Last edited by jrcagle : Oct 15th, 2007 at 12:32 am.
Reply With Quote  
Join Date: Oct 2007
Posts: 13
Reputation: acwbrat is an unknown quantity at this point 
Rep Power: 2
Solved Threads: 0
acwbrat acwbrat is offline Offline
Newbie Poster

Re: Pacman for Python

  #5  
Nov 18th, 2007
Here's my code and wanted to know if I could receive some help. I would like for my code to work. I have followed all the steps from the website: http://www.ibiblio.org/obp/pyBiblio/...ml/pacman.html



#! /usr/bin/env python

import os, sys
import pygame
from pygame.locals import *

#...

the_maze = Maze()
while not the_maze.finished():
 the_maze.play()
the_maze.done()

grid_size = 30
margin = grid_size

background_color = Color.black
wall_color = make_color(0.6, 0.9, 0.9)

#The shape of the maze. Each character
#represents a different type of object.
#  % - Wall
#  . - Food
#  o - Capsule
#  G - Ghost (Python, Lynux, Unix, MSACS)
#  P - Garridoman (Pacman)
# Other characters are ignored.

the_layout = [
  "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
  "%.....%.................%.....%",
  "%o%%%.%.%%%.%%%%%%%.%%%.%.%%%o%",
  "%.%.....%......%......%.....%.%",
  "%...%%%.%.%%%%.%.%%%%.%.%%%...%",
  "%%%.%...%.%.........%.%...%.%%%",
  "%...%.%%%.%.%%%%%%%.%.%%%.%...%",
  "%.%%%.......%GG GG%.......%%%.%",
  "%...%.%%%.%.%%%%%%%.%.%%%.%...%",
  "%%%.%...%.%.........%.%...%.%%%",
  "%...%%%.%.%%%%.%.%%%%.%.%%%...%",
  "%.%.....%......%......%.....%.%",
  "%o%%%.%.%%%.%%%%%%%.%%%.%.%%%o%",
  "%.....%........P........%.....%",
  "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"]

class Maze:
  #...
  
  def set_layout(self, layout):
    height = len(layout)
    width = len(layout[0])
    self.make_window(width, height)
    self.make_map(width, height)

    max_y = height - 1
    for x in range(width):
      for y in range(height):
        char = layout[max_y - y][x]
        self.make_object((x, y), char)
   
  def to_screen(self, point):
    (x, y) = point
    x = x*grid_size + margin
    y = y*grid_size + margin
    return (x, y)

  def make_map(self, width, height):
    self.width = width
    self.height = height
    self.map = []
    for y in range(height):
      new_row = []
      for x in range(width):
        new_row.append(Nothing())
      self.map.append(new_row)

  def make_object(self, point, character):
    (x, y) = point
    if character == '%':
      self.map[y][x] = Wall(self, point)

  def finished(self):
    return self.game_over

  def play(self):
    sleep(0.05)

  def done(self):
    end_graphic()
    self.map = [] 

  def make_object(self, point, character):
    (x, y) = point
    if character == '%':
      self.map[y][x] = Wall(self, point)
    elif character == 'P':
      garridoman = Garridoman(self, point)
      self.movable.append(garridoman)

  def set_layout(self, layout):
    height = len(layout)
    width = len(layout[0])
    self.make_window(width, height)
    self.make_map(width, height)
    self.movables = []
    
    max_y = height - 1
    for x in range(width):
      for y in range(height):
        char = layout[max_y - y][x]
        self.make_object((x, y), char)

    for movable in self.movables:
      movable.draw()

  def done(self):
    end_graphics()
    self.map = []
    self.movables = []

  def play(self):
    for movable in self.movables:
      movable.move()
    sleep(0.05)

  def set_layout(self, layout):
    height = len(layout)
    width = len(layout)[0])
    self.make_window(width, height)
    self.movable = []
    self.food_count = 0

    max_y = height - 1
    for x in range(width):
      for y in range(height):
        char = layout[max_y - y][x]
    
    for movable in self.movables:
      movable.draw()

  def make_object(self, point, character):
    (x, y) = point
    if character == '%':
      self.map[y][x] = Wall(self, point)
    elif character == 'P':
    garridoman = Garridoman(self, point)
    self.movables.append(garridoman)
    elif character == '.':
      self.food_count = self.food_count + 1
      self.map[y][x] Food(self, point)

  def make_object(self, point, character):
    elif character == 'G'
      ghost = Ghost(self, point)
      self.movables.append(ghost)

ghost_colors = []
ghost_colors.append(Color.red)
ghost_colors.append(Color.green)
ghost_colors.append(Color.blue)
ghost_colors.append(Color.purple)

ghost_speed = 0.25

def garridoman_is(self, garridoman, point):
  for movable in self.movable:
    movable.garridoman_is(garridoman, point)
   pass

def lose(self):
  print "You lose!"
  self.game_over = 1

def make_object(self, point, character):

elif character == 'o':
  self.map[y][x] = Capsule(self, point)

def remove_capsule(self, place):
  (x, y) = place
  self.map[y][x] = Nothing()
  for movable in self.movables:
     movable.capsule_eaten()

class Capsule(Immovable):
  def _init_(self, maze, point):
     self.place = point
     self.screen_point = maze.to_screen(point)
     self.maze = maze
     self.draw()

capsule_color = Color_white
capsule_size = grid_size * 0.3

def draw(self):
  (screen_x, screen_y) = self.screen_point
  self.dot = circle(screen_x, screen_y,
                    capsule_size, 
                    color = capsule_color,
                    filled = 1)

def eat(self, garridoman):
  remove_from_screen(self.dot)
  self.maze.remove_capsule(self.place)


class Ghost(Movable):
  def _init_(self, maze, start):
    global ghost_colors

    self.next_point = start
    self.movement = (0, 0)

    self.color = ghost_colors[0]
    ghost_colors[:1] = []
    ghost_colors.append(self.colors)

    self.original_color = self.color
    self.time_left = 0

    Movable.-init_(self, maze,
                   start, ghost_speed)

   def capsule_eaten(self):
     self.change_color(scared_color)
     self.time_left = scared_time

   def change_color(self, new_color):
     self.color = new_color
     self.redraw()
   
ghost_shape = [
    (0,     -0.5),
    (0.25,  -0.75),
    (0.5,   -0.5),
    (0.75,  -0.75),
    (0.75,   0.5),
    (0.5,    0.75),
    (-0.5,   0.75),
    (-0.75,  0.5),
    (-0.75,  -0.75),
    (-0.5,   -0.5),
    (-0.25,  -0.75)
  ]

  def draw(self):
    maze = self.maze
    (screen_x, screen_y) = (
        maze.to_screen(self.place) )
    coords = []
    for (x, y) in ghost_shape:
      coords.append(x*grid_size + screen_x,
                    y*grid_size + screen_y)
    
    self.body = polygon(coords, self.color,
                        closed = 1,
                        filled = 1)
  def choose_move(self):
    (move_x, move_y) = self.movement
    (nearest_x, nearest_y) = (
        self.nearest_grid_point() _
    possible_moves = []
   
    if move_x >= 0 and self.can.move_by((1, 0)):
      possible_moves.append((1, 0))

    if move_x <= 0 and self.can_move_by((-1, 0))
      possible_moves.append((-1, 0))

    if move_y >= 0 and self.can.move_by((0, 1)):
      possible_moves.append((0, 1))

    if move_y <= 0 and self.canmove_by(0, -1)):
      possible_moves.append((0, -1))

    if len(possible_moves) != 0:
      move = random_choice(possible_moves)
      (move_x, move_y) = move

    else:
      move_x = -move_x
      move_y = -move_y
      move = (move_x, move_y)

    (x, y) = self.place
    self.next_point = (x+move_x, y+move_y)

    self.movement = move
    return self.furthest_move(move)

    def can_move_by(self, move):
      move = self.further_move(move)
      return move != (0, 0)

    def move_by(self, move):
       (old_x, old_y) = self.place
       (move_x, move_y) = move
 
       (new_x, new_y) = (old_x+move_x, old_y+move_y)
       self.place = (new_x, new_y)

       screen_move = (move_x * grid_size,
                   move_y * grid_size)
       move_by(self.body, screen_move)

  def captured(self, garridoman):
    self.place = self.start
    self color = self.original_color
    self.time_left = 0
    self.redraw()

  def garridoman_is(self, garridoman, point):
    (my_x, my_y) = self.place
    (his_x, his_y) = point
    X = my_x - his_x
    Y = my_y - his_y
    DxD = X*X + Y*Y
    limit = 1.6*1.6
    if DxD < limit:
      self.bump_into(garridoman)

  def bump_into(self, garridoman):
    if self.time_left != 0:
      self.captured(garridoman)
  else:
    self.maze.lose()

  def redraw(self):
    old_body = self.body
    self.draw()
    remove_from_screen(old_body)

  warning_time = 50

  def move(self):
    (current_x, current_y) = self.place
    (next_x, next_y) = self.next_point
    move = (next_x - current_x,
            next_y - current_y)
    move = self.furthest_move(move)
    if move == (0, 0):
      move = self.choose_move()
    self.move_by(move)
    if self.time_left > 0:
      self.update_scared()

  def update_scared(self): 
    self.time_left = self.time_left -1
    time_left = self.time_left
    if time_left % 2 ==0:
      color = self.original_color
    else:
      color = scared_color
    self.change_color(color)

class Food(Immovable):
  def _init_(self, maze, point):
    self.place = point
    self. screen_point = maze.to_screen(point)
    self.maze = maze
    self.draw()

food_color = Color.orange
food_size = grid_size * 0.15

  def draw(self):
    (screen_x, screen_y) = self.screen_point
    self.dot = circle(screen_x, screen_y,
                      food_size,
                      color = food_color,
                      filled = 1)

  def eat(self, garridoman):
    remove_from_screen(self.dot)
    self.maze.remove_food(self.place)

  def remove_food(self, place):
    (x, y) = place
    self.map[y][x] = Nothing()
    self.food_count = self.food_count - 1
    if self.food_count == 0:
      self.win()

  def win(self):
    print "You win!"
    self.game_over = 1


class Immovable:
  pass

  def is_a_wall(self):
    return 0
  
  def eat(self, pacman):
   pass

class Nothin(Immovable):
  pass

class Wall(Immovable):
  def _init_(self, maze, point):
    self.place = point
    self.screen_point = maze.to_screen(point)
    self.maze = maze
    self.draw()

  def draw(self):
    (screen_x, screen_y) = self.screen_point
    forbid_movable()
    dot_size = grid_size * 0.2
    circle(screen_x, screen_y, dot_size,
           color = wall_color, filled = 1)
    (x, y) = self.place
    neighbors = [ (x+1, y), (x-1, y),
                  (x, y+1), (x, y-1)]  
    for neighbor in neighbors:
     self.check_neighbor(neighbor)
    allow_movables()
   
     maze = self.maze
     screen_point = maze.to_screen(self.place)
     angle = self.get_angle()
     endpoints = (self.direction + angle,
                  self.direction + 360 - angle)
     self.body = circle(screen_point, garridoman_color,
                        color = garridoman_color,
                        filled = 1,
                        endpoints = endpoints)

  def get_angle(self):
    (x, y) = self.place
    (nearest_x, nearest_y) = (
        self.nearest_grid_point() )
   distance =  ( abs(x-nearest_x) +
                 abs(y-nearest_y) )
   return 1 +  90*distance  

  def check_neighbor(self, neighbor):
    maze + self.maze
    object = maze.object_at(neighbor)
    if object.is_a_wall():
      here = self.screen_point
      there = maze.to_screen(neighbor)
      line(here, there, color = wall_color)

    allow_movables()

  def object_at(self, point):
    (x, y) = point
    
    if y < 0 or y >= self.width:
      return Nothing()

    return self.map[y][x]

  def is_a_wall(self):
    return 1 

class Movable:
  def _init_(self, maze, point, speed):
    self.maze = maze
    self.place = point
    self.speed = speed
    self.start = point

  def furthest_move(self, movement):
    (move_x, move_y) = movement
    (current_x, current_y) = self.place
    nearest = self.nearest_grid_point()
    (nearest_x, nearest_y) = nearest
    maze = self.maze
     
     if move_x > 0:
       next_point = (nearest_x+1, nearest_y)
       if maze.object_at(next_point).is_a_wall():
         if current_x+move_x > nearest_x:
           move_x = nearest_x - current_x

     elif move_x < 0:
         next_point = (nearest_x-1, nearest_y)
         if maze.object_at(next_point).is_a_wall():
           if current_x+move_x < nearest_x:
             move_x = nearest_x - current_x

     if move_y > 0:
       next_point = (nearest_x, nearest_y+1)
       if maze.object_at(next_point).is_a_wall():
         if current_y+move_y > nearest_y:
           move_y = nearest_y - current_y

     elif move_y < 0:
       next_point = (nearest x, nearest_y-1)
       if maze.object_at(next_point).is_a_wall():
         if current_y+move_y < nearest_y:
           move_y = nearest_y - current_y

     if move_x > self.speed:
       move_x = self.speed
     elif move_x < -self.speed:
       move_x = -self.speed

     if move_y > self.speed:
       move_y = self.speed
     elif move_y < -self.speed:
       move_y = -self.speed

     return (move_x, move_y) 

  def nearest_grid_point(self):
    (current_x, current_y) = self.place
    grid_x = int(current_x + 0.5)
    grid_y = int(current_y + 0.5)
    return (grid_x, grid_y)
  
  garridoman_color = Color.yellow
  garridoman_size = grid_size * 0.8
  garridoman_speed = 0.25

def capsule_eaten(self):
  pass

scared_color = Color.white

scared_time = 300

class Garridoman(Movable):
  def _init_(self, maze, point):
    Movable._init_(self, maze, point
                   garridoman_speed)

  def move(self):
    keys = keys_pressed()
    if   'z' in keys: self.move_left()  
    elif 'x' in keys: self.move_right()
    elif ';' in keys: self.move_up()
    elif '.' in keys: self.move_down()
    self.maze.garridoman_is(self, self.place)

  def move_left(self):
    self.try_move((-1, 0))
  
  def move_right(self):
    self.try_move((1, 0))

  def move_up(self):
    self.try_move((0, 1))

  def move_down(self):
    self.try_move((0, -1))

  def try_move(self, move):
    (move_x, move_y) = move
    (current_x, current_y) = self.place
    (nearest_x, nearest_y) = (
        self.nearest_grid_point() )

    if self.furthest_move(move) == (0,0):
       return
    
    if move_x != 0 and current_y != nearest_y:
      move_x = 0
      move_y = nearest_y - current_y
    
    elif move_y != 0 and current_x != nearest_x:
      move_y = 0
      move_x = nearest_x - current_x

    move = self.furthest_move((move_x, move_y))
    self.move_by(move)
      
  def _init_(self, maze, point):
    self.direction = 0
    Moveable._init_(self, maze, point,
                    garridoman_speed)
  
  def move_by(self, move):
    self.update_position(move)
    old_body = self.body
    self.draw()
    remove_from_screen(old_body)
  
  def update_position(self, move):
     (old_x, old_y) = self.place
     (move_x, move_y) = move
     (new_x, new_y) = (old_x+move_x, old_y+move_y)
    self.place = (new_x, new_y)

    if move_x > 0:
      self.direction = 0
    elif move_y > 0:
      self.direction = 90
    elif move_x < 0:
      self.direction = 180
    elif move_y < 0:
      self.direction = 270

  def move_by(self, move):
    self.update_position(move) 
    old_body = self.body
    self.draw()
    remove_from_screen(old_body)

    (x, y) = self.place
    nearest_point = self.nearest_grid_point()
     (nearest_x, nearest_y) = nearest_point
    distance = ( abs(x-nearest_x) +
                 abs(y-nearest_y))

    if distance < self.speed * 3/4:

      object = self.maze.object_at(nearest_point)
      object.eat(self)

Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

DaniWeb Python Marketplace
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

Thread Tools Display Modes

Similar Threads
Other Threads in the Python Forum

All times are GMT -4. The time now is 4:42 am.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC