<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=LOR-contest%2FPython</id>
	<title>LOR-contest/Python - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=LOR-contest%2FPython"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Python&amp;action=history"/>
	<updated>2026-10-12T23:41:19Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Python&amp;diff=109&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Python&amp;diff=109&amp;oldid=prev"/>
		<updated>2023-02-27T18:39:15Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:39, 27 февраля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Python&amp;diff=108&amp;oldid=prev</id>
		<title>lor&gt;Cetjs2 в 19:57, 1 февраля 2018</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Python&amp;diff=108&amp;oldid=prev"/>
		<updated>2018-02-01T19:57:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Так же, как и для [[LOR-contest/Ocaml|Ocaml]], программа состоит из четырех файлов -- advworld.py, advserver.py, hclient.py, roboclient.py.&lt;br /&gt;
&lt;br /&gt;
===[advworld.py]===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from copy import deepcopy&lt;br /&gt;
&lt;br /&gt;
class World:&lt;br /&gt;
    def __init__(self, world_file):&lt;br /&gt;
        self.map = []&lt;br /&gt;
        self.items = []&lt;br /&gt;
        &lt;br /&gt;
        f = open(world_file)&lt;br /&gt;
        &lt;br /&gt;
        row = 0&lt;br /&gt;
        while True:&lt;br /&gt;
            l = f.readline().rstrip()&lt;br /&gt;
            &lt;br /&gt;
            if l == '':&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            map_line = str(l).replace('$', ' ').replace('.', ' ')&lt;br /&gt;
            self.map.append(list(map_line))&lt;br /&gt;
            &lt;br /&gt;
            for col in xrange(len(l)):&lt;br /&gt;
                if l[col] == '$':&lt;br /&gt;
                    self.items.append((row, col))&lt;br /&gt;
                if l[col] == '.':&lt;br /&gt;
                    self.entry = (row, col)&lt;br /&gt;
            &lt;br /&gt;
            row += 1&lt;br /&gt;
        &lt;br /&gt;
        self.height = len(self.map)&lt;br /&gt;
        self.width = max(len(r) for r in self.map)&lt;br /&gt;
        self.hands_empty = True&lt;br /&gt;
        self.position = self.entry&lt;br /&gt;
        &lt;br /&gt;
    def gameWon(self):&lt;br /&gt;
        ok = True&lt;br /&gt;
        for item in self.items:&lt;br /&gt;
            if item != self.entry:&lt;br /&gt;
                ok = False&lt;br /&gt;
                break&lt;br /&gt;
        return ok and self.hands_empty&lt;br /&gt;
    &lt;br /&gt;
    def move(self, dx, dy):&lt;br /&gt;
        new_col = self.position[1] + dx&lt;br /&gt;
        new_row = self.position[0] + dy&lt;br /&gt;
        &lt;br /&gt;
        try:&lt;br /&gt;
            new_place = self.map[new_row][new_col]&lt;br /&gt;
            if new_place == ' ':&lt;br /&gt;
                self.position = (new_row, new_col)&lt;br /&gt;
        except IndexError:&lt;br /&gt;
            pass&lt;br /&gt;
            &lt;br /&gt;
    def action_north(self):&lt;br /&gt;
        self.move(0, -1)&lt;br /&gt;
    &lt;br /&gt;
    def action_south(self):&lt;br /&gt;
        self.move(0, 1)&lt;br /&gt;
    &lt;br /&gt;
    def action_east(self):&lt;br /&gt;
        self.move(1, 0)&lt;br /&gt;
    &lt;br /&gt;
    def action_west(self):&lt;br /&gt;
        self.move(-1, 0)&lt;br /&gt;
    &lt;br /&gt;
    def action_pickup(self):&lt;br /&gt;
        if self.position in self.items:&lt;br /&gt;
            self.items.remove(self.position)&lt;br /&gt;
        self.hands_empty = False&lt;br /&gt;
    &lt;br /&gt;
    def action_drop(self):&lt;br /&gt;
        if not self.hands_empty:&lt;br /&gt;
            self.hands_empty = True&lt;br /&gt;
            self.items.append(self.position)&lt;br /&gt;
    &lt;br /&gt;
    def performActions(self, actions):&lt;br /&gt;
        states = []&lt;br /&gt;
        for action in actions:&lt;br /&gt;
            try:&lt;br /&gt;
                getattr(self, 'action_'+action)()&lt;br /&gt;
                states.append(deepcopy(self))&lt;br /&gt;
            except KeyError:&lt;br /&gt;
                pass&lt;br /&gt;
        return states&lt;br /&gt;
    &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s = []&lt;br /&gt;
        &lt;br /&gt;
        for row in xrange(self.height):&lt;br /&gt;
            line = ''&lt;br /&gt;
            for col in xrange(self.width):        &lt;br /&gt;
                pos = (row, col)&lt;br /&gt;
                try:&lt;br /&gt;
                    char = self.map[row][col]&lt;br /&gt;
                &lt;br /&gt;
                    if pos == self.position:&lt;br /&gt;
                        char = '@'&lt;br /&gt;
                    elif pos == self.entry:&lt;br /&gt;
                        char = '.'&lt;br /&gt;
                    elif pos in self.items:&lt;br /&gt;
                        char = '$'&lt;br /&gt;
                    line += char&lt;br /&gt;
                except IndexError:&lt;br /&gt;
                    pass&lt;br /&gt;
            s.append(line)&lt;br /&gt;
            &lt;br /&gt;
        if self.gameWon():&lt;br /&gt;
            s.append('You won!')&lt;br /&gt;
        else:&lt;br /&gt;
            s.append('Game is in progress')&lt;br /&gt;
        &lt;br /&gt;
        if self.hands_empty:&lt;br /&gt;
            s.append('Your hands are empty')&lt;br /&gt;
        else:&lt;br /&gt;
            s.append('You carry an item')&lt;br /&gt;
        &lt;br /&gt;
        s.append('Here lie(s) %d item(s)' % (self.items.count(self.position)))&lt;br /&gt;
        &lt;br /&gt;
        return '\n'.join(s)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[advserver.py]===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sys import argv&lt;br /&gt;
