会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133764个问题

'''
Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接, 图片, HTML 页面,
甚至 CSS 样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者网
页浏览器来使用。比如 IDLE 就是 Text 组件构成的。
'''
import tkinter as tk
from tkinter import messagebox
import webbrowser

class Application(tk.Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.createWidget()
        self.pack()

    def createWidget(self):
        self.text = tk.Text(self, width=40, height=30, bg='white')
        self.text.insert(1.0, '李剑神使得一把好剑!')
        self.text.insert(3.2, '徐骁是人见人怕的北凉王!')
        self.text.pack(side='bottom')

        self.btn01 = tk.Button(self, text='插入文本', command=self.insertText)
        self.btn01.pack(side='left')
        self.btn02 = tk.Button(self, text='返回文本', command=self.returnText)
        self.btn02.pack(side='left')
        self.btn03 = tk.Button(self,text='插入图片',command=self.insertPhoto)
        self.btn03.pack(side='left')
        self.btn04 = tk.Button(self, text='插入组件', command=self.insertWidget)
        self.btn04.pack(side='left')
        self.btn05 = tk.Button(self, text='tag标记', command=self.insertTag)
        self.btn05.pack(side='left')
        self.btn06 = tk.Button(self,text='退出按钮',command=root.destroy)
        self.btn06.pack(side='bottom')
    def insertText(self):
        self.text.insert(2.0,'徐凤年')
        self.text.insert(tk.INSERT,'木马牛是把神剑!')
        self.text.insert(tk.END, '阿里巴巴四十大盗')
    def returnText(self):
        print('打印所有文本信息:{0}'.format(self.text.get(1.0,tk.END)))
    def insertPhoto(self):
        self.photo = tk.PhotoImage(file='image/aaa.gif')
        self.text.image_create(tk.END,image=self.photo)
    def insertWidget(self):
        self.btn07 = tk.Button(self.text,text='添加的按钮')
        self.text.window_create(tk.INSERT,window=self.btn07)
    def insertTag(self):
        self.text.delete(1.0,tk.END)
        self.text.insert(tk.INSERT, 'good study!如果还不会就去\nbaidu好好查一下吧!')
        self.text.tag_add('good',1.0,1.4)
        self.text.tag_config('good',background='red')
        self.text.tag_add('baidu',2.0,2.4)
        self.text.config('baidu',underline=True)
        self.text.tag_bind('baidu','<Button-1>',self.webBrower)

    def webBrower(self,event):
        webbrowser.open('http://www.baidu.com')
if __name__ == '__main__':
    root = tk.Tk()
    root.title('TEXT多行文本测试')
    root.geometry('500x500+500+200')
    app = Application(master=root)
    root.mainloop()

老师帮我看一下定位到这两句语句报错,但是我不知道是什么原因,参数也是正确的啊。
        self.text.tag_add('baidu',2.0,2.4)
        self.text.config('baidu',underline=True)


Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 2028楼
Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2029楼

老师为什么显示这种内容呢

'builtin_function_or_method' object has no attribute 'width'

image.png

这是报错信息

源码

pygame pg
time
random
screen_width=screen_height=bgcolor=pg.Color(,,)
rcolor=pg.Color(,,)
MainGame:
    window=my_tank=enemy_tankList=[]
    enemy_tankCount=myBulletList=[]
    __init__(self):
        startGame(self):
        pg.display.init()
        MainGame.window=pg.display.set_mode([screen_width,screen_height])
        MainGame.my_tank = Tank(, )
        self.creatEnemyTank()
        pg.display.set_caption()


        :
            time.sleep()
            MainGame.window.fill(bgcolor)
            self.getEvent()
            MainGame.window.blit(self.getTextSurface(%len(MainGame.enemy_tankList)),(,))
            MainGame.my_tank.displayTank()
            self.biltenemyTank()
            self.blitMyBullet()
            MainGame.my_tank.stop:
                MainGame.my_tank.move()
            pg.display.update()
creatEnemyTank(self):
        top=i range (MainGame.enemy_tankCount):
            left=random.randint(,)
            speed=random.randint(,)
            enemy=EnemyTank(left, top, speed)
            MainGame.enemy_tankList.append(enemy)
    biltenemyTank(self):
        enemyTank MainGame.enemy_tankList:
            enemyTank.displayTank()
            enemyTank.randMove()
    blitMyBullet(self):
        MyBullet MainGame.myBulletList:
            MyBullet.displayBullet()
            MyBullet.randMove()





    endGame(self):
        print()
        exit()
getTextSurface(self,text):
        pg.font.init()
        font=pg.font.SysFont(,)
        textSurface=font.render(text,,rcolor)
        textSurface
getEvent(self):
        eventList=pg.event.get()
        event eventList:
            event.type==pg.QUIT:
                self.endGame()
            event.type==pg.KEYDOWN:

                event.key==pg.K_LEFT:
                    MainGame.my_tank.stop = MainGame.my_tank.direction=print()
                event.key==pg.K_RIGHT:
                    MainGame.my_tank.stop = MainGame.my_tank.direction = print()
                event.key==pg.K_UP:
                    MainGame.my_tank.stop = MainGame.my_tank.direction = print()
                event.key==pg.K_DOWN:
                    MainGame.my_tank.stop = MainGame.my_tank.direction = print()
                event.key== pg.K_SPACE:
                    print()
                    MyBullet=Bullet(MainGame.my_tank)
                    MainGame.MyBulletList.append(MyBullet)
            event.type==pg.KEYUP:
                event.key==pg.K_UP event.key==pg.K_DOWN event.key==pg.K_LEFT event.key==pg.K_RIGHT:
                    MainGame.my_tank.stop=Tank:
__init__(self,left,top):
        self.images={:pg.image.load(),
                     : pg.image.load(),
                     : pg.image.load(),
                     : pg.image.load()}
        self.direction=self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.top=top
        self.rect.left=left
        self.speed=self.stop=move(self):
        self.direction==:
            self.rect.left > :
                self.rect.left-=self.speed
        self.direction==:

            self.rect.left+self.rect.height<screen_width:
                self.rect.left += self.speed
        self.direction==:

            self.rect.top>:
                self.rect.top -= self.speed
        self.direction==:

            self.rect.top+ self.rect.height < screen_height:
                self.rect.top += self.speed


    shot(self):
        displayTank(self):
        self.image=self.images[self.direction]
        MainGame.window.blit(self.image,self.rect)
MyTank(Tank):
    __init__(self):
        EnemyTank(Tank):
    __init__(self,left,top,speed):
        self.images={:pg.image.load(),
                     : pg.image.load(),
                     : pg.image.load(),
                     : pg.image.load()}
        self.direction=self.randDirection()
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.rect.left=left
        self.speed=speed
        self.flag=self.step=randDirection(self):
        num=random.randint(,)
        num==:
            num==:
            num==:
            num==:
            randMove(self):
        self.step<=:
            self.direction=self.randDirection()
            self.step=:
            self.move()
            self.step-=Bullet():
    __init__(self,tank):
        self.image=pg.image.load()
        self.direction=tank.direction
        self.rect=self.image.get_rect
        self.direction==:
            self.rect.left=int(tank.rect.left+tank.rect.width/-self.rect.width/)
            self.rect.top=int(tank.rect.top-self.rect.height)
        self.direction==:
            self.rect.left=int(tank.rect.left+tank.rect.width/-self.rect.width/)
            self.rect.top=int(tank.rect.top+tank.rect.height)
        self.direction==:
            self.rect.left=int(tank.rect.left-self.rect.width/-self.rect.width/)
            self.rect.top=int(tank.rect.top+tank.tect.width/-self.rect.width/)
        self.direction==:
            self.rect.left=int(tank.rect.left+tank.rect.width)
            self.rect.top=int(tank.rect.top+tank.tect.width/-self.rect.width/)
        self.speed=move(self):
        displayBullet(self):
        MainGame.window.blit(self.image,self.rect)
Wall():
    __init(self):
        displayWall(self):
        Explore():
    __init__(self):
        displayExplore(self):
        Music():
    __init__(self):
        play(self):
        __name__==:
    MainGame().startGame()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2030楼

老师请问为什么会出现这样

import pygame as pg
import time
import random
screen_width=700
screen_height=500
bgcolor=pg.Color(0,0,0)
rcolor=pg.Color(255,0,0)
class MainGame:
    window=None
    my_tank=None
    enemy_tankList=[]
    enemy_tankCount=5
    def __init__(self):
        pass
    #开始游戏
    def startGame(self):
        #加载主窗口
        #初始化窗口
        pg.display.init()
        #设置窗口的显示
        MainGame.window=pg.display.set_mode([screen_width,screen_height])
        #初始化我的坦克
        MainGame.my_tank = Tank(350, 250)
        #初始化敌方坦克
        self.createEnemyTank()   #!!!就是这个地方报错,说类里找不到这个函数
        #设置窗口的标题
        pg.display.set_caption("坦克大战1.02")


        while True:
            time.sleep(0.02)
            #窗口填充色
            MainGame.window.fill(bgcolor)
            #获取事件
            self.getEvent()
            #绘制文字
            MainGame.window.blit(self.getTextSurface("敌方剩余坦克数量%d"%6),(5,5))
            MainGame.my_tank.displayTank()
            #展示敌方坦克
            self.biltenemyTank()
            #使坦克移动
            if  not MainGame.my_tank.stop:
                MainGame.my_tank.move()
            pg.display.update()
#定义敌方坦克的方法
    def creatEnemyTank(self):
        top=100
        for i in range (MainGame.enemy_tankCount):
            left=random.randint(0,600)
            speed=random.randint(1,4)
            enemy=EnemyTank(left, top, speed)
            MainGame.enemy_tankList.append(enemy)
    #显示我方坦克
    #循环遍历敌方坦克列表,展示敌方坦克
    def biltenemyTank(self):
        for enemyTank in MainGame.enemy_tankList:
            enemyTank.displayTank()




    #结束游戏
    def endGame(self):
        print("谢谢使用")
        exit()
#左上角绘制
    def getTextSurface(self,text):
        #初始化字体
        pg.font.init()
        #获取字体对象
        font=pg.font.SysFont("kaiti",18)
        #绘制文字
        textSurface=font.render(text,True,rcolor)
        return textSurface
#获取事件
    def getEvent(self):
        #获取所有事件
        eventList=pg.event.get()
        #遍历事件
        for event in eventList:
            #判断按下是什么键
            if event.type==pg.QUIT:
                self.endGame()
            #键盘的按向 上下左右
            if event.type==pg.KEYDOWN:

                if event.key==pg.K_LEFT:
                    MainGame.my_tank.stop = False
                    MainGame.my_tank.direction="L"
                    #MainGame.my_tank.move()
                    print("xiangzuo")
                elif event.key==pg.K_RIGHT:
                    MainGame.my_tank.stop = False
                    MainGame.my_tank.direction = "R"
                    #MainGame.my_tank.move()
                    print("xiang you")
                elif event.key==pg.K_UP:
                    MainGame.my_tank.stop = False
                    MainGame.my_tank.direction = "U"
                    #MainGame.my_tank.move()
                    print("xiangshang")
                elif event.key==pg.K_DOWN:
                    MainGame.my_tank.stop = False
                    MainGame.my_tank.direction = "D"
                    #MainGame.my_tank.move()
                    print("xiang xia")
                elif event.key== pg.K_SPACE:
                    print("发射子弹")
            #松开方向键 让坦克停下
            if event.type==pg.KEYUP:
                if event.key==pg.K_UP or event.key==pg.K_DOWN or event.key==pg.K_LEFT or event.key==pg.K_RIGHT:
                    MainGame.my_tank.stop=True


class Tank:
#距离左边left,距离上边top,坦克的展示初始位置,距离左边和上边
    def __init__(self,left,top):
        #"保存加载的图片"
        self.images={"U":pg.image.load("p1tankU.gif"),
                     "D": pg.image.load("p1tankD.gif"),
                     "L": pg.image.load("p1tankL.gif"),
                     "R": pg.image.load("p1tankR.gif" )}
        self.direction="U"
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.top=top
        self.rect.left=left
        self.speed=1
        self.stop=True

    #移动
    def move(self):
        #判断方向
        if self.direction=="L":
            if self.rect.left > 0:
                self.rect.left-=self.speed
        elif self.direction=="R":

            if self.rect.left+self.rect.height<screen_width:
                self.rect.left += self.speed
        elif self.direction=="U":

            if self.rect.top>0:
                self.rect.top -= self.speed
        elif self.direction=="D":

            if self.rect.top+ self.rect.height < screen_height:
                self.rect.top += self.speed


    #射击
    def shot(self):
        pass
     #展示
    def displayTank(self):
        #获取展示的对象
        self.image=self.images[self.direction]
        MainGame.window.blit(self.image,self.rect)
#我方坦克
class MyTank(Tank):
    def __init__(self):
        pass


class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        self.images={"U":pg.image.load("enemy1U.gif"),
                     "D": pg.image.load("enemy1D.gif"),
                     "L": pg.image.load("enemy1L.gif"),
                     "R": pg.image.load("enemy1R.gif" )}
        self.direction=self.randDirection()
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.rect.left=left
        self.speed=speed
        self.flag=True

    def randDirection(self):
        num=rand.randint(1,4)
        if num==1:
            return "U"
        elif num==2:
            return "D"
        elif num==3:
            return "L"
        elif num==4:
            return "R"


class Bullte():
    def __init__(self):
        pass
    #移动
    def move(self):
        pass
    #zhanshi
    def displayBullet(self):
        pass
class Wall():
    def __init(self):
        pass
    #展示墙壁的方法
    def displayWall(self):
        pass

class Explore():
    def __init__(self):
        pass
        #展示爆炸的方法
    def displayExplore(self):
        pass
class Music():
    def __init__(self):
        pass
    #播放音乐的方法
    def play(self):
        pass

if __name__=='__main__':
    MainGame().startGame()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2031楼

代码:

"""测试一个grid布局"""

from tkinter import *
from tkinter import messagebox

class Application(Frame):
    """一个经典的GUI程序的类的写法"""
    def __init__(self, master=None):
        super().__init__(master)  # super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWidget()
    def createWidget(self):
        """创建计算器界面的组件"""
        btnText = (("MC","M+","M-","MR"),
                   ("C","±","÷","×"),
                   (7,8,9,"-"),
                   (4,5,6,"+"),
                   (1,2,3,"="),
                   (0,"."))
        Entry(self).grid(row=0, column=0, columnspan=4, pady=10)
        for rindex, r in enumerate(btnText):
            for cindex, c in enumerate(r):
                if c == "=":
                    Button(self, text=c, width=2)\
                        .grid(row=rindex + 1, column=cindex, rowspan=2, sticky=NSEW)
                elif c == "0":
                    Button(self, text=c, width=2)\
                        .grid(row=rindex + 1, column=cindex, columnspan=2, sticky=NSEW)
                elif c == ".":
                    Button(self, text=c, width=2)\
                        .grid(row=rindex + 1, column=cindex+1, sticky=NSEW)
                else:
                    Button(self, text=c, width=2)\
                    .grid(row=rindex+1, column=cindex, sticky=NSEW)

if __name__ =='__main__':
    root = Tk()
    root.geometry("190x235+1300-400")
    app = Application(master=root)
    root.mainloop()

疑问01.png

老师,我按照视频上的代码敲了一遍,为什么0没有跨列呢?

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 2033楼

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    """一个经典的GUI程序的类的写法"""

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidge()

    def createWidge(self):
        """创建组件"""
        self.label01 = Label(self, text="北京尚学堂", width=10,
                             height=2, bg="black", fg="white")
        self.label01.pack()
        self.label02 = Label(self, text="百战程序员", width=10,
                             height=2, bg="red", fg="blue", font=("仿宋", 30))
        self.label02.pack()
        self.label03 = Label(self, text="高淇老师\nPYTHON专家\n有一个儿子叫高晓曦",
                             font=("宋体", 40), relief="solid", borderwidth=3, justify="left")
        self.label03.pack()
        # 测试图片加载
        global photo
        photo = PhotoImage(file="imgs\logo.gif")    #如果在这里输入绝对路径,可以正常显示,但是相对路径不行。
        self.label04 = Label(image=photo)
        self.label04.pack()


if __name__ == '__main__':
    root = Tk()
    root.geometry("888x555+200+200")
    root.title("测试label")
    Application(master=root)
    root.mainloop()

image.png

老师帮忙看看是什么原因,说找不到文件。我用绝对路径是没有问题的。

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 2034楼

"""
    添加墙壁
    1 完善墙壁
    2 窗口添加墙壁,展示墙壁
"""
import time
import pygame
from pygame.sprite import Sprite
import random
SCREN_WIDTH = 700
SCREN_HEIGHT = 500
BG_COLOR = pygame.Color(0, 0, 0)
TEXT_COLOR = pygame.Color(255,0,0)
class BaseItem(Sprite):
    def __init__(self,color,width,height):
        pygame.sprite.Sprite.__init__(self)
class MainGame():
    window = None
    my_tank = None
    # 存储敌方坦克的列表
    enemyTankList = []
    # 定义敌方坦克的数量
    enemyTankCount = 5
    # 存储我方子弹的列表
    myBulletList = []
    # 存储敌方子弹的列表
    enemyBulletList = []
    #存储爆炸效果的列表
    explodeList = []
    # 存储墙壁的列表
    wallList = []
    def __init__(self):
        pass
    #开始游戏
    def startGame(self):
        # 加载主窗口
        # 初始化窗口
        pygame.display.init()
        # 设置窗口大小以及显示
        MainGame.window = pygame.display.set_mode([SCREN_WIDTH,SCREN_HEIGHT])
        # 创建我方坦克方法
        self.create_mytank()

        # 初始化敌方坦克,并将敌方坦克添加到列表中
        self.createEnemyTank()
        # 初始化墙壁
        self.createWall()
        #设置窗口标题
        pygame.display.set_caption("坦克大战1.03")
        while True:
            # 使移动慢一点,休眠一会
            # 使用坦克移动的速度慢一点
            time.sleep(0.01)
            # 给窗口设置填充色
            MainGame.window.fill(BG_COLOR)
            # 获取事件
            self.getEvent()
            # 绘制文字
            MainGame.window.blit(self.getTextSuface("敌方坦克剩余数量%d"%len(MainGame.enemyTankList)),(10,10))
            # 调用显示坦克的方法
            if MainGame.my_tank and MainGame.my_tank.live:
                MainGame.my_tank.displayTank()
            # 循环遍历敌方坦克列表,展示敌方坦克
            self.blitEnemyTank()
            # 循环遍历显示我方子弹
            self.biltBullet()
            # 循环遍历敌方子弹列表,展示敌方子弹
            self.blitEnemyBullet()
            # 循环遍历爆炸列表,展示爆炸效果
            self.blitExplode()
            # 循环遍历墙壁列表
            self.blitwall()
            # 调用坦克移动方法
            if MainGame.my_tank and MainGame.my_tank.live:
                MainGame.my_tank.displayTank()
            else:# 删除我方坦克
                del MainGame.my_tank
                MainGame.my_tank = None
            # 判断我方坦克是否存活
            # 如果坦克的开关开启,那么可以移动
            if MainGame.my_tank and MainGame.my_tank.live:
                if not MainGame.my_tank.stop:
                    MainGame.my_tank.move()

            pygame.display.update()


    # 初始化墙壁
    def createWall(self):
        for i in range(6):
            wall = Wall(i*130,220)
            # 将墙壁添加到列表
            MainGame.wallList.append(wall)
    # 初始化我方坦克
    def create_mytank(self):
        MainGame.my_tank = Tank(350, 100)
    # 初始化敌方坦克,并将敌方坦克添加到列表中
    def createEnemyTank(self):
        top = 100
        # 循环生成敌方坦克
        for i in range(MainGame.enemyTankCount):
            left = random.randint(0,600)
            speed = random.randint(1,2)
            enemy = EnemyTank(left,top,speed)
            MainGame.enemyTankList.append(enemy)

    # 循环遍历敌方坦克列表,展示敌方坦克
    def blitEnemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            # 判断当前坦克是否活着
            if enemyTank.live:
                enemyTank.displayTank()
                # enemyTank.move()
                enemyTank.randMove()
                # 发送子弹
                enemyBullet = enemyTank.shot()
                # 判断敌方子弹是否为空,不为空则添加
                if enemyBullet:
                    # 将敌方子弹存储到敌方子弹列表
                    MainGame.enemyBulletList.append(enemyBullet)
            else:#不活着,从敌方列表删除
                MainGame.enemyTankList.remove(enemyTank)
    # 循环遍历我方子弹存储列表
    def biltBullet(self):
        for myBullet in MainGame.myBulletList:
            # 判断当前的子弹是否是活着状态,如果是则进行显示及移动
            if myBullet.live:
                myBullet.displayBullet()
                # 调用子弹移动
                myBullet.move()
                # 调用是否检测碰撞的方法
                myBullet.myBullet_hit_enemyTank()
            # 如果不是活着状态,删除子弹
            else:
                MainGame.myBulletList.remove(myBullet)
    # 循环展示爆炸效果
    def blitExplode(self):
        for explode in MainGame.explodeList:
            # 判断是否活着
            if explode.live:
                # 展示
                explode.displayExplode()
            else:
                # 在爆炸列表中移除
                MainGame.explodeList.remove(explode)
    # 循环遍历敌方子弹存储列表,展示子弹
    def blitEnemyBullet(self):
        for enemyBullet in MainGame.enemyBulletList:
            if enemyBullet.live:
                enemyBullet.displayBullet()
                enemyBullet.move()
                # 调用敌方子弹与我方坦克碰撞的方法
                enemyBullet.enemyBullet_hit_mytank()
            else:
                MainGame.enemyBulletList.remove(enemyBullet)
    # 循环遍历墙壁
    def blitwall(self):
        for wall in MainGame.wallList:
            # 调用墙壁显示方法
            wall.displayWall()
    def endGame(self):
        print("谢谢使用,欢迎再次使用")
        exit()
        # 左上角文字的绘制
    def getTextSuface(self,text):
        # 初始化字体模块
        pygame.font.init()
        # # 查看所有的字体样式
        # print(pygame.font.get_fonts())
        # 获取字体Font对象
        font = pygame.font.SysFont("kaiti",18)
        # 绘制文本文字信息
        testSurface = font.render(text,True,TEXT_COLOR)
        return testSurface
    def getEvent(self):
        # 获取所有的事件
        eventList = pygame.event.get()
        # 遍历事件
        for event in eventList:
            if not MainGame.my_tank:
                if event.key == pygame.K_ESCAPE:
                    self.create_mytank()
            # 判断按下的键是关闭还是键盘按下
            # 按下的键盘是退出,关闭窗口
            if event.type == pygame.QUIT:
                # 退出
                self.endGame()
            # 键盘是按下
            if event.type ==pygame.KEYDOWN:
                if MainGame.my_tank and MainGame.my_tank.live:
                    # 判断按下的上下左右
                    if event.key == pygame.K_LEFT:
                        # 切换方向
                        MainGame.my_tank.direction = "L"
                        # 修改坦克开关状态
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print("按下左键,坦克向左移动")
                    elif event.key == pygame.K_RIGHT:
                        # 切换方向
                        MainGame.my_tank.direction = "R"
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print("按下右键,坦克向右移动")
                    elif event.key == pygame.K_UP:
                        # 切换方向
                        MainGame.my_tank.direction = "U"
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print("按下上键,坦克向上移动")
                    elif event.key == pygame.K_DOWN:
                        # 切换方向
                        MainGame.my_tank.direction = "D"
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print("按下下键,坦克向下移动")
                    elif event.key ==pygame.K_SPACE:
                        print("发射子弹")
                        # 如果我方子弹列表的大小 小于等于3的时候才可以创建
                        if len(MainGame.myBulletList) < 3:
                            myBullet = Bullet(MainGame.my_tank)
                            MainGame.myBulletList.append(myBullet)
                        # # 创建子弹 我方坦克发射的子弹
                        # myBullet = Bullet(MainGame.my_tank)
                        # MainGame.myBulletList.append(myBullet)
            # 松开方向键,坦克停止移动,修改坦克的开关状态
            if event.type ==pygame.KEYUP:
                # 判断释放的是哪一个键
                if event.key ==pygame.K_UP or event.key ==pygame.K_LEFT or event.key==pygame.K_DOWN or event.key ==pygame.K_RIGHT:
                    if MainGame.my_tank and MainGame.my_tank.live:
                        MainGame.my_tank.stop = True

class Tank(BaseItem):
    # 添加距离左边left,距离上边top
    def __init__(self,left,top):
        # 保存加载的图片
        self.images={
            "U": pygame.image.load("img/p1tankU.gif"),
            "D": pygame.image.load("img/p1tankD.gif"),
            "L": pygame.image.load("img/p1tankL.gif"),
            "R": pygame.image.load("img/p1tankR.gif")
            }

        # 方向
        self.direction = "U"
        # 根据当前的图片的方向获取图片
        self.image = self.images[self.direction]
        # 根据图片获取区域
        self.rect = self.image.get_rect()
        # 设置区域left和top
        self.rect.left = left
        self.rect.top = top
        # 速度决定移动的快慢
        self.speed= 2
        # 坦克移动的开关
        self.stop = True
        # 是否活着
        self.live = True
    # 移动
    def move(self):
        # 判断坦克的方向进行移动
        if self.direction =="L":
            if self.rect.left >0:
                self.rect.left -=self.speed
        elif self.direction == "U":
            if self.rect.top > 0:
                self.rect.top -=self.speed
        elif self.direction =="D":
            if self.rect.top+self.rect.height <SCREN_HEIGHT:
                self.rect.top +=self.speed
        elif self.direction =="R":
            if self.rect.left+self.rect.height<SCREN_WIDTH:
                self.rect.left += self.speed

    #射击
    def shot(self):
        return Bullet(self)
    #展示坦克
    def displayTank(self):
        # 获取展示的对象
        self.image = self.images[self.direction]
        # 调用bilt方法展示
        MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):
    def __init__(self):
        pass
