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

#coding=utf-8
"""
新增功能:
     完成我方坦克发射子弹(多上官网查看资料)
"""
import pygame,time,random
screen_width=700     #screen:屏  width:宽度
screen_height=500         #height:高度
bg_color = pygame.Color(0,0,0)  #0,0,0代表黑色
text_color = pygame.Color(255,0,0) #255,0,0代表红色  #ff0000也代表红色
class MainGame():
    window = None  #类对象 窗口对象 初始化值为空
    my_tank = None
    # 存储敌方坦克的列表
    enemyTankList = []
    # 定义敌方坦克的数量
    enemyTankCount = 5   #Count:计数、数
    # 存储我方坦克的列表
    myBulletList = []
    def __init__(self):
        pass
    # 开始游戏
    def startGame(self):
        # 加载主窗口
        # 初始化窗口
        pygame.display.init()
        # 设置窗口的大小及显示
        MainGame.window = pygame.display.set_mode([screen_width, screen_height]) # 窗口的设置使用当前window变量
        # 初始化我方坦克
        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()  # 屏幕一直显示 update:更新
    # 初始化敌方坦克,并将敌方坦克添加到列表中
    def createEnemyTank(self):    #create:创造
        top = 100
        # 循环生成敌方坦克
        for i in range(MainGame.enemyTankCount):
            left = random.randint(0,600)
            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()                     #exit:退出
    # 左上角文字的绘制
    def getTextSuface(self, text):
        # 初始化字体模块
        pygame.font.init()
        # 查看所有字体
        #print(pygame.font.get_fonts())
        # 获取字体Font对象
        font = pygame.font.SysFont("kaiti",18)
        # 绘制文字信息
        textSuface = font.render(text, True, text_color)
        return textSuface
    # 获取事件
    def getEvent(self):
        # 获取所有事件
        eventList = pygame.event.get()  #eventList:事件列表
        # 遍历事件
        for event in eventList:
            # 判断按下的键是关闭还是键盘按下
            # 如果按的是退出,则关闭窗口
            if event.type == pygame.QUIT:
                self.endGame()
            # 如果是键盘的按下
            if event.type == pygame.KEYDOWN:  # KEYDOWN:按下
                # 判断按下的是上、下、左、右(键)
                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("发射子弹")
                    # 创建我方坦克发射的子弹
                    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_LEFT or event.key == pygame.K_RIGHT:
                    MainGame.my_tank.stop = True

class Tank():
    # 添加距离左边left,距离上边top
    def __init__(self,left,top):
        # 保存加载的图片
        self.images = {
            "U":pygame.image.load("imgs/p1tankU.gif"),
            "D":pygame.image.load("imgs/p1tankD.gif"),
            "L":pygame.image.load("imgs/p1tankL.gif"),
            "R":pygame.image.load("imgs/p1tankR.gif"),
        }
        # 方向
        self.direction = "U"   # direction:方向   坦克默认方向朝上
        # 根据当前图片的方向获取图片 Suface
        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   # speed:速度
        # 坦克移动的开关
        self.stop = 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<screen_height:
                self.rect.top += self.speed
        elif self.direction == "R":
            if self.rect.left+self.rect.height<screen_width:
                self.rect.left += self.speed
    # 射击
    def shot(self):
        pass
    # 展示坦克的方法
    def displayTank(self):    #display:显示、展示
        # 获取展示的对象
        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("imgs/enemy1U.gif"),
            "D":pygame.image.load("imgs/enemy1D.gif"),
            "L":pygame.image.load("imgs/enemy1L.gif"),
            "R":pygame.image.load("imgs/enemy1R.gif"),
        }
        # 方向,随机生成敌方坦克的方向
        self.direction = self.randDirection() # rand:随机函数,随机生成
        # 根据方向获取图片
        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 = 60        # step:步子、步数

        # 随机生成敌方坦克的方向
    def randDirection(self):
        num = random.randint(1,4)  #random:随机的。首先需调用random库,其次调用randint方法来生成随机数
        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 = 60
        else:
            self.move()
            # 让步数递减
            self.step-=1

# 子弹类
class Bullet():
    def __init__(self, tank):
        # 加载图片
        self.image = pygame.image.load("imgs/enemymissile.gif")
        # 坦克的方向决定子弹的方向
        self.direction = tank.direction()
        # 获取区域
        self.rect = self.image.get_rect()
        # 子弹的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 + self.rect.height
        elif self.direction == "L":
            self.rect.left = tank.rect.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.rect.left + tank.rect.width
            self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2
        # 子弹的速度
        self.speed = 6
    # 移动
    def move(self):
        pass
    # 展示子弹的方法
    def displayBullet(self):
        # 将图片Suface加载到窗口
        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()

C:\Users\wmx\PycharmProjects\tankedazhan\venv\Scripts\python.exe C:/Users/wmx/PycharmProjects/tankedazhan/tanke13.py

pygame 1.9.6

Hello from the pygame community. https://www.pygame.org/contribute.html

按下上键,坦克向上移动

按下左键,坦克向左移动

