Перейти к содержанию

Robots

Материал из Викиверситета

В роботов играют на двумерной прямоугольной сетки. Цель игры состоит в том, чтобы уничтожить всех роботов. Игра пошаговая. Изначально персонаж попадает в случайно выбранное место. Каждый раз, когда персонаж двигается в любом направлении , каждый робот перемещается на один квадратный ближе к нему. Если персонаж сталкивается с роботом, он умирает, и игра заканчивается. Когда два робота сталкиваются, они оба умирают, оставляя за собой огонь. Попадание в него смертельно для роботов и для игрока.

Скрипт

[править]
from gasp import *          #  Импортируем из Gasp всё.
class Player: # Создаём класс игрока.
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.shape = Circle(( self.x*10+5,self.y*10+5 ), 5, filled=True,   color=color.RED)
    def move(self):
        update_when('key_pressed')
        key = keys_pressed()[0] # Ждём пока пользователь не нажмёт какую либо кнопку
        if key=="down" and self.y!=0 :
            self.y=self.y-1
        elif key=="up" and self.y!=47:
            self.y=self.y+1
        elif key=="left" and self.x!=0:
            self.x=self.x-1
        elif key=="right"and self.x!=63:
            self.x=self.x+1
        self.shape.move_to((self.x*10+5,self.y*10+5))
class Robot:#Создаём класс роботов
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.shape = Box((10*self.x, 10*self.y), 10, 10)
       
    def place(self,x,y):
        self.x=x
        self.y=y
               
    def move(self, x_pl,y_pl):
        if x_pl>self.x:
            self.x=self.x+1
        elif x_pl<self.x:
            self.x=self.x-1
        if y_pl<self.y:
            self.y=self.y-1
        elif y_pl>self.y:
            self.y=self.y+1
        self.shape.move_to((self.x*10,self.y*10))       
class Fire:
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.shape = Image("fire.bmp", (self.x*10- 5,self.y*10-5), 20, height=20)
                              
   
               
    
def stolk_dvuh(r_1,r_2):
    return r_1.x == r_2.x and r_1.y == r_2.y
def stolk_odnogo_i_vseh(r_1, vse):
    for y in vse:
        if stolk_dvuh(r_1,y):
            return True
    return False
begin_graphics()            # So that you can draw things
finished = False
x = Player(random_between(0, 63),random_between(0, 47))
robot_list=[]
for r in range(60):
    robot_list.append(Robot(random_between(0, 63),random_between(0, 47) ))
fire_list=[]    
mus_bomb = Sound("bomb.wav")
while not finished and robot_list != []:
    n_bomb=False
    x.move()
    finished = stolk_odnogo_i_vseh(x,robot_list) or             stolk_odnogo_i_vseh(x,fire_list)
   
    x.move()  # Player.move(x)
    finished = finished or stolk_odnogo_i_vseh(x,robot_list) or  stolk_odnogo_i_vseh(x,fire_list)
    for z in robot_list:
        z.move(x.x,x.y)

    robot_list_copy = robot_list[:]
    
    for z in robot_list_copy:
        vse_krome_z = robot_list_copy[:]
        vse_krome_z.remove(z)
        z_stolk = stolk_odnogo_i_vseh(z, vse_krome_z) or stolk_odnogo_i_vseh(z, fire_list)
        n_bomb = n_bomb or z_stolk
        if z_stolk:
            # udalyaem z
            remove_from_screen(z.shape)
            robot_list.remove(z)
            fire_list.append(Fire(z.x,z.y))
    if n_bomb:   
        play_sound(mus_bomb)

    finished = finished or stolk_odnogo_i_vseh(x,robot_list) or   stolk_odnogo_i_vseh(x,fire_list)
if robot_list==[]:
    Text("YOU WIN", (220,240), color=color.RED, size=70)
else:
    Text("YOU LOSE", (220,240), color=color.RED, size=70)
update_when('key_pressed')
end_graphics()              # Заканчиваем рисовать