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

坦克图片打不开

'''
新增功能
    我方坦克的加载
    坦克有4个方向朝向属性,有空间方位属性
'''

import pygame

SCREEN_WIDTH=700
SCREEN_HEIGHT=500
BG_Color=pygame.Color(0,0,0)
Text_Color=pygame.Color(255,255,255)
#主类
class MainGame():
    window = None
    my_tank = None

    def __init__(self):
        pass
    #开始游戏
    def startgame(self):
        #加载主窗口
        #初始化窗口
        pygame.display.init()
        #设置窗口大小及显示
        MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
        #初始化我方tank
        MainGame.my_tank = Tank(350,250)
        #设置窗口标题
        pygame.display.set_caption('坦克大战1.0')
        while True:#维持窗口显示
            pygame.display.update()
            #给窗口设置填充色
            MainGame.window.fill(BG_Color)
            #需要调用关闭窗口就需要获取事件
            self.getevent()
            #将文字绘制的surface放在游戏的主surface上
            MainGame.window.blit(self.gettextsurface('剩余敌方坦克数量%d'%6),(10,10))
            #调用坦克显示的方法
            MainGame.my_tank.displaytank()

    #结束游戏
    def endgame(self):
        print('谢谢游戏,再见')
        exit()

    #左上角文字绘制
    def gettextsurface(self,text):
        #初始化字体模块
        pygame.font.init()
            #查看所有字体的名称
            #得到字体列表print( pygame.font.get_fonts())
    # 获取字体Font对象
        font = pygame.font.SysFont('kaiti',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:
                    print('按下左键,向左移动')
                elif event.key == pygame.K_RIGHT:
                    print('按下右键,向右移动')
                elif event.key == pygame.K_UP:
                    print('按下上键,向上移动')
                elif event.key == pygame.K_DOWN:
                    print('按下下键,向下移动')


#坦克类
class Tank():
    def __init__(self,left, top):
        self.images = {'U':pygame.image.load('C:\img\p1tankU.git'),
                       'D':pygame.image.load('C:\img\p1tankD.git'),
                       'L':pygame.image.load('C:\img\p1tankL.git'),
                       'R':pygame.image.load('C:\img\p1tankR.git'),}
        #方向
        self.direation = 'U'
        #根据当前图片方向获取图片 surface
        self.image = self.images[self.direation]
        #根据图片获取surface
        self.rect = self.image.get_rect()
        #设置区域的left&top
        self.rect.left = left
        self.rect.top = top
    #移动
    def move(self):
        pass
    #射击
    def shot(self):
        pass
    #展示
    def displaytank(self):
        #获取展示对象
        self.image = self.images[self.direation]
        #调用blit方法展示
        MainGame.window.blit(self.image, self.rect)
#我方坦克
class MyTank(Tank):
    def __init__(self):
        pass

#敌方坦克
class EnemyTank(Tank):
    def __init__(self):
        pass

#子弹类
class Bullet():
    def __init__(self):
        pass
    #移动
    def move(self):
        pass
    #展示
    def displaybullet(self):
        pass

#墙壁类
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()

是我导入图片的路径不对?

或者把源图片储存的位置不对?

我尝试多次依然打不开图片,也在网上查找,但是也没有解决。


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 36736楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/常用类 36737楼

一、问题描述如下:

第一种登录方法

    header信息内包含cookie信息,然后进行登录已经学会了。

第二种登录方法

    首先爬虫登录,然后再进入用户界面。这个方法不会!

    登录部分的爬虫,登录不成功,老师您帮忙解决下啊?

二、以下自己写的登录的爬虫代码:

from fake_useragent import UserAgent
import requests

login_url = "https://www.xiami.com/api/passport/login?_s=5f6dc7cd6de10b55330ddb181589a6bb&_xm_cf_=Dm7tbk5qvorx05qWM87w--zx"
headers = {
    "User-Agent": UserAgent().random
}
form_data = {
    "account":"18233301608",
    "ncoSessionid":"01TYfee2_GraAMkskrBwFyr5N7Hv36ALHbgXhvniqZTFsla5-L3b7D7lHGFGTpBVKZD9bU_PCl1vapuvprHnGq5uy5tCnEO9h2-vlgYxj5u3kjftngikzTT5sGq4pMdRq_YjfjlKJ8sNRNxP0SdMi4Mn1uWsoswSwPHIca11tLxwc",
    "ncoSign":"05zCa5bJg-baNHof555vbNZh-c4S-6BY4BY4oXagczXJ6s4Zn5_UziyXeRCV6VTqDs3pl74vefKQJO1qRNtp3kWGyOunuJCMzvoZ8LCn4K7TmnETjhCtS2bqSoecARmW8A0vkKi9EXfHhYqQbQe4fZn9zdhIyz8AtvGLOoXsgWLLT-3SMVKvtgjWnUdFluC-EDnTMba0kZB5uk-lwptZzKDfJ2_J7undVWJgij0UvgjeFuJLXENJ4nh0_zZihR6GiYaPxXA0g109iuZuxKA_vhQJ-J0LlTG3BLKmOIybjsfjEyJcPJNqY-sE0xcOYoQrLlYPyk687rhKB-gEBCdjZyquhjg7OLw1QvNS1gEqvH2R5kmlQd5pmnin3iI8mucMm3pmQvOFg1n_tYHxBng4JfqQ",
    "ncoToken":"web_login_1564504886255_0.08087377440410681",
    "password":"e10adc3949ba59abbe56e057f20f883e"
}
resp = requests.post(login_url,headers=headers,data=form_data)
print(resp.text)

三、以下是如何抓取登录的url,跟用户的账号密码等信息信息。

    url

url.png

    用户信息

用户信息.png

  如果以上操作不正确,还请老师您给改正!

Python 全系列/第十六阶段:Python 爬虫开发/scrapy框架使用(旧) 36738楼
Python 全系列/第二阶段:Python 深入与提高/文件处理 36739楼
JAVA 全系列/(旧的隐藏)第八阶段:电商高级项目_架构/编码/电商ego-基于SOA架构_Dubbo使用_逆向工程_分页插件完成商品查询 36741楼
JAVA 全系列/第五阶段:网页编程和设计/Javascript 语言(旧) 36742楼
Python 全系列/第七阶段:网页编程基础/JavaScript 36743楼

我有一些逻辑需要梳理一下,所以请教一下老师:

(1)、因为随机验证码要被多个函数调用,所以它需要是全局变量,因为这个随机数函数调用在页面加载时就调用了,所以随机验证码虽然是全局变量,但最开始就被随机数函数赋值了。也就是说函数内部可以对外部的全局变量进行赋值?




(2)、姓名,密码,电话,邮箱,有一个公共的函数调用方法,点击事件时,是先调用了姓名函数,然后函数内部又一次去调用了公共函数,所以函数与函数之间需要是平级的?

在姓名函数传递的两个实参之时(相对来说公共函数调用接收的就是形参?),“uname”是手动指定的值,而是reg是函数内部的变量?

            /************检验用户名方法**************/
            function checkName(){
                //汉字正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^[\u4e00-\u9fa5]{3,5}$/;
                return check("uname",reg);                
            }




(3)、调用函数,和接收函数返回值的区别?

            function zong(){
                //把所有方法调用一次,得到返回值,返回为true时,form表单中的提交功能才有用,这不是提交按钮.
                var flag = checkName()&&checkPwd()&&checkPhone()&&checkEmail()&&checkSex()&&checkAdress()&&checkYZM()&&checkAgree();
                return flag;
            }

也就是说,如果zong()函数中,直接写checkName()就会再执行一遍,如果是var flag = checkName()那么主要就是为了接收返回值,中间各种的插入提示不会出现?例如输入姓名时,就会提示输入姓名是不是正确,而最后提交时(这时又一次调用了所有的函数),就不会再提示“用户输入正确”的提示?












整个网页源代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript">
            var ran; //验证需要成为全局变量,以便于函数可以使用
            /************验证码的生成**************/
            function YZM(){
                //获得6位随机数,在页面加载完成后调用
                ran = Math.floor(Math.random()*900000+100000);//为什么不能是999999?如果小数乘以999999当然是小于999999,那么当最接近999999,再加100000时,就会超过8位数
                //获得放置验证码span对象,并且插入进去
                var span = document.getElementById("yzm_span");
                span.innerText = ran;
            }
            /************检验用户名方法**************/
            function checkName(){
                //汉字正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^[\u4e00-\u9fa5]{3,5}$/;
                return check("uname",reg);                
            }
            /************检验密码的方法**************/
            function checkPwd(){
                //密码正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^\d{3,6}$/
                return check("pwd",reg)
            }
            /************检验手机的方法**************/
            function checkPhone(){
                //手机正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^1[34578]\d{9}$/
                return check("phone",reg)
            }
            /************检验邮箱的方法**************/
            function checkEmail(){
                //邮箱正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/
                return check("email",reg)
            }
            /************提取公共校验方法的部分**************/
            function check(id,reg){
                //获得输入的值
                var uname = document.getElementById(id);
                var val = uname.value;
                //获得alt标识的属性
                var alt = uname.alt;
                //获得输入的提示的span对象
                var span = document.getElementById(id+"_span");
                //输入结果的检验判断
                if(val==null||val==""){
                    span.innerText = "×输入不能为空。"
                    span.style.color = "red";
                    return false;
                }else if(reg.test(val)){
                    //reg被定义为正则,reg.test一个正则对比的方法,而比较的对象是uname
                    span.innerText = "√"+alt+"码合乎规则。"
                    span.style.color = "green";
                    return true;
                }else{
                    span.innerText = "×"+alt+"不合规则。"
                    span.style.color = "red";
                    return false;
                }
            }
            /************检验性别的方法**************/
            function checkSex(){
                //获得所有的性别对象
                var sex = document.getElementsByName("sex");//不要忘记一个s
                //获得性别提示span对象
                var span = document.getElementById("sex_span");
                //遍历选择值,如果值的状态是选定的,就插入提示信息
                for(var i in sex){
                    if(sex[i].checked){
                        span.innerHTML = "性别选择成功";
                        span.style.color = "green";
                        return true;
                    }
                }
                span.innerHTML = "请选择性别";
                span.style.color = "red";
                return false;
            }
            /************检验箱贯的方法**************/
            function checkAdress(){
                //获得已选择的值,因为默认为第一个,如果其值为0,代表没有选择.
                var sel = document.getElementById("sel").value;
                //获得选择提示的span对象
                var span = document.getElementById("sel_span");
                //判断对象的值
                if(sel==0){
                    span.style.color = "red";
                    span.innerText = "请选择箱贯";
                    return false;
                }else{
                    span.style.color = "green";
                    span.innerText = "箱贯选择成功";
                    return true;
                }
            }
            /************检验验证码的方法**************/
            function checkYZM(){
                //获得自己输入的值
                var yzm = document.getElementById("yzm").value;
                //获得提示的span对象
                var span = document.getElementById("yzm2_span");
                //判断输入值是否等于随机生成值,由于是ran是全局变量
                if(ran==yzm){
                    span.style.color = "green";
                    span.innerText = "验证码正确";
                    return true;
                }else{
                    span.style.color = "red";
                    span.innerText = "验证码错误";
                    return false;
                }
            }
            /************检验同意协议的方法**************/
            function checkAgree(){
                //获得同意框对象
                var check = document.getElementById("check");
                //获得提交框对象(只是针对提交按钮是否可用。)
                var sub = document.getElementById("sub");
                //对提交框属性重新赋值,由于提交禁止值为true,同意框选择返回结果也是true,只要取反就修改了提交框的属性,由true变为false
                sub.disabled = !check.checked;
            }
            /************检验总体完成程度的方法**************/
            function zong(){
                //把所以方法调用一次,得到返回值,返回为true时,form表单中的提交功能才有用,这不是提交按钮.
                var flag = checkName()&&checkPwd()&&checkPhone()&&checkEmail()&&checkSex()&&checkAdress()&&checkYZM()&&checkAgree();
                return flag;
            }
            /*
             * 正则表达式:
             * 正则表达式是对于数据格式进行一定的规范限制
             * ^:开始
             * [0-9]  [a-z A-Z] :数字  字母
             * {2,4} :段域 至少是2位  最多是4位
             * {3}:指定范围就是3位
             * {2,}:至少是2位
             *  $:结束
             * \d:[0-9]
             * \w[0-9 a-z A-Z] 
             * */
        </script>
    </head>
    <body onload="YZM()">
        <center>
        <h3>注册页面</h3>
        <hr />
        <form action="" method="get" onsubmit="return zong()">
        <table>
            <tr height="35px">
                <td width="150px">用户名:</td>
                <td width="400px">
                    <input type="text" name="uname" id="uname" value="" alt="用户名" onblur="checkName()"/>
                    <span id="uname_span">*用户名必须是3-5位的汉字</span>
                </td>
            </tr>
            <tr height="35px">
                <td>密码:</td>
                <td>
                    <input type="password" name="pwd" id="pwd" value="" alt="密码" onblur="checkPwd()"/>
                    <span id="pwd_span"></span>
                    
                </td>
            </tr>
            <tr height="35px">
                <td>手机号:</td>
                <td>
                    <input type="text" name="phone" id="phone" value="" alt="手机号" onblur="checkPhone()" />
                    <span id="phone_span"></span>
                </td>
            </tr>
            <tr height="35px">
                <td>邮箱:</td>
                <td>
                    <input type="text" name="email" id="email" value="" alt="邮箱" onblur="checkEmail()" />
                    <span id="email_span"></span>
                </td>
            </tr>
            <tr height="35px">
                <td>性别:</td>
                <td>
                    男:<input type="radio" name="sex" id="" value="1" onclick="checkSex()"/>
                    女:<input type="radio" name="sex" id="" value="0" onclick="checkSex()"/>
                    
                    <span id="sex_span">
                        
                    </span>
                </td>
            </tr>
            <tr height="35px">
                <td>爱好:</td>
                <td>
                    <input type="checkbox" name="fav" id="" value="1" />唱歌
                    <input type="checkbox" name="fav" id="" value="2" />睡觉
                    <input type="checkbox" name="fav" id="" value="3"  />LOL<br />
                    <input type="checkbox" name="fav" id="" value="4"  />旅游
                    <input type="checkbox" name="fav" id="" value="5" />高尔夫
                    <input type="checkbox" name="fav" id="" value="6" />篮球
                    
                </td>
            </tr>
            <tr height="35px">
                <td>籍贯:</td>
                <td>
                    <select name="adress" id="sel" onchange="checkAdress()">
                        <option value="0">--请选择--</option>
                        <option value="1">河南</option>
                        <option value="2">湖南</option>
                        <option value="3">海南</option>
                        <option value="4">云南</option>
                    </select>
                    
                    <span id="sel_span"></span>
                </td>
            </tr>
            
            <tr height="35px">
                <td>验证码</td>
                <td>
                    <input type="number" name="" id="yzm" value="" onblur="checkYZM()"/>
                    <span id="yzm_span"></span>
                    <span id="yzm2_span"></span>
                </td>
            </tr>
            
            <tr height="35px">
                <td>个人介绍:</td>
                <td>
                    <textarea name="intro" rows="8" cols="30"></textarea>
                </td>
            </tr>
            
            <tr height="35px">
                <td colspan="2" align="center">
                    <input type="checkbox" name="" id="check" value="" onclick="checkAgree()">是否同意本公司协议
                </td>
            </tr>
            <tr height="35px">
                <td colspan="2" align="center">
                    <input type="submit" id="sub" value="注册" disabled="true"/>
                </td>
            </tr>
        </table>
        </form>
        </center>
        
        
    </body>
</html>
<!--
            /************检验用户名方法**************/
            function checkName(){
                //获得输入用户名的值
                var uname = document.getElementById("uname").value;
                //获得用户名提示的span对象
                var span = document.getElementById("uname_span");
                //汉字正则的声明,正则表达式,格式:var 名称 = /正则/
                var reg = /^[\u4e00-\u9fa5]{3,5}$/
                //用户名检验判断
                if(uname==null||uname==""){
                    span.innerText = "×用户名不能为空。"
                    span.style.color = "red";
                }else if(reg.test(uname)){
                    //reg被定义为正则,reg.test一个正则对比的方法,而比较的对象是uname
                    span.innerText = "√用户名合乎规则。"
                    span.style.color = "green";
                }else{
                    span.innerText = "×用户名不合规则。"
                    span.style.color = "red";
                }
            }
-->


Python 全系列/第七阶段:网页编程基础/JavaScript 36744楼
JAVA 全系列/第四阶段:数据库与AI协同技术实战/JDBC技术(旧) 36745楼
Python 全系列/第七阶段:网页编程基础/html5 36749楼
Python 全系列/第十六阶段:Python 爬虫开发/scrapy框架使用(旧) 36750楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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