python-编程宇宙-计算机网络的宇宙

32 篇文章 5 订阅
13 篇文章 0 订阅

 大家好,我是涵子码农。今天我们来聊一聊多元宇宙。看到上面的海报,大家都会想:这不就是奇异博士2吗?也就是疯狂多元宇宙。那你们就会问了,我们今天要做什么呢?别急。等我慢慢切入主题。

提醒:本次内容涉及到多元宇宙和深度知识,请大家先了解一下,或者看一下奇异博士2。内容超级棒!


目录

一、多元宇宙是个啥?

二、宇宙是什么

三、python宇宙

3.1.简单的小宇宙-初级版本

3.2.游戏宇宙-中级版本

3.3.pymunk宇宙-高级版本

3.3.1.质体

3.3.2.质点

3.3.3.程序实现

四、python爬虫宇宙-宗师程序

五、总结


一、多元宇宙是个啥?

我们先来铺个垫!

假设宇宙在大爆炸发生前是均匀分布是某种波粒二象性的基本的什么东西,就像无限宽广的空间中均匀分布的雾霾一样。

某一时间点因为某种原因某一个点发生了大爆炸(所以这种基本东西是易燃易爆的)。爆炸产生了巨大的能量,能量再宇宙基本规则下产生引力点。引力点聚集更多这种基本的东西微观上形成了电子中子质子原子分子等基本粒子,宏观上形成了行星恒星星系等各种宇宙天体。这一切都在某些最基本的宇宙规则下自然发生,在无限猴子理论下形成了我们多姿多彩的宇宙。

那么另一方面,既然这种基本的东西可以在这个点这个时间发生爆炸,它怎么可能会只在这一个点一个时间发生爆炸?宇宙级大爆炸必然不是唯一的而是在某一尺度上普遍存在的,所以我们的宇宙也必然不是唯一的而是和其他我们宇宙的天体一样是普遍存在的。这就是我理解的多元宇宙了。

今天我们的能力还没办法探测到我们宇宙的边界,因为他确实太大了,如果哪一天我们发现了一个和我们的宇宙星系移动方向相反的星系,说不定那就是相邻另一个宇宙的星系。两个星系空间上已经出现交错。

题外,宇宙的基本的东西究竟是什么?他本身在没有发生大爆炸前的密度和压力是什么样的?它会不会在宇宙大爆炸能量消尽后产生收缩的能量,就像人之类低密度物质进入水这样的高密度空间后产生的压力一样最终在回归均匀分布的状态,这就是宇宙收缩的另一种假设了。

上面内容是不是很深度啊,一下子脑子很乱,是吗?我们来深入一下!

二、宇宙是什么

大家都会有一个想法。宇宙是个啥子?的确,我也这么想过。可是有一句古话可以证明宇宙是个什么东西,什么存在。

往古来今谓之,四方上下谓之

这就是古人理解中的宇宙。古人说的没错!的确,这就是宇宙。

我们生活的宇宙只有一个。可是科学家们认为,人们在未来可以通过虫洞,和特殊的穿越方式到达另一个宇宙。那里就是平行宇宙,科学家们说那里和我们生活的宇宙毫无区别,都有银河系,超星系团,那里还有另一个我,另一个读者。只是那里的“我”经历和在这里的我有区别。

这就是多元宇宙(平行宇宙)的理解。

三、python宇宙

3.1.简单的小宇宙-初级版本

我们来简单理解一下,看一个连3岁小孩都可以分析出来的一个小程序:

import time
import random

while True:
    place = random.randint(0, 100)
    print(f"你已经穿梭到{place}号宇宙")
    time.sleep(3)

这就是一个简单的多远宇宙。你们会想:这么简单的程序只要10秒就可以写出来,根本没啥好讲的。可是接下来的内容要比这个要难很多。

3.2.游戏宇宙-中级版本

还记得以前的球球大作战吗?

我给你们看看源代码:

# import pygame, random and math
import pygame as pg
import random as rd
import math
 
# init program
pg.init()
# set screen
screen = pg.display.set_mode((1000, 500))
screen.fill((255, 255, 255))
# set title
pg.display.set_caption("BallFight_Avaritia", "4.0")
# Chinese:pg.display.set_caption("球球大作战_无尽贪婪", "4.0")
 