class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        # 调用父类的初始化方法
        # super().__init__(left,top)
        super(EnemyTank,self).__init__(left,top)
        # 加载图片集
        self.images = {
            "U": pygame.image.load("img/enemy1U.gif"),
            "D": pygame.image.load("img/enemy1D.gif"),
            "L": pygame.image.load("img/enemy1L.gif"),
            "R": pygame.image.load("img/enemy1R.gif")
        }
        # 方向 随机生成敌方坦克的方向
        self.direction = self.randDirection()
        # 根据方向 获取图片
        self.image = self.images[self.direction]
        # 获取图片的区域
        self.rect = self.image.get_rect()
        # 对left和top进行赋值
        self.rect.left = left
        self.rect.top = top
        # 速度
        self.speed = speed
        # 移动开关
        self.flag = True
        # 新增步数的变量
        self.step = 30
    # 方向 随机生成敌方坦克数量
    def randDirection(self):
        num = random.randint(1,4)
        if num==1:
            return  "U"
        elif num==2:
            return  "D"
        elif num==3:
            return  "L"
        elif num==4:
            return  "R"
    # 敌方坦克随机移动的方法
    def randMove(self):
        if self.step<=0:
            # 修改方向
            self.direction = self.randDirection()
            #步数复位
            self.step = 30
            # self
        else:
            self.move()
            # 步数递减
            self.step-=1
    # 重写父类shot
    def shot(self):
        # 随机生成100以内的数
        num = random.randint(1,100)
        if num < 10:
            return Bullet(self)
