会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133794个问题
JAVA 全系列/第二十一阶段:租房网(Spring Cloud最新架构)/Livegoods第一天 31412楼
JAVA 全系列/第六阶段:项目管理与SSM框架/RBAC实战 31413楼


test14_celery_study.7z

(django_env) E:\百战卓越程序员培训之Python\第十阶段Python_Django2框架\个人练习\章节2个人练习\test14_celery_study>flower -A test14_celery_study --port=5555

[I 200710 12:47:12 command:138] Visit me at http://localhost:5555

[I 200710 12:47:12 command:145] Broker: redis://127.0.0.1:6379/0

[I 200710 12:47:12 command:146] Registered tasks:

    ['celery.accumulate',

     'celery.backend_cleanup',

     'celery.chain',

     'celery.chord',

     'celery.chord_unlock',

     'celery.chunks',

     'celery.group',

     'celery.map',

     'celery.starmap',

     'celery_app.tasks.MyHookTask',

     'celery_app.tasks.add',

     'celery_app.tasks.first_group',

     'celery_app.tasks.mul',

     'celery_app.tasks.xsum']

[I 200710 12:47:12 mixins:229] Connected to redis://127.0.0.1:6379/0

flower   -> flower:0.9.5 tornado:6.0.4 humanize:2.5.0

software -> celery:4.4.6 (cliffs) kombu:4.6.11 py:3.8.3

            billiard:3.6.3.0 redis:3.5.3

platform -> system:Windows arch:32bit, WindowsPE

            kernel version:10 imp:CPython

loader   -> celery.loaders.app.AppLoader

settings -> transport:redis results:redis://127.0.0.1:6379/0


ABSOLUTE_URL_OVERRIDES: {

 }

ADMINS: []

ALLOWED_HOSTS: []

APPEND_SLASH: True

AUTHENTICATION_BACKENDS: ['django.contrib.auth.backends.ModelBackend']

AUTH_PASSWORD_VALIDATORS: '********'

AUTH_USER_MODEL: 'auth.User'

BASE_DIR: 'E:\\百战卓越程序员培训之Python\\第十阶段Python_Django2框架\\个人练习\\章节2个人练习\\test14_celery_study'

BROKER_URL: 'redis://127.0.0.1:6379/0'