from  Pyro.core import Daemon, initServer, ObjBase&lt;br /&gt;
from advworld import World&lt;br /&gt;
&lt;br /&gt;
class Server(ObjBase):&lt;br /&gt;
    def init(self, fname):&lt;br /&gt;
        self.world = World(fname)&lt;br /&gt;
    &lt;br /&gt;
    def read_world(self):&lt;br /&gt;
        return self.world&lt;br /&gt;
    &lt;br /&gt;
    def perform_actions(self, actions):&lt;br /&gt;
        return self.world.performActions(actions)&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    server = Server()&lt;br /&gt;
    server.init(argv[1])&lt;br /&gt;
    &lt;br /&gt;
    initServer()&lt;br /&gt;
    daemon = Daemon(port=int(argv[2]))&lt;br /&gt;
    daemon.connect(server, 'adventure_server')&lt;br /&gt;
    daemon.requestLoop()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[hclient.py]===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sys import stdin, stdout, argv&lt;br /&gt;
import Pyro.core&lt;br /&gt;
from roboclient import Robot&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    server = Pyro.core.getProxyForURI(&lt;br /&gt;
        'PYROLOC://%s:%s/adventure_server' % (argv[1], argv[2]))&lt;br /&gt;
    &lt;br /&gt;
    print server.read_world()    &lt;br /&gt;
    while True:&lt;br /&gt;
        stdout.write('&amp;gt; ')&lt;br /&gt;
        commands = stdin.readline().strip().lower().split()&lt;br /&gt;
        &lt;br /&gt;
        for cmd in commands:&lt;br /&gt;
            if cmd == 'autocollect':&lt;br /&gt;
                robot = Robot(server)&lt;br /&gt;
                robot.collect(server.read_world().position)&lt;br /&gt;
            else:&lt;br /&gt;
                print server.perform_actions([cmd])[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[roboclient.py]===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from sys import argv&lt;br /&gt;
from copy import deepcopy&lt;br /&gt;
from time import sleep&lt;br /&gt;
from Pyro.core import getProxyForURI&lt;br /&gt;
&lt;br /&gt;
class RoutingError(Exception):&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
class Robot:&lt;br /&gt;
    def __init__(self, server):&lt;br /&gt;
        self.server = server&lt;br /&gt;
        &lt;br /&gt;
    def findPath(self, world, target_position):&lt;br /&gt;
        map = deepcopy(world.map)&lt;br /&gt;
        map[world.position[0]][world.position[1]] = [world.position]&lt;br /&gt;
        &lt;br /&gt;
        def propagate(pos):&lt;br /&gt;
            deltas = [(0, 1), (0, -1), (1, 0), (-1, 0)]&lt;br /&gt;
            new_positions = []&lt;br /&gt;
            current_path = map[pos[0]][pos[1]]&lt;br /&gt;
            &lt;br /&gt;
            for d in deltas:&lt;br /&gt;
                new_pos = (pos[0] + d[0], pos[1] + d[1])&lt;br /&gt;
                new_path = list(current_path) + [new_pos]&lt;br /&gt;
                &lt;br /&gt;
                try:&lt;br /&gt;
                    location = map[new_pos[0]][new_pos[1]]&lt;br /&gt;
                except IndexError:&lt;br /&gt;
                    location = '#'&lt;br /&gt;
                &lt;br /&gt;
                if location != '#':&lt;br /&gt;
                    if location == ' ' or (len(location) &amp;gt; len(new_path)):&lt;br /&gt;
                        map[new_pos[0]][new_pos[1]] = new_path&lt;br /&gt;
                        new_positions.append(new_pos)&lt;br /&gt;
            return list(set(new_positions))&lt;br /&gt;
        &lt;br /&gt;
        positions = [world.position]&lt;br /&gt;
            &lt;br /&gt;
        while True:&lt;br /&gt;
            new_positions = []&lt;br /&gt;
            for pos in positions:&lt;br /&gt;
                new_positions += propagate(pos)&lt;br /&gt;
            positions = new_positions&lt;br /&gt;
            &lt;br /&gt;
            if not positions:&lt;br /&gt;
                raise RoutingError()&lt;br /&gt;
            &lt;br /&gt;
            path = map[target_position[0]][target_position[1]]&lt;br /&gt;
            if isinstance(path, list):&lt;br /&gt;
                break&lt;br /&gt;
        return path&lt;br /&gt;
    &lt;br /&gt;
    def moveTo(self, position):&lt;br /&gt;
        world = self.server.read_world()&lt;br /&gt;
        path = self.findPath(world, position)[1:]&lt;br /&gt;
        return [self.stepTo(pos) for pos in path]&lt;br /&gt;
    &lt;br /&gt;
    def stepTo(self, pos):&lt;br /&gt;
        world = self.server.read_world()&lt;br /&gt;
        &lt;br /&gt;
        dr = pos[0] - world.position[0]&lt;br /&gt;
        dc = pos[1] - world.position[1]&lt;br /&gt;
        &lt;br /&gt;
        directions = {&lt;br /&gt;
            (0, -1): 'west',&lt;br /&gt;
            (0, 1): 'east',&lt;br /&gt;
            (1, 0): 'south',&lt;br /&gt;
            (-1, 0): 'north'}&lt;br /&gt;
        &lt;br /&gt;
        action = directions.get((dr, dc), None)&lt;br /&gt;
        if action is None:&lt;br /&gt;
            raise RoutingError()&lt;br /&gt;
        return self.performAction(action)&lt;br /&gt;
    &lt;br /&gt;
    def performAction(self, action):&lt;br /&gt;
        print self.server.read_world()&lt;br /&gt;
        print 'Robot action:', action&lt;br /&gt;
        sleep(1)&lt;br /&gt;
        self.server.perform_actions([action])&lt;br /&gt;
    &lt;br /&gt;
    def collect(self, position):&lt;br /&gt;
        while True:&lt;br /&gt;
            world = self.server.read_world()&lt;br /&gt;
            items = [i for i in world.items if i != position]&lt;br /&gt;
            &lt;br /&gt;
            if not items:&lt;br /&gt;
                break&lt;br /&gt;
            &lt;br /&gt;
            self.moveTo(items[0])&lt;br /&gt;
            self.performAction('pickup')&lt;br /&gt;
            self.moveTo(position)&lt;br /&gt;
            self.performAction('drop')&lt;br /&gt;
        print world&lt;br /&gt;
    &lt;br /&gt;
    def play(self):&lt;br /&gt;
        self.collect(self.server.read_world().entry)&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    server = getProxyForURI(&lt;br /&gt;
        'PYROLOC://%s:%s/adventure_server' % (argv[1], argv[2]))&lt;br /&gt;
    Robot(server).play()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LOR-contest]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>