class Bullet(BaseItem):
    def __init__(self,tank):
        # 加载子弹图片
        self.image = pygame.image.load("img/enemymissile.gif")
        # 坦克的方向决定 子弹的方向
        self.direction = tank.direction
        # 获取区域和位置
        self.rect = self.image.get_rect()
        # 子弹的速度
        self.speed = 6
        # 子弹是否碰到墙壁 如果碰到修改状态,子弹消失
        self.live = True
        # 子弹的位置 left和top
        # 子弹的left和top与方向有关
        if self.direction == 'U':
            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top - self.rect.height
        elif self.direction == 'D':
            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.height
        elif self.direction == 'L':
            self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
        elif self.direction == 'R':
            self.rect.left = tank.rect.left + tank.rect.width
            self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2

    # 移动
    def move(self):
        if self.direction =="U":
            if self.rect.top >0:
                self.rect.top -=self.speed
            else:
                # 修改状态
                self.live = False
        elif self.direction == "R":
            if self.rect.right+self.rect.width < SCREN_WIDTH:
                self.rect.right += self.speed
            else:
                # 修改状态
                self.live = False
        elif self.direction == "D":
            if self.rect.top + self.rect.height < SCREN_HEIGHT:
                self.rect.top += self.speed
            else:
                # 修改状态
                self.live = False
        elif self.direction == "L":
            if self.rect.left  > 0:
                self.rect.left -= self.speed
            else:
                # 修改状态
                self.live = False
    # 展示子弹
    def displayBullet(self):
        # 将图片surface加载到窗口
        MainGame.window.blit(self.image,self.rect)
    # 我方子弹与敌方坦克的碰撞
    def myBullet_hit_enemyTank(self):
        # 循环遍历敌方坦克列表,判断是否发生碰撞
        for enemyTank in MainGame.enemyTankList:
            if pygame.sprite.collide_rect(enemyTank,self):
                # 修改敌方坦克和我方子弹的状态
                    enemyTank.live = False
                    self.live = False
                    # 创建爆炸对象
                    explode = Explode(enemyTank)
                    # 将爆炸对象添加到爆炸列表中
                    MainGame.explodeList.append(explode)
    # 敌方子弹与我方坦克的碰撞
    def enemyBullet_hit_mytank(self):
        if MainGame.my_tank and MainGame.my_tank.live:

            if pygame.sprite.collide_rect(MainGame.my_tank,self):
                # 修改敌方坦克和我方子弹的状态
                MainGame.my_tank.live = False
                self.live = False
                # 创建爆炸对象
                explode = Explode(MainGame.my_tank)
                # 将爆炸对象添加到爆炸列表中
                MainGame.explodeList.append(explode)