CACHES: {

 'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}

CACHE_MIDDLEWARE_ALIAS: 'default'

CACHE_MIDDLEWARE_KEY_PREFIX: '********'

CACHE_MIDDLEWARE_SECONDS: 600

CELERYBEAT_SCHEDULE: {

    'mul_every_30_seconds': {   'args': (14, 5),

                                'schedule': 5,

                                'task': 'celery_app.tasks.mul'}}

CELERY_RESULT_BACKEND: 'redis://127.0.0.1:6379/0'

CELERY_RESULT_SERIALIZER: 'json'

CELERY_TASK_RESULT_EXPIRES: 86400

CELERY_TIMAZONE: 'Asia/Shanghai'

CSRF_COOKIE_AGE: 31449600

CSRF_COOKIE_DOMAIN: None

CSRF_COOKIE_HTTPONLY: False

CSRF_COOKIE_NAME: 'csrftoken'

CSRF_COOKIE_PATH: '/'

CSRF_COOKIE_SAMESITE: 'Lax'

CSRF_COOKIE_SECURE: False

CSRF_FAILURE_VIEW: 'django.views.csrf.csrf_failure'

CSRF_HEADER_NAME: 'HTTP_X_CSRFTOKEN'

CSRF_TRUSTED_ORIGINS: []

CSRF_USE_SESSIONS: False

DATABASES: {

    'default': {   'ATOMIC_REQUESTS': False,

                   'AUTOCOMMIT': True,

                   'CONN_MAX_AGE': 0,

                   'ENGINE': 'django.db.backends.sqlite3',

                   'HOST': '',

                   'NAME': 'E:\\百战卓越程序员培训之Python\\第十阶段Python_Django2框架\\个人练习\\章节2个人练习\\test14_celery_study\\db.sqlite3',

                   'OPTIONS': {},

                   'PASSWORD': '********',

                   'PORT': '',

                   'TEST': {   'CHARSET': None,

                               'COLLATION': None,

                               'MIRROR': None,

                               'NAME': None},

                   'TIME_ZONE': None,

                   'USER': ''}}

DATABASE_ROUTERS: '********'

DATA_UPLOAD_MAX_MEMORY_SIZE: 2621440

DATA_UPLOAD_MAX_NUMBER_FIELDS: 1000

DATETIME_FORMAT: 'N j, Y, P'

DATETIME_INPUT_FORMATS: ['%Y-%m-%d %H:%M:%S',

 '%Y-%m-%d %H:%M:%S.%f',

 '%Y-%m-%d %H:%M',

 '%Y-%m-%d',

 '%m/%d/%Y %H:%M:%S',

 '%m/%d/%Y %H:%M:%S.%f',

 '%m/%d/%Y %H:%M',

 '%m/%d/%Y',

 '%m/%d/%y %H:%M:%S',

 '%m/%d/%y %H:%M:%S.%f',

 '%m/%d/%y %H:%M',

 '%m/%d/%y']

DATE_FORMAT: 'N j, Y'

DATE_INPUT_FORMATS: ['%Y-%m-%d',

 '%m/%d/%Y',

 '%m/%d/%y',

 '%b %d %Y',

 '%b %d, %Y',

 '%d %b %Y',

 '%d %b, %Y',

 '%B %d %Y',

 '%B %d, %Y',

 '%d %B %Y',

 '%d %B, %Y']

DEBUG: True

DEBUG_PROPAGATE_EXCEPTIONS: False

DECIMAL_SEPARATOR: '.'

DEFAULT_CHARSET: 'utf-8'

DEFAULT_EXCEPTION_REPORTER_FILTER: 'django.views.debug.SafeExceptionReporterFilter'

DEFAULT_FILE_STORAGE: 'django.core.files.storage.FileSystemStorage'

DEFAULT_FROM_EMAIL: 'webmaster@localhost'

DEFAULT_INDEX_TABLESPACE: ''

DEFAULT_TABLESPACE: ''

DISALLOWED_USER_AGENTS: []

EMAIL_BACKEND: 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_HOST: 'localhost'

EMAIL_HOST_PASSWORD: '********'

EMAIL_HOST_USER: ''

EMAIL_PORT: 25

EMAIL_SSL_CERTFILE: None

EMAIL_SSL_KEYFILE: '********'

EMAIL_SUBJECT_PREFIX: '[Django] '

EMAIL_TIMEOUT: None

EMAIL_USE_LOCALTIME: False

EMAIL_USE_SSL: False

EMAIL_USE_TLS: False

FILE_CHARSET: 'utf-8'

FILE_UPLOAD_DIRECTORY_PERMISSIONS: None

FILE_UPLOAD_HANDLERS: ['django.core.files.uploadhandler.MemoryFileUploadHandler',

 'django.core.files.uploadhandler.TemporaryFileUploadHandler']

FILE_UPLOAD_MAX_MEMORY_SIZE: 2621440

FILE_UPLOAD_PERMISSIONS: 420

FILE_UPLOAD_TEMP_DIR: None

FIRST_DAY_OF_WEEK: 0

FIXTURE_DIRS: []

FORCE_SCRIPT_NAME: None

FORMAT_MODULE_PATH: None

FORM_RENDERER: 'django.forms.renderers.DjangoTemplates'

IGNORABLE_404_URLS: []

INSTALLED_APPS: ['django.contrib.admin',

 'django.contrib.auth',

 'django.contrib.contenttypes',

 'django.contrib.sessions',

 'django.contrib.messages',

 'django.contrib.staticfiles',

 'celery_app.apps.CeleryAppConfig']

INTERNAL_IPS: []

LANGUAGES: [('af', 'Afrikaans'),

 ('ar', 'Arabic'),

 ('ast', 'Asturian'),

 ('az', 'Azerbaijani'),

 ('bg', 'Bulgarian'),

 ('be', 'Belarusian'),

 ('bn', 'Bengali'),

 ('br', 'Breton'),

 ('bs', 'Bosnian'),

 ('ca', 'Catalan'),

 ('cs', 'Czech'),

 ('cy', 'Welsh'),

 ('da', 'Danish'),

 ('de', 'German'),

 ('dsb', 'Lower Sorbian'),

 ('el', 'Greek'),

 ('en', 'English'),

 ('en-au', 'Australian English'),

 ('en-gb', 'British English'),

 ('eo', 'Esperanto'),

 ('es', 'Spanish'),

 ('es-ar', 'Argentinian Spanish'),

 ('es-co', 'Colombian Spanish'),

 ('es-mx', 'Mexican Spanish'),

 ('es-ni', 'Nicaraguan Spanish'),

 ('es-ve', 'Venezuelan Spanish'),

 ('et', 'Estonian'),

 ('eu', 'Basque'),

 ('fa', 'Persian'),

 ('fi', 'Finnish'),

 ('fr', 'French'),

 ('fy', 'Frisian'),

 ('ga', 'Irish'),

 ('gd', 'Scottish Gaelic'),

 ('gl', 'Galician'),

 ('he', 'Hebrew'),

 ('hi', 'Hindi'),

 ('hr', 'Croatian'),

 ('hsb', 'Upper Sorbian'),

 ('hu', 'Hungarian'),

 ('hy', 'Armenian'),

 ('ia', 'Interlingua'),

 ('id', 'Indonesian'),

 ('io', 'Ido'),

 ('is', 'Icelandic'),

 ('it', 'Italian'),

 ('ja', 'Japanese'),

 ('ka', 'Georgian'),

 ('kab', 'Kabyle'),

 ('kk', 'Kazakh'),

 ('km', 'Khmer'),

 ('kn', 'Kannada'),

 ('ko', 'Korean'),

 ('lb', 'Luxembourgish'),

 ('lt', 'Lithuanian'),

 ('lv', 'Latvian'),

 ('mk', 'Macedonian'),

 ('ml', 'Malayalam'),

 ('mn', 'Mongolian'),

 ('mr', 'Marathi'),

 ('my', 'Burmese'),

 ('nb', 'Norwegian Bokmål'),

 ('ne', 'Nepali'),

 ('nl', 'Dutch'),

 ('nn', 'Norwegian Nynorsk'),

 ('os', 'Ossetic'),

 ('pa', 'Punjabi'),

 ('pl', 'Polish'),

 ('pt', 'Portuguese'),

 ('pt-br', 'Brazilian Portuguese'),

 ('ro', 'Romanian'),

 ('ru', 'Russian'),

 ('sk', 'Slovak'),

 ('sl', 'Slovenian'),

 ('sq', 'Albanian'),

 ('sr', 'Serbian'),

 ('sr-latn', 'Serbian Latin'),

 ('sv', 'Swedish'),

 ('sw', 'Swahili'),

 ('ta', 'Tamil'),

 ('te', 'Telugu'),

 ('th', 'Thai'),

 ('tr', 'Turkish'),

 ('tt', 'Tatar'),

 ('udm', 'Udmurt'),

 ('uk', 'Ukrainian'),

 ('ur', 'Urdu'),

 ('uz', 'Uzbek'),

 ('vi', 'Vietnamese'),

 ('zh-hans', 'Simplified Chinese'),

 ('zh-hant', 'Traditional Chinese')]

LANGUAGES_BIDI: ['he', 'ar', 'fa', 'ur']

LANGUAGE_CODE: 'en-us'

LANGUAGE_COOKIE_AGE: None

LANGUAGE_COOKIE_DOMAIN: None

LANGUAGE_COOKIE_HTTPONLY: False

LANGUAGE_COOKIE_NAME: 'django_language'

LANGUAGE_COOKIE_PATH: '/'

LANGUAGE_COOKIE_SAMESITE: None

LANGUAGE_COOKIE_SECURE: False

LOCALE_PATHS: []

LOGGING: {

 }

LOGGING_CONFIG: 'logging.config.dictConfig'

LOGIN_REDIRECT_URL: '/accounts/profile/'

LOGIN_URL: '/accounts/login/'

LOGOUT_REDIRECT_URL: None

MANAGERS: []

MEDIA_ROOT: ''

MEDIA_URL: ''

MESSAGE_STORAGE: 'django.contrib.messages.storage.fallback.FallbackStorage'

MIDDLEWARE: ['django.middleware.security.SecurityMiddleware',

 'django.contrib.sessions.middleware.SessionMiddleware',

 'django.middleware.common.CommonMiddleware',

 'django.middleware.csrf.CsrfViewMiddleware',

 'django.contrib.auth.middleware.AuthenticationMiddleware',

 'django.contrib.messages.middleware.MessageMiddleware',

 'django.middleware.clickjacking.XFrameOptionsMiddleware']

MIGRATION_MODULES: {

 }

MONTH_DAY_FORMAT: 'F j'

NUMBER_GROUPING: 0

PASSWORD_HASHERS: '********'

PASSWORD_RESET_TIMEOUT_DAYS: '********'

PREPEND_WWW: False

ROOT_URLCONF: 'test14_celery_study.urls'

SECRET_KEY: '********'

SECURE_BROWSER_XSS_FILTER: False

SECURE_CONTENT_TYPE_NOSNIFF: True

SECURE_HSTS_INCLUDE_SUBDOMAINS: False

SECURE_HSTS_PRELOAD: False

SECURE_HSTS_SECONDS: 0

SECURE_PROXY_SSL_HEADER: None

SECURE_REDIRECT_EXEMPT: []

SECURE_REFERRER_POLICY: None

SECURE_SSL_HOST: None

SECURE_SSL_REDIRECT: False

SERVER_EMAIL: 'root@localhost'

SESSION_CACHE_ALIAS: 'default'

SESSION_COOKIE_AGE: 1209600

SESSION_COOKIE_DOMAIN: None

SESSION_COOKIE_HTTPONLY: True

SESSION_COOKIE_NAME: 'sessionid'

SESSION_COOKIE_PATH: '/'

SESSION_COOKIE_SAMESITE: 'Lax'

SESSION_COOKIE_SECURE: False

SESSION_ENGINE: 'django.contrib.sessions.backends.db'

SESSION_EXPIRE_AT_BROWSER_CLOSE: False

SESSION_FILE_PATH: None

SESSION_SAVE_EVERY_REQUEST: False

SESSION_SERIALIZER: 'django.contrib.sessions.serializers.JSONSerializer'

SETTINGS_MODULE: 'test14_celery_study.settings'

SHORT_DATETIME_FORMAT: 'm/d/Y P'

SHORT_DATE_FORMAT: 'm/d/Y'

SIGNING_BACKEND: 'django.core.signing.TimestampSigner'

SILENCED_SYSTEM_CHECKS: []

STATICFILES_DIRS: []

STATICFILES_FINDERS: ['django.contrib.staticfiles.finders.FileSystemFinder',

 'django.contrib.staticfiles.finders.AppDirectoriesFinder']

STATICFILES_STORAGE: 'django.contrib.staticfiles.storage.StaticFilesStorage'

STATIC_ROOT: None

STATIC_URL: '/static/'

TEMPLATES: [{'APP_DIRS': True,

  'BACKEND': 'django.template.backends.django.DjangoTemplates',

  'DIRS': ['E:\\百战卓越程序员培训之Python\\第十阶段Python_Django2框架\\个人练习\\章节2个人练习\\test14_celery_study\\templates'],

  'OPTIONS': {'context_processors': ['django.template.context_processors.debug',

                                     'django.template.context_processors.request',

                                     'django.contrib.auth.context_processors.auth',

                                     'django.contrib.messages.context_processors.messages']}}]

TEST_NON_SERIALIZED_APPS: []

TEST_RUNNER: 'django.test.runner.DiscoverRunner'

THOUSAND_SEPARATOR: ','

TIME_FORMAT: 'P'

TIME_INPUT_FORMATS: ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']

TIME_ZONE: 'UTC'

USE_I18N: True

USE_L10N: True

USE_THOUSAND_SEPARATOR: False

USE_TZ: True

USE_X_FORWARDED_HOST: False

USE_X_FORWARDED_PORT: False

WSGI_APPLICATION: 'test14_celery_study.wsgi.application'

X_FRAME_OPTIONS: 'DENY'

YEAR_MONTH_FORMAT: 'F Y'

is_overridden: <bound method Settings.is_overridden of <Settings "test14_celery_study.settings">>


Traceback (most recent call last):

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\runpy.py", line 194, in _run_module_as_main

    return _run_code(code, main_globals, None,

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\runpy.py", line 87, in _run_code

    exec(code, run_globals)

  File "C:\Users\23242\Envs\django_env\Scripts\flower.exe\__main__.py", line 7, in <module>

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\__main__.py", line 11, in main

    flower.execute_from_commandline()

  File "c:\users\23242\envs\django_env\lib\site-packages\celery\bin\base.py", line 305, in execute_from_commandline

    return self.handle_argv(self.prog_name, argv[1:])

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\command.py", line 56, in handle_argv

    return self.run_from_argv(prog_name, argv)

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\command.py", line 51, in run_from_argv

    flower.start()

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\app.py", line 60, in start

    self.listen(self.options.port, address=self.options.address,

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\web.py", line 2116, in listen

    server.listen(port, address)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\tcpserver.py", line 152, in listen

    self.add_sockets(sockets)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\tcpserver.py", line 165, in add_sockets

    self._handlers[sock.fileno()] = add_accept_handler(

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\netutil.py", line 279, in add_accept_handler

    io_loop.add_handler(sock, accept_handler, IOLoop.READ)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\platform\asyncio.py", line 100, in add_handler

    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\asyncio\events.py", line 501, in add_reader

    raise NotImplementedError

NotImplementedError


Python 全系列/第十二阶段:Python_Django3框架/Django进阶 31415楼
JAVA 全系列/(旧的隐藏)第二十一阶段:百战商城项目(Spring Cloud最新架构)/百战商城项目 31417楼

老师您好,网上说的是由于 python3.8 asyncio 在 windows 上默认使用 ProactorEventLoop 造成的,而不是之前的 SelectorEventLoop。jupyter 依赖 tornado,而 tornado 在 window 上需要使用 SelectorEventLoop,所以产生这个报错.,要添加代码,但是他说的我还不是很明白,链接:https://bbs.huaweicloud.com/blogs/140153

另外有一篇帖子上也有说明,但是我照着做,没有解决问题。链接:https://blog.csdn.net/agent_bin/article/details/103082046

附:我安装的软件包如下:

(django_env) E:\百战卓越程序员培训之Python\第十阶段Python_Django2框架\个人练习\章节2个人练习\test14_celery_study>pip list

Package                Version

---------------------- -------

amqp                   2.6.0

appdirs                1.4.4

asgiref                3.2.10

billiard               3.6.3.0

celery                 4.4.6

celery-stubs           0.1.1

concurrent-log-handler 0.9.16

distlib                0.3.0

Django                 3.0.7

django-redis           4.12.1

dnspython              1.16.0

eventlet               0.25.2

filelock               3.0.12

flower                 0.9.5

future                 0.18.2

greenlet               0.4.16

humanize               2.5.0

kombu                  4.6.11

monotonic              1.5

mysqlclient            1.4.6

Pillow                 7.2.0

pip                    20.1.1

portalocker            1.7.0

prometheus-client      0.8.0

pytz                   2020.1

pywin32                228

redis                  3.5.3

setuptools             47.3.1

six                    1.15.0

sqlparse               0.3.1

tornado                6.0.4

vine                   1.3.0

virtualenv             20.0.24

virtualenvwrapper-win  1.2.6

wheel                  0.34.2


Python 全系列/第十二阶段:Python_Django3框架/Django进阶 31418楼

老师好,我在项目根目录下执行如下命令:

(django_env) E:\百战卓越程序员培训之Python\第十阶段Python_Django2框架\个人练习\章节2个人练习\test14_celery_study>flower -A test14_celery_study --port=5555

结果抛出如下异常:

Traceback (most recent call last):

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\runpy.py", line 194, in _run_module_as_main

    return _run_code(code, main_globals, None,

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\runpy.py", line 87, in _run_code

    exec(code, run_globals)

  File "C:\Users\23242\Envs\django_env\Scripts\flower.exe\__main__.py", line 7, in <module>

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\__main__.py", line 11, in main

    flower.execute_from_commandline()

  File "c:\users\23242\envs\django_env\lib\site-packages\celery\bin\base.py", line 305, in execute_from_commandline

    return self.handle_argv(self.prog_name, argv[1:])

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\command.py", line 56, in handle_argv

    return self.run_from_argv(prog_name, argv)

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\command.py", line 51, in run_from_argv

    flower.start()

  File "c:\users\23242\envs\django_env\lib\site-packages\flower\app.py", line 60, in start

    self.listen(self.options.port, address=self.options.address,

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\web.py", line 2116, in listen

    server.listen(port, address)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\tcpserver.py", line 152, in listen

    self.add_sockets(sockets)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\tcpserver.py", line 165, in add_sockets

    self._handlers[sock.fileno()] = add_accept_handler(

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\netutil.py", line 279, in add_accept_handler

    io_loop.add_handler(sock, accept_handler, IOLoop.READ)

  File "c:\users\23242\envs\django_env\lib\site-packages\tornado\platform\asyncio.py", line 100, in add_handler

    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)

  File "c:\users\23242\appdata\local\programs\python\python38-32\lib\asyncio\events.py", line 501, in add_reader

    raise NotImplementedError

NotImplementedError

请问老师这个该怎么解决?









Python 全系列/第十二阶段:Python_Django3框架/Django进阶 31419楼

求老师给看看  这问题出在那了 为什么没有tank没有left属性,前面的都没问题,一按空格键发射子弹就报错了

"""
新增功能
    完成我方坦克发射子弹

"""
import pygame,time,random
SCREEN_WIDTH=1000
SCREEN_HEIGHT=800
BG_COLOR=pygame.Color(0,0,0)
TEXT_COLOR=pygame.Color(255,0,0)
class MainGame():
    window = None
    my_tank = None
    # 存储敌方坦克的列表
    enemyTankList=[]
    # 定义敌方坦克的数量
    enemyTankCount=5
    # 存储我方坦克发射子弹的列表
    myBulletList=[]
    def __init__(self):
        pass
    #开始游戏
    def startGame(self):
        # 加载主窗口
        pygame.display.init()
        # 设置窗口的大小及显示
        MainGame.window=pygame.display.set_mode([SCREEN_HEIGHT,SCREEN_HEIGHT])
        # 初始化我方坦克
        MainGame.my_tank = Tank(350, 250)
        #初始化敌方坦克,并将敌方坦克添加到列表中
        self.createEnemyTank()
        #设置窗口的标题
        pygame.display.set_caption("坦克大战1.03")
        while True:
            #使坦克移动速度慢点
            time.sleep(0.02)
            # 给窗口设置填充色
            MainGame.window.fill(BG_COLOR)
            # 获取事件
            self.getEvent()
            # 绘制文字的方法
            MainGame.window.blit(self.getTextSuface('敌方坦克剩余数量%d'%len(MainGame.enemyTankList)),(10,10))
            # 调用坦克显示的方法
            MainGame.my_tank.displayTank()
            #循环遍历敌方坦克列表,展示敌方坦克
            self.blitEnemyTank()
            #循环遍历我方坦克的子弹
            self.blitMyBullet()
            # 如果坦克的开关是开启,才可以移动
            if not MainGame.my_tank.stop:
                MainGame.my_tank.move()
            pygame.display.update()

    # 初始化敌方坦克,并将敌方坦克添加到列表中
    def createEnemyTank(self):
        top=100
        #循环生成坦克
        for i in range(MainGame.enemyTankCount):
            left=random.randint(0,400)
            speed=random.randint(1,4)
            enemy=EnemyTank(left,top,speed)
            MainGame.enemyTankList.append(enemy)

    # 循环遍历敌方坦克列表,展示敌方坦克
    def blitEnemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            enemyTank.displayTank()
            enemyTank.randMove()
    #循环遍历我方子弹存储列表
    def blitMyBullet(self):
        for myBullet in MainGame.myBulletList:
            myBullet.displayBullet()




    #结束游戏
    def endGame(self):
        print("谢谢使用,欢迎再来")
        exit()
    #左上角文字的绘制
    def getTextSuface(self,text):
        #初始化字体模块
        pygame.font.init()
        #查看所有的字体名称
        #print(pygame.font.get_fonts())
        #获取字体Font对象
        font=pygame.font.SysFont('microsoftyaheimicrosoftyaheiuibold',18)
        #绘制文字信息
        textSurface=font.render(text,True,TEXT_COLOR)
        return textSurface


    #获取事件
    def getEvent(self):
        #获取所有事件
        eventList=pygame.event.get()
         #遍历事件
        for event in eventList:
            #判读按下的是关闭还是键盘
            #如果安的是退出,
            if event.type==pygame.QUIT:
                self.endGame()
                #如果是键盘的按下
            if event.type==pygame.KEYDOWN:
                    #判断按下的是上,下,左,右
                if event.key==pygame.K_LEFT:
                    #切换方向
                    MainGame.my_tank.direction='L'
                    #MainGame.my_tank.move()
                    #修改坦克的开关状态
                    MainGame.my_tank.stop=False
                    print("按下左键,坦克向左移动")
                elif event.key==pygame.K_RIGHT:
                    MainGame.my_tank.direction = 'R'
                    #MainGame.my_tank.move()
                    MainGame.my_tank.stop = False
                    print("按下右键,坦克向右移动")
                elif event.key==pygame.K_UP:
                    MainGame.my_tank.direction = 'U'
                    #MainGame.my_tank.move()
                    MainGame.my_tank.stop = False
                    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('发射子弹')
                    #创建我方坦克发射的子弹
                    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_DOWN or event.key==pygame.K_RIGHT or event.key==pygame.K_LEFT:
                    MainGame.my_tank.stop=True





class Tank ():
    # 添加距离左边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 = 'L'
        # 根据当前图片的方向获取图片
        self.image = self.images[self.direction]
        # 根据图片获取区域
        self.rect = self.image.get_rect()
        # 设置区域的left 和 top
        self.rect.left = left
        self.rect.top = top
        # 速度 决定坦克移动的快慢
        self.speed=5
        #坦克移动的开关
        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_HEIGHT:
                self.rect.left+=self.speed
        elif self.direction=='D':
            if self.rect.top+self.rect.height<SCREEN_HEIGHT:
                self.rect.top+=self.speed
        elif self.direction=='U':
            if self.rect.top>0:
                self.rect.top-=self.speed




    # 射击
    def shot(self):
        pass
    # 展示坦克的方法
    def displayTank(self):
        # 获取展示的对象
        self.image = self.images[self.direction]
        # 调用blit方法展示
        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':pygame.image.load('img/enemy1U.gif'),
            'L': pygame.image.load('img/enemy1L.gif'),
            'R': pygame.image.load('img/enemy1R.gif'),
            'D': pygame.image.load('img/enemy1D.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
        #新增一个步数变量step
        self.step=20
    #随机生成敌方坦克的方向
    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=20
        else:
            self.move()
        #让步数递减
        self.step-=1


#子弹类
class Bullet():
    def __init__(self,tank):
        #加载图片
        self.image=pygame.image.load('img/enemymissile.gif')
        #坦克的方向决定子弹的方向
        self.direction=tank.direction
        #获取区域
        self.rect=self.image.get_rect()
        #子弹的left和top与方向有关
        if self.direction=='U':
            self.rect.left=tank.left+tank.rect.width/2-self.rect.width/2
            self.rect.top=tank.top-self.rect.height
        elif self.direction=='D':
            self.rect.left=tank.left+tank.rect.width/2-self.rect.width/2
            self.rect.top=tank.top+self.rect.height
        elif self.direction == 'L':
            self.rect.left = tank.left + tank.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.left + tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top+tank.rect.width/2- self.rect.width / 2
        self.speed=6
    def move(self):
        pass
    #展示子弹的方法
    def displayBullet(self):
        #将图片surface加载到窗口
        MainGame.window.blit(self.image,self.rect)


class Wall():
    def __init__(self):
        pass
     #展示墙壁的方法
    def displayWall(self):
        pass
class Explode():
    def __init__(self):
        pass
    #展示爆炸效果的方法
    def displayExplode(self):
        pass
class Music():
    def __init__(self):
        pass
    #播放音乐
    def play(self):
        pass
if __name__=="__main__":
    MainGame().startGame()
    #MainGame().getTextSuface()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 31422楼
Python 全系列/第六阶段:数据库与AI协同技术实战/mysql的使用 31423楼
JAVA 全系列/第十一阶段:分布式RPC调用和分布式文件存储/Dubbo 31425楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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