Skip to content

Commit

Permalink
Wizualizacja Robot Game w symulatorze MC Pi Edition
Browse files Browse the repository at this point in the history
  • Loading branch information
xinulsw committed Jul 18, 2016
1 parent 26d081e commit 2744fac
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 9 deletions.
Binary file added docs/mcpi/img/mc07.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 30 additions & 4 deletions docs/mcpi/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ Do pliku :file:`mc.py` przed funkcją główną dodamy funkcję ``pokaz_gre()``:
:lineno-start: 77
:lines: 77-88

Po otworzeniu pliku z danymi za pomocą modułu *json* wczytujemy jego zawartość do listy: ``dane = json.load(plik)``.
Po otworzeniu pliku z danymi wczytujemy jego zawartość do listy za pomocą modułu *json*: ``dane = json.load(plik)``.
Następnie w pętli odczytujemy dane kolejnych rund i – na razie, poglądowo – drukujemy je w konsoli.
Aby przetestować kod, wpisz wywołanie funkcji ``pokaz_gre(5)`` zamiast ``polegry()`` w funkcji głównej.

Expand All @@ -368,17 +368,43 @@ którą dopisujemy w pliku :file:`mc.py` przed funkcją ``pokaz_gre()``:
.. literalinclude:: mc06.py
:linenos:
:lineno-start: 77
:lines: 77-90
:lines: 77-89

Funkcja na początku rysuje pole gry, następnie w pętli odczytujemy dane kolejnych robotów.
Na podstawie identyfikatora gracza określamy typ bloku reprezentujący robota, pobieramy jego
położenie i wreszcie umieszczamy na planszy: ``mc.setBlock(loc[0], y, loc[1], blok)``.
Aby przetestować kod, wywołanie funkcji ``pokaz_runde(r)`` umieszczamy w funkcji ``pokaz_gre()``
po instrukcji ``print(r)``.
po instrukcji ``print(r)``, którą można zakomentować.

.. figure:: img/mc06.png

[cdn]
Kolory i animacja
------------------

W trakcie starć w kolejnych rundach maleje siła robotów wskazywana przez właściwość *hp*.
Spróbujemy zróżnicować kolorystycznie typ bloków wykorzystywany do wyświetlania robotów.
Przed funkcją ``pokaz_runde()`` dopisujemy funkcję ``wybierz_blok()``:

.. raw:: html

<div class="code_no">Kod nr <script>var code_no = code_no || 1; document.write(code_no++);</script></div>

.. highlight:: python
.. literalinclude:: mc07.py
:linenos:
:lineno-start: 77
:lines: 77-85

Siła robotów (*hp*) przyjmuje wartości od 0 do 50, dzieląc tę wartość całkowicie przez 10,
otrzymamy liczby od 0 do 5, które posłużą nam jako indeksy wskazujące typ bloku służący
do wyświetlenia robota danego zawodnika. Dobór typów w tuplach jest oczywiście
czysto umowny.

Pozostaje jeszcze zastąpienie instrukcji warunkowej w funkcji ``pokaz_runde()`` wywołaniem
naszej funkcji: ``blok = wybierz_blok(robot['player_id'], robot['hp'])``. Przykładowy efekt
przedstawia się tak:

.. figure:: img/mc07.png

Materiały
=========
Expand Down
1 change: 1 addition & 0 deletions docs/mcpi/mc04.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ def polegry():
else:
mc.setBlock(x + i, y, z + j, block.AIR)


def main(args):
plac(0, 0, 0, 18)
# buduj()
Expand Down
2 changes: 1 addition & 1 deletion docs/mcpi/mc05.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def pokaz_gre(ile=100):
runda_nr = 0

for r in dane:
print "Runda ",runda_nr
print "Runda ", runda_nr
print(r)
runda_nr = runda_nr + 1
if runda_nr > ile:
Expand Down
7 changes: 3 additions & 4 deletions docs/mcpi/mc06.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ def polegry():

def pokaz_runde(runda):
from time import sleep
x = y = z = 0
polegry()
for robot in runda:
if robot['player_id']:
Expand All @@ -85,7 +84,7 @@ def pokaz_runde(runda):
blok = block.WOOL
loc = robot['location']
print robot['player_id'], blok, loc[0], loc[1]
mc.setBlock(loc[0], y, loc[1], blok)
mc.setBlock(loc[0], 0, loc[1], blok)
sleep(1)
print

Expand All @@ -97,8 +96,8 @@ def pokaz_gre(ile=100):
runda_nr = 0

for r in dane:
print "Runda ",runda_nr
print(r)
print "Runda ", runda_nr
# print(r)
pokaz_runde(r)
runda_nr = runda_nr + 1
if runda_nr > ile:
Expand Down
123 changes: 123 additions & 0 deletions docs/mcpi/mc07.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "Uruchamianie... Proszę czekać..."