Traceback (most recent call last):

  File "C:/Users/wmx/PycharmProjects/tankedazhan/tanke13.py", line 302, in <module>

    MainGame().startGame()

  File "C:/Users/wmx/PycharmProjects/tankedazhan/tanke13.py", line 41, in startGame

    self.getEvent()

  File "C:/Users/wmx/PycharmProjects/tankedazhan/tanke13.py", line 134, in getEvent

    myBullet = Bullet(MainGame.my_tank)

  File "C:/Users/wmx/PycharmProjects/tankedazhan/tanke13.py", line 251, in __init__

    self.direction = tank.direction()

TypeError: 'str' object is not callable

发射子弹


Process finished with exit code 1

老师 这报错信息说我STR对象不可调用 我找了几遍没找到问题在哪

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

老师你好!

虚拟机安装centos6.8 python3.8.2,出现以下问题:

python3.8.2正常安装后,使用virtualenv创建虚拟环境,报错:ModuleNotFoundError: No module named '_ssl'

查找资料,修改Setup文件 重新安装报错:

[root@Tinywang Python-3.8.2]# make -j 4 && make install

gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall    -std=c99 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration  -I./Include/internal  -I. -I./Include    -DPy_BUILD_CORE_BUILTIN  -DUSE_SSL -I/usr/local/ssl/include -I/usr/local/ssl/include/openssl -c ./Modules/_ssl.c -o Modules/_ssl.o

./Modules/_ssl.c:74:6: 错误:#error "libssl is too old and does not support X509_VERIFY_PARAM_set1_host()"

./Modules/_ssl.c: 在函数‘_ssl_configure_hostname’中:

./Modules/_ssl.c:891: 错误:隐式声明函数‘SSL_get0_param’

./Modules/_ssl.c:891: 警告:初始化时将整数赋给指针,未作类型转换

./Modules/_ssl.c:893: 错误:隐式声明函数‘X509_VERIFY_PARAM_set1_host’

./Modules/_ssl.c:899: 错误:隐式声明函数‘X509_VERIFY_PARAM_set1_ip’

./Modules/_ssl.c: 在函数‘_ssl__SSLContext_impl’中:

./Modules/_ssl.c:3130: 错误:‘X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS’未声明(在此函数内第一次使用)

./Modules/_ssl.c:3130: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其

./Modules/_ssl.c:3130: 错误:所在的函数内也只报告一次。)

./Modules/_ssl.c:3240: 错误:隐式声明函数‘SSL_CTX_get0_param’

./Modules/_ssl.c:3240: 警告:赋值时将整数赋给指针,未作类型转换

./Modules/_ssl.c:3246: 错误:隐式声明函数‘X509_VERIFY_PARAM_set_hostflags’

./Modules/_ssl.c: 在函数‘get_verify_flags’中:

./Modules/_ssl.c:3555: 警告:赋值时将整数赋给指针,未作类型转换

./Modules/_ssl.c: 在函数‘set_verify_flags’中:

./Modules/_ssl.c:3568: 警告:赋值时将整数赋给指针,未作类型转换

./Modules/_ssl.c: 在函数‘set_host_flags’中:

./Modules/_ssl.c:3764: 警告:赋值时将整数赋给指针,未作类型转换

make: *** [Modules/_ssl.o] 错误 1


Python 全系列/下架-第十二阶段:Python_大型电商项目(5天后下架)/Django项目阶段-电商项目(旧) 28837楼
JAVA 全系列/第二十八阶段:JVM实战和BATJ大厂面试重难点/JVM调优 28838楼
JAVA 全系列/第六阶段:项目管理与SSM框架/Mybatis 28840楼

com.bjsxtjava.sql.Connectionjava.sql.DriverManagerjava.sql.SQLExceptionjava.sql.StatementJdbcTest {
    (String department_namelocation_id){
        Connection conn = Statement statement = {
            Class.()conn =
            DriverManager.()String sql = +department_name++location_id+statement = conn.createStatement()i = statement.executeUpdate(sql)System..println(i)} (Exception e) {
            e.printStackTrace()}{
            (statement!=){
                {
                    statement.close()} (SQLException e) {
                    e.printStackTrace()}
            }

            (conn!=){
                {
                    conn.close()} (SQLException e) {
                    e.printStackTrace()}
            }
        }
    }
    (String[] args) {
        JdbcTest jdbc = JdbcTest()jdbc.insertDepartments()}
}


按照视频来的,怎么有这个错误

Fri Oct 16 00:23:35 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '8)' at line 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)

at com.mysql.jdbc.Util.getInstance(Util.java:408)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2491)

at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1552)

at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2607)

at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1480)

at com.bjsxt.JdbcTest.insertDepartments(JdbcTest.java:23)

at com.bjsxt.JdbcTest.main(JdbcTest.java:49)


Process finished with exit code 0


怎么解

JAVA 全系列/第四阶段:数据库与AI协同技术实战/JDBC技术(旧) 28843楼
JAVA 全系列/第九阶段:Spring Boot实战/Spring Boot 28844楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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