使用python编写一个游戏实现玩家使用wasd键进行移动,j键进行射击子弹,k键跳跃,玩家需要对战人机,人机具有较强的能力,使用tkinter的图像界面进行编程
时间: 2024-06-09 21:08:02 浏览: 135
好的,我可以为您编写这个游戏。首先,我们需要导入必要的库:tkinter、random、time、PIL等。然后,我们可以创建一个窗口,并在窗口中创建一个画布,用于显示游戏场景。
接下来,我们可以创建一个玩家类和一个敌人类,分别用于表示玩家和敌人。玩家和敌人都有位置、速度、子弹等属性。玩家可以通过键盘按键控制移动、跳跃和射击,敌人则会自动移动和射击。
最后,我们可以通过一个循环来不断更新游戏场景,包括玩家和敌人的移动、射击等操作,以及碰撞检测等。当玩家或敌人的生命值减为0时,游戏结束。
下面是完整的代码实现:
```python
from tkinter import *
from PIL import Image, ImageTk
import random
import time
# 窗口大小
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
# 玩家大小
PLAYER_WIDTH = 50
PLAYER_HEIGHT = 50
# 敌人大小
ENEMY_WIDTH = 50
ENEMY_HEIGHT = 50
# 子弹大小
BULLET_WIDTH = 10
BULLET_HEIGHT = 10
# 玩家初始位置
PLAYER_INIT_X = 100
PLAYER_INIT_Y = WINDOW_HEIGHT - PLAYER_HEIGHT
# 敌人初始位置
ENEMY_INIT_X = WINDOW_WIDTH - ENEMY_WIDTH - 100
ENEMY_INIT_Y = WINDOW_HEIGHT - ENEMY_HEIGHT
# 玩家速度
PLAYER_SPEED_X = 10
PLAYER_SPEED_Y = 20
# 敌人速度
ENEMY_SPEED_X = 5
ENEMY_SPEED_Y = 10
# 子弹速度
BULLET_SPEED = 30
# 玩家生命值
PLAYER_HP = 100
# 敌人生命值
ENEMY_HP = 100
# 游戏结束标志
GAME_OVER = False
class Player:
def __init__(self, canvas):
self.canvas = canvas
self.image = Image.open("player.png").resize((PLAYER_WIDTH, PLAYER_HEIGHT))
self.photo = ImageTk.PhotoImage(self.image)
self.id = canvas.create_image(PLAYER_INIT_X, PLAYER_INIT_Y, image=self.photo, anchor=NW)
self.x = PLAYER_INIT_X
self.y = PLAYER_INIT_Y
self.vx = 0
self.vy = 0
self.hp = PLAYER_HP
self.bullets = []
def move_left(self):
self.vx = -PLAYER_SPEED_X
def move_right(self):
self.vx = PLAYER_SPEED_X
def jump(self):
if self.vy == 0:
self.vy = -PLAYER_SPEED_Y
def shoot(self):
x = self.x + PLAYER_WIDTH / 2 - BULLET_WIDTH / 2
y = self.y - BULLET_HEIGHT
bullet = Bullet(self.canvas, x, y, BULLET_SPEED)
self.bullets.append(bullet)
def update(self):
self.canvas.move(self.id, self.vx, self.vy)
self.x, self.y = self.canvas.coords(self.id)
if self.x <= 0 or self.x >= WINDOW_WIDTH - PLAYER_WIDTH:
self.vx = 0
if self.y >= WINDOW_HEIGHT - PLAYER_HEIGHT:
self.vy = 0
self.y = WINDOW_HEIGHT - PLAYER_HEIGHT
else:
self.vy += 2
for bullet in self.bullets:
bullet.update()
self.bullets = [bullet for bullet in self.bullets if bullet.is_alive()]
def is_alive(self):
return self.hp > 0
def hit(self):
self.hp -= 10
class Enemy:
def __init__(self, canvas):
self.canvas = canvas
self.image = Image.open("enemy.png").resize((ENEMY_WIDTH, ENEMY_HEIGHT))
self.photo = ImageTk.PhotoImage(self.image)
self.id = canvas.create_image(ENEMY_INIT_X, ENEMY_INIT_Y, image=self.photo, anchor=NW)
self.x = ENEMY_INIT_X
self.y = ENEMY_INIT_Y
self.vx = -ENEMY_SPEED_X
self.vy = 0
self.hp = ENEMY_HP
self.bullets = []
def update(self):
self.canvas.move(self.id, self.vx, self.vy)
self.x, self.y = self.canvas.coords(self.id)
if self.x <= 0 or self.x >= WINDOW_WIDTH - ENEMY_WIDTH:
self.vx = -self.vx
for bullet in self.bullets:
bullet.update()
self.bullets = [bullet for bullet in self.bullets if bullet.is_alive()]
def is_alive(self):
return self.hp > 0
def shoot(self):
x = self.x + ENEMY_WIDTH / 2 - BULLET_WIDTH / 2
y = self.y + ENEMY_HEIGHT
bullet = Bullet(self.canvas, x, y, -BULLET_SPEED)
self.bullets.append(bullet)
def hit(self):
self.hp -= 10
class Bullet:
def __init__(self, canvas, x, y, vy):
self.canvas = canvas
self.id = canvas.create_oval(x, y, x + BULLET_WIDTH, y + BULLET_HEIGHT, fill="red")
self.vy = vy
self.is_alive = True
def update(self):
self.canvas.move(self.id, 0, self.vy)
x, y, x2, y2 = self.canvas.coords(self.id)
if y <= 0 or y >= WINDOW_HEIGHT:
self.is_alive = False
def is_alive(self):
return self.is_alive
def on_key_press(event):
if event.char == "a":
player.move_left()
elif event.char == "d":
player.move_right()
elif event.char == "k":
player.jump()
elif event.char == "j":
player.shoot()
def on_key_release(event):
player.vx = 0
def detect_collision():
global GAME_OVER
if not player.is_alive():
GAME_OVER = True
canvas.create_text(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, text="Game Over", font=("Arial", 50))
if not enemy.is_alive():
GAME_OVER = True
canvas.create_text(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, text="You Win", font=("Arial", 50))
px, py = player.x, player.y
ex, ey = enemy.x, enemy.y
if px + PLAYER_WIDTH > ex and px < ex + ENEMY_WIDTH and py + PLAYER_HEIGHT > ey and py < ey + ENEMY_HEIGHT:
player.hit()
for bullet in player.bullets:
bx, by, bx2, by2 = canvas.coords(bullet.id)
if bx + BULLET_WIDTH > ex and bx < ex + ENEMY_WIDTH and by + BULLET_HEIGHT > ey and by < ey + ENEMY_HEIGHT:
bullet.is_alive = False
enemy.hit()
for bullet in enemy.bullets:
bx, by, bx2, by2 = canvas.coords(bullet.id)
if bx + BULLET_WIDTH > px and bx < px + PLAYER_WIDTH and by + BULLET_HEIGHT > py and by < py + PLAYER_HEIGHT:
bullet.is_alive = False
player.hit()
def game_loop():
if not GAME_OVER:
player.update()
enemy.update()
enemy.shoot()
detect_collision()
time.sleep(0.01)
root.after(10, game_loop)
root = Tk()
root.title("Game")
canvas = Canvas(root, width=WINDOW_WIDTH, height=WINDOW_HEIGHT)
canvas.pack()
player = Player(canvas)
enemy = Enemy(canvas)
root.bind("<KeyPress>", on_key_press)
root.bind("<KeyRelease>", on_key_release)
root.after(10, game_loop)
root.mainloop()
```
注意,在运行代码前,需要将player.png和enemy.png两个图片文件放在同一目录下。您可以通过更改上述参数来调整游戏的各种属性,例如窗口大小、玩家速度、敌人速度等。希望这个代码对您有所帮助!
阅读全文
相关推荐