# import modułów minecrafta
import local.minecraft as minecraft
import local.block as block

# ustawienie nazwy użytkownika i komputera
import os
os.environ["USERNAME"] = "Steve" # wpisz dowolną nazwę użytkownika
os.environ["COMPUTERNAME"] = "mykomp" # wpisz dowolną nazwę komputera

# utworzenie połaczenia z symulatorem
mc = minecraft.Minecraft.create("")

# wysłanie wiadomości na czat
mc.postToChat("Cześć! Tak działa MC chat!")


def plac(x, y, z, roz=10, gracz=False):
"""Funkcja wypełnia sześcienny obszar od podanej pozycji
powietrzem i opcjonalnie umieszcza gracza w środku.
Parametry: x, y, z - współrzędne pozycji początkowej,
roz - rozmiar wypełnianej przestrzeni,
blok - rodzaj bloku
gracz - czy umieścić gracza w środku
Wymaga: globalnych obiektów mc i block.
"""

kamien = block.STONE
powietrze = block.AIR

# kamienna podłoże
mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, kamien)
# czyszczenie
mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, powietrze)
# umieść gracza w środku
if gracz:
mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)


def buduj():
"""
Funkcja do testowania umieszczania bloków.
Wymaga: globalnych obiektów mc i block.
"""
for i in range(19):
mc.setBlock(0 + i, 0, 18, block.CACTUS)


def polegry():
obstacle = [(0,0),(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0),(9,0),
(10,0),(11,0),(12,0),(13,0),(14,0),(15,0),(16,0),(17,0),(18,0),(0,1),
(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(12,1),(13,1),(14,1),(15,1),
(16,1),(17,1),(18,1),(0,2),(1,2),(2,2),(3,2),(4,2),(14,2),(15,2),
(16,2),(17,2),(18,2),(0,3),(1,3),(2,3),(16,3),(17,3),(18,3),(0,4),
(1,4),(2,4),(16,4),(17,4),(18,4),(0,5),(1,5),(17,5),(18,5),(0,6),
(1,6),(17,6),(18,6),(0,7),(18,7),(0,8),(18,8),(0,9),(18,9),(0,10),
(18,10),(0,11),(18,11),(0,12),(1,12),(17,12),(18,12),(0,13),(1,13),
(17,13),(18,13),(0,14),(1,14),(2,14),(16,14),(17,14),(18,14),(0,15),
(1,15),(2,15),(16,15),(17,15),(18,15),(0,16),(1,16),(2,16),(3,16),
(4,16),(14,16),(15,16),(16,16),(17,16),(18,16),(0,17),(1,17),(2,17),
(3,17),(4,17),(5,17),(6,17),(12,17),(13,17),(14,17),(15,17),(16,17),
(17,17),(18,17),(0,18),(1,18),(2,18),(3,18),(4,18),(5,18),(6,18),
(7,18),(8,18),(9,18),(10,18),(11,18),(12,18),(13,18),(14,18),(15,18),
(16,18),(17,18),(18,18)]
x = y = z = 0
for i in range(19):
for j in range(19):
if (i, j) in obstacle:
mc.setBlock(x + i, y, z + j, block.GRASS)
else:
mc.setBlock(x + i, y, z + j, block.AIR)


def wybierz_blok(pid, hp):
player1_bloki = (block.GRAVEL, block.SANDSTONE, block.BRICK_BLOCK,
block.FARMLAND, block.OBSIDIAN, block.OBSIDIAN)
player2_bloki = (block.WOOL, block.LEAVES, block.CACTUS,
block.MELON, block.WOOD, block.WOOD)
if pid:
return player1_bloki[hp / 10]
else:
return player2_bloki[hp / 10]


def pokaz_runde(runda):
from time import sleep
polegry()
for robot in runda:
blok = wybierz_blok(robot['player_id'], robot['hp'])
loc = robot['location']
print robot['player_id'], blok, loc[0], loc[1]
mc.setBlock(loc[0], 0, loc[1], blok)
sleep(1)
print


def pokaz_gre(ile=100):
import json
plik = open("lastgame.log", "r")
dane = json.load(plik)
runda_nr = 0

for r in dane:
print "Runda ", runda_nr
# print(r)
pokaz_runde(r)
runda_nr = runda_nr + 1
if runda_nr > ile:
break


def main(args):
plac(0, 0, 0, 18)
# buduj()
pokaz_gre(80)
return 0

if __name__ == '__main__':
import sys
sys.exit(main(sys.argv))

0 comments on commit 2744fac

Please sign in to comment.