# def circle
def circle(color, point, r, size):
    pg.draw.circle(screen, color, point, r, size)
 
# class ball
class Ball():
    def __init__(self):
        self.color = (rd.randint(0, 255), rd.randint(0, 255), rd.randint(0, 255))
        self.x =rd.randint(0, 1000)
        self.y = rd.randint(0, 500)
        self.r = rd.randint(5, 15)
        self.size = rd.randint(5, 15)
 
# make a balllist
balllist = []
for i in range(600):
    balllist.append(Ball())
 
# creat myball
myball = Ball()
myball.color = (0, 0, 0)
myball.x = 500
myball.y = 250
myball.size = 5
myball.speed = 10
 
# def check touch
# use the pythagorean theorem
def touch(myX, myY, fX, fY, myR, fR):
    distance = math.sqrt((myX - fX) ** 2 + (myY - fY) ** 2)
    if distance <= myR + fR:
        # just return True
        return True
    else:
        # return False
        return False
 
# def foodDelivery
def foodDelivery():
    time = pg.time.get_ticks()
    # every 10 seconds put 30 foods
    if time % 10000 >= 9000 and time % 10000 <= 9020:
        for i in range(30):
            balllist.append(Ball())
 
# def draw
# use "Ball" and for range to append in the balllist
def draw():
    for ball in balllist:
        if touch(myball.x, myball.y, ball.x, ball.y, myball.size, ball.size):
            balllist.remove(ball)
            myball.size += 0.1
            # make the speed to be smaller than the last one
            # use the multiplier scale decreases and inverse proportional function
            myball.speed *= 0.992
        else:
            circle(ball.color, (ball.x, ball.y), ball.size, 0)
    circle(myball.color, (myball.x, myball.y), myball.size, 0)
 
# check fps, do not quit program
fps = pg.time.Clock()
# check quit and play program
while True:
    # do not make the fps so high
    # if the fps is high, the computer will ~"bomb!"
    fps.tick(60)
    event = pg.event.poll()
    if event.type == pg.QUIT:
        pg.quit()
        exit()
    keys = pg.key.get_pressed()
    # make the ball to move
    # I use the "wasd"
    # also can use up down right left
    if keys[pg.K_w]:
        myball.y -= myball.speed
    if keys[pg.K_a]:
        myball.x -= myball.speed
    if keys[pg.K_s]:
        myball.y += myball.speed
    if keys[pg.K_d]:
        myball.x += myball.speed
    if keys[pg.K_UP]:
        myball.y -= myball.speed
    if keys[pg.K_DOWN]:
        myball.y += myball.speed
    if keys[pg.K_LEFT]:
        myball.x -= myball.speed
    if keys[pg.K_RIGHT]:
        myball.x += myball.speed
    # the e is to update ball's xy
    elif keys[pg.K_e]:
        myball.x, myball.y = 500, 250
    # draw and check
    draw()
    foodDelivery()
    # display program
    pg.display.update()
    screen.fill((255, 255, 255))

这个游戏就相当于一个小宇宙。

3.3.pymunk宇宙-高级版本

pymunk是一个模块,想要pip的话,可以去看一看之前的文章:

python大全-那些有用的包

那么pymunk是什么呢?

接下来都是干货,大家一定要仔细看!


pymunk是个可以和pygame合体的一个模块 。

里面的程序十分难。我来讲述一下里面的东西。

3.3.1.刚体

刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。绝对刚体实际上是不存在的,只是一种理想模型,因为任何物体在受力作用后,都或多或少地变形,如果变形的程度相对于物体本身几何尺寸来说极为微小,在研究物体运动时变形就可以忽略不计。把许多固体视为刚体,所得到的结果在工程上一般已有足够的准确度。但要研究应力和应变,则须考虑变形。由于变形一般总是微小的,所以可先将物体当作刚体,用理论力学的方法求得加给它的各未知力,然后再用变形体力学,包括材料力学、弹性力学、塑性力学等的理论和方法进行研究。

刚体在空间的位置,必须根据刚体中任一点的空间位置和刚体绕该点转动时的位置(见刚体一般运动)来确定,所以刚体在空间有六个自由度。

3.3.2.质点

质点就是有质量但不存在体积或形状的点,是物理学的一个理想化模型。在物体的大小和形状不起作用,或者所起的作用并不显著而可以忽略不计时,我们近似地把该物体看作是一个只具有质量而其体积、形状可以忽略不计的理想物体,用来代替物体的有质量的点称为质点(mass point,particle)。

