Примитивная игра на Python

pixves

Новичок
Пользователь
Июн 12, 2020
4
0
1
Доброго времени суток друзья, ни как не могу написать код который бы не позволял игроку проходить сквозь стены!

Как можно это реализовать? Ниже примитивный скрипт игры для того что бы Вы смогли показать пример на нём!

Python:
from tkinter import *

tk = Tk()
tk.title('Game')
canvas = Canvas(tk, width = 500, height = 500, bg = 'white')
canvas.pack()
    
class Game:   
    def __init__(self):
        self.run = 1
        tk.bind('<Key>', self.keypress)
        self.list_keypress = []
        tk.protocol('WM_DELETE_WINDOW', self.exit)

    def key(self, code, function):
        self.list_keypress.append([code, function])

    def keypress(self, event):       
        key = event.keycode
        for content in self.list_keypress:
            k , f = content
            if key == k:
                f()
  
    def rect(self, position= (0,0), border = (0,0), fill = '', outline = '#000'):   
        x, y = position
        bx, by = border
        self.body = (x, y, bx+x, by+y)
        p = canvas.create_rectangle(self.body, outline = '#000', fill = fill)
        return p
    
    def start(self):
        while self.run:
            canvas.update()
            
    def exit(self):
        self.run = 0
        tk.destroy()



game = Game()

play = game.rect(position= (100, 100), border = (30,30), fill = '#fd658d')

box1 = game.rect(position= (150, 150), border = (50,50))
box2 = game.rect(position= (50, 150), border = (50,50))
box3 = game.rect(position= (150, 50), border = (50,50))

game.key(code =87 , function = lambda: canvas.move(play, 0, -15))
game.key(code = 83, function = lambda: canvas.move(play, 0, 15))
game.key(code = 65, function = lambda: canvas.move(play, -15, 0))
game.key(code = 68, function = lambda: canvas.move(play, 15, 0))

game.start()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
В вашем коде упор сделан на отрисовку элементов, а их положение и пересечения никак не отслеживаются (логики для этого нет).
Вот немного переделанный код:
Python:
from tkinter import *
import random


tk = Tk()
tk.title('Game')
canvas = Canvas(tk, width=500, height=500, bg='white')
canvas.pack()


class Game:
    def __init__(self, start=[100, 100], size=30):
        tk.bind('<Key>', self.keypress)
        self.size = size
        rect = [start[0], start[1], start[0] + self.size, start[1] + self.size]
        self.player_rect = canvas.create_rectangle(rect, outline='#000',
                                                   fill='red')
        self.player = start
        self.boxes = []

    def player_move(self, dx, dy):
        test_move = [self.player[0] + dx, self.player[1] + dy]
        if self.is_legal_move(test_move):
            self.player = test_move

        self.draw_player()

    def is_legal_move(self, move):
        flag = True
        player_box = [move[0], move[1], move[0] + self.size,
                      move[1] + self.size]
        for box in self.boxes:
            if self.intersects(player_box, box):
                flag = FALSE
                break

        return flag

    def intersects(self, one, two):
        if ((two[3] > one[3] > two[1] or two[3] > one[1] > two[1]) and
           (two[2] > one[2] > two[0] or two[2] > one[0] > two[0])):
            return True

        return False

    def draw_player(self):
        x, y = self.player
        canvas.delete(self.player_rect)
        self.player_rect = canvas.create_rectangle([x, y, x + self.size,
                                                    y + self.size],
                                                    outline='#000', fill='red')

    def keypress(self, event):
        d = {
            87: lambda: self.player_move(0, -15),
            83: lambda: self.player_move(0, 15),
            65: lambda: self.player_move(-15, 0),
            68: lambda: self.player_move(15, 0)
        }
        if d.get(event.keycode):
            d.get(event.keycode)()

    def rect(self, position=(0, 0), border=(0, 0), fill='', outline='#000'):
        x, y = position
        bx, by = border
        body = (x, y, bx + x, by + y)
        p = canvas.create_rectangle(body, outline='#000', fill=fill)
        self.boxes.append(body)      


game = Game()

for i in range(10):
    game.rect(position=(random.randint(0, 500), random.randint(0, 500)),
              border=(random.randint(10, 100), random.randint(10, 100)))

tk.mainloop()
 

pixves

Новичок
Пользователь
Июн 12, 2020
4
0
1
В вашем коде упор сделан на отрисовку элементов, а их положение и пересечения никак не отслеживаются (логики для этого нет).
Вот немного переделанный код:
Python:
from tkinter import *
import random


tk = Tk()
tk.title('Game')
canvas = Canvas(tk, width=500, height=500, bg='white')
canvas.pack()


class Game:
    def __init__(self, start=[100, 100], size=30):
        tk.bind('<Key>', self.keypress)
        self.size = size
        rect = [start[0], start[1], start[0] + self.size, start[1] + self.size]
        self.player_rect = canvas.create_rectangle(rect, outline='#000',
                                                   fill='red')
        self.player = start
        self.boxes = []

    def player_move(self, dx, dy):
        test_move = [self.player[0] + dx, self.player[1] + dy]
        if self.is_legal_move(test_move):
            self.player = test_move

        self.draw_player()

    def is_legal_move(self, move):
        flag = True
        player_box = [move[0], move[1], move[0] + self.size,
                      move[1] + self.size]
        for box in self.boxes:
            if self.intersects(player_box, box):
                flag = FALSE
                break

        return flag

    def intersects(self, one, two):
        if ((two[3] > one[3] > two[1] or two[3] > one[1] > two[1]) and
           (two[2] > one[2] > two[0] or two[2] > one[0] > two[0])):
            return True

        return False

    def draw_player(self):
        x, y = self.player
        canvas.delete(self.player_rect)
        self.player_rect = canvas.create_rectangle([x, y, x + self.size,
                                                    y + self.size],
                                                    outline='#000', fill='red')

    def keypress(self, event):
        d = {
            87: lambda: self.player_move(0, -15),
            83: lambda: self.player_move(0, 15),
            65: lambda: self.player_move(-15, 0),
            68: lambda: self.player_move(15, 0)
        }
        if d.get(event.keycode):
            d.get(event.keycode)()

    def rect(self, position=(0, 0), border=(0, 0), fill='', outline='#000'):
        x, y = position
        bx, by = border
        body = (x, y, bx + x, by + y)
        p = canvas.create_rectangle(body, outline='#000', fill=fill)
        self.boxes.append(body)     


game = Game()

for i in range(10):
    game.rect(position=(random.randint(0, 500), random.randint(0, 500)),
              border=(random.randint(10, 100), random.randint(10, 100)))

tk.mainloop()
Извините но Ваш код работает неправильно, игрок сталкивается с кубами не прикасаясь к ним с разницей в 15-20 пикселей это на глаз, и с разными кубами разная дистанция!
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Извините но Ваш код работает неправильно, игрок сталкивается с кубами не прикасаясь к ним с разницей в 15-20 пикселей это на глаз, и с разными кубами разная дистанция!
Что значит код работает не правильно? Нужно было чтобы игрок не проходил через стены - я написал вам пример реализации.
Если нужно чтобы он упирался в стену - это уже довольно просто реализовать по аналогии (основная логика в моём примере есть). Самый простой вариант - уменьшить скорость передвижения до 1 пикселя: self.player_move(0, 1), но можно и другими способами.
 

Форум IT Специалистов