class Wall():
    def __init__(self, left, top):
        # 加载墙壁图片
        self.image = pygame.image.load('img/steels.gif')
        # 获取墙壁的区域
        self.rect = self.image.get_rect()
        # 设置位置left、top
        self.rect.left = left
        self.rect.top = top
        # 是否存活
        self.live = True
        # 设置生命值
        self.hp = 3
    # 展示墙壁的方法
    def displayWall(self):
        MainGame.window.blit(self.image,self.rect)
class Explode():
    def __init__(self,tank):
        # 爆炸的位置由当前打中的坦克位置决定
        self.rect = tank.rect
        self.images = [
            pygame.image.load("img/blast0.gif"),
            pygame.image.load("img/blast1.gif"),
            pygame.image.load("img/blast2.gif"),
            pygame.image.load("img/blast3.gif"),
            pygame.image.load("img/blast4.gif")
        ]
        self.step = 0
        self.image=self.images[self.step]
        # 是否活着
        self.live = True

    #展示效果的方法
    def displayExplode(self):
        if self.step<len(self.images):
            # 根据索引获取爆炸对象
            self.image = self.images[self.step]
            self.step+=1
            # 添加到主窗口
            MainGame.window.blit(self.image,self.rect)
        else:
            # 修改状态
            self.live = False
            self.step = 0
class Music():
    def __init__(self):
        pass
    def plat(self):
        pass

if __name__=="__main__":
    MainGame().startGame()

    # MainGame().getTextSuface()

image.png

老师您好,找了很久实在找不到错误原因在哪,麻烦老师帮忙看下。




Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2035楼
Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2040楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637