通过python简单复现坦克大战游戏。
使用到的库函数:
import turtle
import math
import random
import time
游戏源码:
import turtle
import math
import random
import time
# 设置屏幕
screen = turtle.Screen()
screen.setup(800, 600)
screen.title("坦克游戏")
screen.bgcolor("lightgreen")
screen.tracer(0)
# 创建玩家坦克
tank = turtle.Turtle()
tank.shape("square")
tank.color("green")
tank.shapesize(stretch_wid=3, stretch_len=5)
tank.penup()
# 炮管
cannon = turtle.Turtle()
cannon.shape("triangle")
cannon.color("dark green")
cannon.shapesize(stretch_wid=0.5, stretch_len=2)
cannon.penup()
# 创建敌人坦克
enemy = turtle.Turtle()
enemy.shape("square")
enemy.color("red")
enemy.shapesize(stretch_wid=3, stretch_len=5)
enemy.penup()
enemy.goto(random.randint(-350, 350), random.randint(-250, 250))
# 子弹列表
player_bullets = []
enemy_bullets = []
# 分数
score = 0
score_display = turtle.Turtle()
score_display.hideturtle()
score_display.penup()
score_display.goto(-380, 260)
score_display.color("black")
# 移动函数
def move_forward():
move(10)
def move_backward():
move(-10)
def move(distance):
x = tank.xcor()
y = tank.ycor()
angle = tank.heading()
x += math.cos(math.radians(angle)) * distance
y += math.sin(math.radians(angle)) * distance
tank.goto(x, y)
update_cannon()
def turn_left():
tank.left(10)
update_cannon()
def turn_right():
tank.right(10)
update_cannon()
def update_cannon():
x = tank.xcor()
y = tank.ycor()
angle = tank.heading()
cannon.goto(x + math.cos(math.radians(angle)) * 30, y + math.sin(math.radians(angle)) * 30)
cannon.setheading(angle)
# 发射子弹
def fire():
fire_bullet(cannon, player_bullets)
def enemy_fire():
fire_bullet(enemy, enemy_bullets)
def fire_bullet(shooter, bullet_list):
bullet = turtle.Turtle()
bullet.shape("circle")
bullet.color("black")
bullet.shapesize(0.5)
bullet.penup()
bullet.speed(0)
bullet.goto(shooter.xcor(), shooter.ycor())
bullet.setheading(shooter.heading())
bullet_list.append(bullet)
# 更新子弹位置
def update_bullets():
update_bullet_group(player_bullets)
update_bullet_group(enemy_bullets)
def update_bullet_group(bullet_list):
for bullet in bullet_list:
bullet.forward(5)
if bullet.xcor() > 400 or bullet.xcor() < -400 or bullet.ycor() > 300 or bullet.ycor() < -300:
bullet.hideturtle()
bullet_list.remove(bullet)
elif bullet in player_bullets and bullet.distance(enemy) < 40:
bullet.hideturtle()
player_bullets.remove(bullet)
respawn_enemy()
update_score(1)
elif bullet in enemy_bullets and bullet.distance(tank) < 40:
bullet.hideturtle()
enemy_bullets.remove(bullet)
update_score(-1)
# 随机移动敌人
def move_enemy():
x = enemy.xcor() + random.randint(-5, 5)
y = enemy.ycor() + random.randint(-5, 5)
x = max(-350, min(350, x))
y = max(-250, min(250, y))
enemy.goto(x, y)
if random.random() < 0.02: # 2%的机会发射子弹
enemy_fire()
# 重生敌人
def respawn_enemy():
enemy.goto(random.randint(-350, 350), random.randint(-250, 250))
# 更新分数
def update_score(points):
global score
score += points
score_display.clear()
score_display.write(f"得分: {score}", font=("Arial", 16, "normal"))
# 键盘绑定
screen.listen()
screen.onkeypress(move_forward, "Up")
screen.onkeypress(move_backward, "Down")
screen.onkeypress(turn_left, "Left")
screen.onkeypress(turn_right, "Right")
screen.onkeypress(fire, "space")
# 初始化分数显示
update_score(0)
# 主游戏循环
while True:
update_bullets()
move_enemy()
screen.update()
time.sleep(0.01)
turtle.done()
运行效果:
虽然比较简单,但是涉及了很多基础元素,可以作为兴趣学习下,即拿即用哦。