3.3.3.程序实现

你们要问了:我讲刚体和质点到底是要干什么呢?

来看看用python做出来的一个超级程序:

 ——此gif图片来源于其他文章

这就是用pymunk做出来的一个超级球球碰撞游戏。

是不是很真实呢?

首先上代码!

import random

import pygame
from pygame.key import *
from pygame.locals import *
from pygame.color import *

import pymunk
import pymunk.pygame_util

# pymunk初始化
space = pymunk.Space()        # 空间
space.gravity = (0.0, -900.0) # 设置重力

# pygame初始化
pygame.init()
screen = pygame.display.set_mode((600, 600))
clock = pygame.time.Clock()
# 在pygame上创建画板
draw_options = pymunk.pygame_util.DrawOptions(screen)

FPS = 60
balls = []  # 所有的球
ticks_to_next_ball = 10  # 多少帧后出现下一个球
exact = 10  # 一帧计算几次

static_body = space.static_body
static_lines = [
	pymunk.Segment(static_body, (111.0, 280.0), (407.0, 246.0), 0.0),
	pymunk.Segment(static_body, (407.0, 246.0), (407.0, 343.0), 0.0)
]
for line in static_lines:
    line.elasticity = 0.95  # 弹性系数 0-1
    line.friction = 0.9     # 摩擦系数 0-1
space.add(static_lines)

# 创建一个球
def create_ball():
    mass = 10   # 质量
    radius = 25 # 半径
    inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0))
    body = pymunk.Body(mass, inertia)
    x = random.randint(115, 350)
    body.position = x, 400
    shape = pymunk.Circle(body, radius, (0, 0))
    shape.elasticity = 0.95
    shape.friction = 0.9
    space.add(body, shape)
    balls.append(shape)

def update_balls():
	global ticks_to_next_ball
    # 根据需要创建/移除球。每帧只调用一次。
    ticks_to_next_ball -= 1
    if ticks_to_next_ball <= 0:
        create_ball()
        ticks_to_next_ball = 100
    # 移除低于100的球
    balls_to_remove = [ball for ball in balls if ball.body.position.y < 100]
    for ball in balls_to_remove:
        space.remove(ball, ball.body)
        balls.remove(ball)

def my_events():
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()
        elif event.type == KEYDOWN and event.key == K_ESCAPE:
            exit()
        elif event.type == KEYDOWN and event.key == K_p:
            # 截图
            pygame.image.save(screen, "bouncing_balls.png")

# 清除屏幕
def clear_screen():
    screen.fill(THECOLORS["white"])

# 画对象
def draw_objects():
    space.debug_draw(draw_options)

while True:
    # 计算下一帧位置
    for x in range(exact):
        space.step(1/FPS/exact)

    my_events()
    update_balls()
    clear_screen()
    draw_objects()
    pygame.display.flip()
    clock.tick(FPS)
    pygame.display.set_caption("fps: " + str(clock.get_fps()))

额,有点难是不?好吧,是挺难的。

四、python爬虫宇宙-宗师程序

python最重要的一个内容就是爬虫,去挖掘数据。

有名的socket就是常用爬虫库。

来一个实例!

import tkinter
import tkinter.font as tkFont
import socket
import threading
import time
import sys
class ClientUI():
    local = '127.0.0.1'
    port = 5505
    global clientSock
    flag=False

    def __init__(self):
        self.root=tkinter.Tk()
        self.root.title("Python 在线聊天-客户端V1.0")
        #窗口面板,用四个面板布局
        self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]

        #以下为界面设计与服务器端相同
        # 显示消息Text右边的滚动条
        self.chatTextScrollBar = tkinter.Scrollbar(self.frame[0])
        self.chatTextScrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
        # 显示消息Text,并绑定上面的滚动条
        ft = tkFont.Font(family='Fixdsys', size=11)
        self.chatText = tkinter.Listbox(self.frame[0], width=70, height=18, font=ft)
        self.chatText['yscrollcommand'] = self.chatTextScrollBar.set
        self.chatText.pack(expand=1, fill=tkinter.BOTH)
        self.chatTextScrollBar['command'] = self.chatText.yview()
        self.frame[0].pack(expand=1, fill=tkinter.BOTH)
        # 标签,分开消息显示Text和消息输入Text
        label = tkinter.Label(self.frame[1], height=2)
        label.pack(fill=tkinter.BOTH)
        self.frame[1].pack(expand=1, fill=tkinter.BOTH)
        # 输入消息Text的滚动条
        self.inputTextScrollBar = tkinter.Scrollbar(self.frame[2])
        self.inputTextScrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
        # 输入消息Text,并于滚动条绑定
        ft = tkFont.Font(family='Fixdsys', size=11)
        self.inputText = tkinter.Text(self.frame[2], width=70, height=8, font=ft)
        self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
        self.inputText.pack(expand=1, fill=tkinter.BOTH)
        self.inputTextScrollBar['command'] = self.chatText.yview()
        self.frame[2].pack(expand=1, fill=tkinter.BOTH)
        # 发送消息按钮
        self.sendButton = tkinter.Button(self.frame[3], text="发送", width=10, command=self.sendMessage)
        self.sendButton.pack(expand=1, side=tkinter.BOTTOM and tkinter.RIGHT, padx=15, pady=8)
        # 关闭按钮
        self.closeButton = tkinter.Button(self.frame[3], text='关闭', width=10, command=self.close)
        self.closeButton.pack(expand=1, side=tkinter.RIGHT, padx=15, pady=8)
        self.frame[3].pack(expand=1, fill=tkinter.BOTH)
    #接收消息
    def receiveMessage(self):
        try:
            #建立socket连接
            self.clientSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.clientSock.connect((self.local,self.port))
            self.flag=True
        except:
            self.flag=False
            self.chatText.insert(tkinter.END,'你还没有与服务器建立连接,请检查服务器端是否开启')
            return
        self.buffer=1024
        self.clientSock.send('Y'.encode())
        while True:
            try:
                if self.flag==True:# 建立连接,接收服务器端消息
                    self.serverMsg=self.clientSock.recv(self.buffer).decode('utf-8')
                    if self.serverMsg=='Y':
                        self.chatText.insert(tkinter.END,'客户端已经与服务器建立连接.....')
                    elif self.serverMsg=='N':
                        self.chatText.insert(tkinter.END,'客户端与服务器建立连接失败......')
                    elif not self.serverMsg:
                        continue
                    else:
                        theTime = time.strftime("%Y-%m-%d %H: %M: %S", time.localtime())
                        self.chatText.insert(tkinter.END, '服务器端' + theTime + "说:\n")
                        self.chatText.insert(tkinter.END, '' + self.serverMsg)
                else:
                    break
            except EOFError as msg:
                raise msg
                self.clientSock.close()
                break

    def sendMessage(self):
        #  得到用户在Text中输入的消息
        message=self.inputText.get('1.0',tkinter.END)
        #格式化当前的时间
        theTime = time.strftime("%Y-%m-%d %H: %M: %S", time.localtime())
        self.chatText.insert(tkinter.END, '客户端' + theTime + "说:\n")
        self.chatText.insert(tkinter.END, '' + message+'\n')
        if self.flag==True:
            self.clientSock.send(message.encode())
        else:
            #socket连接没有建立,提示用户
            self.chatText.insert(tkinter.END,'你还未与服务器端建立连接,服务器端无法收到你发送的消息\n')
            #清空用户在Text中输入的消息
            self.inputText.delete(0.0,message.__len__()-1.0)

    def close(self):
        sys.exit()

    #启动线程接收服务器端的消息
    def startNewThread(self):
        #   启动一个新线程来接收服务器的消息
        #args是传递给线程函数的参数,receiveMessage函数不需要参数,就传一个空元组
        thread=threading.Thread(target=self.receiveMessage,args=())
        thread.setDaemon(True)
        thread.start()
def main():
    client=ClientUI()
    client.startNewThread()
    client.root.mainloop()
if __name__=='__main__':
    main()

此内容是去爬取网站上面的消息,找到回应消息然后上传到python-tkinter上面并显示出来。

的确是这样的!

socket介绍:

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

额,好像更难了。算了,我还是不讲了!

五、总结

python是一个十分厉害的编程语言。还可以写出一个宇宙!这是不是很厉害呢?希望大家去学习python,别忘了顺便给我点个赞,关注一下。我将会持续更新!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值