Python基础--01小项目体现的基础知识
part1:猜拳游戏
#coding=utf-8 #当有汉语时可能编译器不认识,需要定义代码
'''
多行注释
写这个程序是为了熟悉python的基本语法
这是第一个小例子包含简单的if判断,循环和输入输出
实现功能是循环猜数字游戏
'''
#这是一个python程序---单行注释 import random #类似Java的导入包操作 while True: #python 中没有大括号这个概念,利用缩进和冒号来进行代码的分割 computer = random.randint(1,3)
#不需要专门定义变量,用到即定义 括号的作用为限制随机数的范围 print("请选择:\n")
#\n作为换行符,这个print可不是简单的c语言中的print---print(name+addr)
#类似与java中都print player = int(input("1:石头 2:剪刀 3:布 0:退出\n"))
#int()为强制类型转换 a=input()可作为接受输入,会自动匹配类型,其实在这里不加int也能正常工作,加int只是为了保证下面if的比较,由于直接的是数字比较所以加上int比较保险
if player==0: #就算是if语句也没有括号
break
if(player==1 and computer==2) or (player==2 and computer==3) or (player==3 and computer==1):
print("恭喜你,赢了!")
elif player==computer: #没有else if 合为一个关键字了
print("平局,差一点咯!")
else:
print("哎呀,输了")
part 2: 为老师分配办公室
'''这是第二个程序主要功能:
为8为老师随机分配3个办公室
语法:for循环 列表
'''
import random rooms=[[],[],[]]
#定义了一个列表,且是嵌套的
#rooms的含义是:包含了办公室和办公室里的老师,建立起办公室和老师的联系
'''
列表类似于c语言的数组但功能更强大,里面不仅能装各种类型的数据
还可以装不同类型的数据,还可以不用提前定义范围
''' teachers = ["A","B","C","D","E","F","G","H"]
#定义了老师,并对每位老师赋予名字,对于字符串和单个字符python中没有严格
#的区分,单引号双引号均可,但要保证是成对出现的 for name in teachers: #for 循环的遍历,name是定义并使用的,python中没有定义这个操作
randomNum = random.randint(0,2)
rooms[randomNum].append(name)
'''
python通过缩进来分辨代码块
romms.append是向列表中添加元素
不要把name认为是int i 这种变量,其实更像c++中的iterator:it 把元素保存
python中的for采用的是迭代的方法遍历的
''' i = 1 #由于日常序号是从1开始的所以设定初始门号为1
for room in rooms:
print("办公室%d里面的老师是:"%i)
for name in room:
print(name,end="")
#print()默认的是输出后就换行,end=“”就是为了让其不换行
print(" ") #起一个换行的作用
i+=1 #没有i++这个操作
part 3:学生管理系统01
stuInfos = [] #保存学生信息,使用列表,stuInfos 为全局变量 def main(): while True:
printMenu() #调用打印函数,打印出主界面
key = int(input("请选择功能:"))
#当要输入字符串时,要用双引号括起来,对于数字python3会自动处理的
#在python2中认为输入都是字符串看待,因此需要转换类型 if key == 1:
addStuInfo()
elif key == 2:
removeStuInfo()
elif key == 3:
updateStuInfo()
elif key == 4:
findStuInfo()
elif key == 5:
showStuInfo()
else :
break
'''
在main这个函数的定义中可以发现addStuInfo()这样的函数是调用在定义之前的,python是支持这种操作的
但是不能把main函数的执行放在定义之前,不是因为main函数的特殊性,python中main函数就是普通的函数
是因为在这个程序中main是直接执行的函数,要先有定义,而def main 是定义函数,可以有前引用
''' #定义了一个初始界面的函数,可以前引用而不加声明
def printMenu():
print("="*30)
print(" 学生管理系统")
print("1. 添加学生信息")
print("2. 删除学生信息")
print("3. 修改学生信息")
print("4. 查询学生信息")
print("5. 显示所有学生信息")
print("0. 退出系统")
print("="*30) def addStuInfo():
newId = input("请输入新学生学号:")
newName = input("请输入新学生姓名:")
newSex = input("请输入新学生性别:") newInfo = {} #newInfo 要保存姓名 性别 等信息需要有对应的关系,所以采用字典保存,类似于c++中的map,一对一 newInfo['name'] = newName
newInfo['sex'] = newSex
newInfo['id'] = newId stuInfos.append(newInfo) def removeStuInfo():
findId = input("请输入要删除的学生学号:")
for tempInfo in stuInfos: #遍历列表,temInfo是一个字典,几种格式的嵌套(列表里套字典)
if tempInfo['id'] == findId:
stuInfos.remove(tempInfo)
print("删除学生成功!")
break; def findStuInfo():
findId = input("请输入要查找的学生学号:")
flag = 0
for tempInfo in stuInfos:
if tempInfo['id'] == findId:
print("学号 姓名 性别")
print("%s %s %s"%(tempInfo['id'],tempInfo['name'],tempInfo['sex']))
flag =1
if flag == 0:
print("输入的学号不存在!请重新输入")
findStuInfo() def showStuInfo():
print("学号 姓名 性别")
for tempInfo in stuInfos:
print("%s %s %s"%(tempInfo['id'],tempInfo['name'],tempInfo['sex'])) #调用main函数,python中main函数不在是必须的了,没有主函数概念
main() '''
这个程序有许多不完善的地方:
查找功能没有实现,操作前没有确认学生是否存在,当两个学号相同时也没有给出提示
只是简单地实现这个功能,了解python的基础语法
'''
part 4:飞机游戏
#codeing=utf-8 #为了保证在python2中也能用 import pygame #导入python中专门的游戏包
import time #导入时间的包,后面sleep函数
from pygame.locals import * #从pygame里导入按键检测的包
error = 0.0000001 class HeroPlane(object):
def __init__(self,screen): #在创建对象的时候就进行初始化,相当于构造函数 self.x =200 #设置飞机的默认位置
self.y =450
self.screen = screen #把显示的窗口传递给飞机对象,后面能够使用
self.imageName = "hero.gif" #飞机的保存路径
self.image = pygame.image.load(self.imageName).convert() #根据路径生成飞机图片
self.bulletList = [] #用来存储飞机发射的子弹,子弹包含位置和图片信息,所以每一个子弹都是一个对象 def display(self):
self.screen.blit(self.image,(self.x,self.y)) #在设定的位置处显示出飞机 '''不考虑bulletList内存的情况下,实际上随着子弹数目的增加内存迟早会有用尽的时候
为了避免这一情况可以尽心判断当子弹在视野之外时删除子弹
for bullet in self.bulletList: #把子弹的显示放在飞机的显示里,不要放在主函数里否则是面向过程了
bullet.display()
bullet.move() #让子弹移动,其实质是刷新子弹的位置''' '''for i in self.bulletList:
if self.y < 0:
self.bulletList.remove(i)
这样删除会带来一个隐患,以a=[1,2,3,4,5]当删除3时,列表会自动向前补,4会占据3的位置但由于for循环
已经遍历过3的位置l,所以会漏掉4这样操作不安全
正确的思路是,再定义一个列表,把要删除的子弹对象先放在列表中(原列表仍有子弹,只是复制了一下)然后遍历
新列表,在遍历的时候删除原列表的子弹
''' needDelItemList = [] #存放要删除的子弹 for i in self.bulletList:
if i.judge(): #在判断的时候面向对象里如果要使用属性最好定义一个方法,直接self.y < 0 不太好
needDelItemList.append(i) #存放子弹
for i in needDelItemList:
self.bulletList.remove(i) #删除子弹
for bullet in self.bulletList: #遍历并移动子弹
bullet.display()
bullet.move() def moveLeft(self):
self.x -= 10
def moveRight(self):
self.x += 10
def moveUP(self):
self.y -=10
def moveDown(self):
self.y +=10
def shootBullet(self):
newBullet = Bullet(self.x,self.y,self.screen) #在发射子弹时不单单要有坐标,还要有此时的屏幕
self.bulletList.append(newBullet)
'''闲着无聊玩的
def moveL(self):
if self.y < 140 :
self.y += 0.2
if int(self.y) % 10 ==0 and self.x <55 :
self.shootBullet()
if abs(self.y -140) < error:
self.x += 0.2
if int(self.x) % 10 ==0 and self.x < 121:
self.shootBullet()
if abs(self.x-120) < error: flag = 1
print(flag)
def moveF(self):
if abs(self.x-150) < error:
self.x += 0.2
print("123")
else:
self.y -= 0.2
if int(self.y)%10 == 0:
self.shootBullet()
''' class Bullet(object):
def __init__(self,x,y,screen):
self.x = x+40
self.y = y-20
self.screen = screen
self.image = pygame.image.load("bullet-3.gif").convert() def move(self):
self.y -=1 def display(self):
self.screen.blit(self.image,(self.x,self.y)) def judge(self): #尽管函数有返回值也不需要声明
if self.y < 0:
return True
else:
return False class EnemyPlane(object): #照搬hreoplane的格式
def __init__(self,screen):
self.x = 10
self.y = 10
self.screen =screen
self.imageName = "enemy-1.gif"
self.image = pygame.image.load(self.imageName).convert()
self.bulletList = []
def display(self):
self.screen.blit(self.image,(self.x,self.y)) if __name__ == "__main__": flag = 0 screen = pygame.display.set_mode((480,650),0,32)
#创建一个窗口大小为480*650; 0,32为固定模式,标准规定 background = pygame.image.load("background.png").convert()
#创建一张背景图片 heroPlane = HeroPlane(screen) #创建飞机的对象
enemyPlane = EnemyPlane(screen) #创建一个敌机对象 while True: #循环执行
screen.blit(background,(0,0)) #把背景图片贴到窗口上;(0,0)表示图片(0,0)位置开始贴
heroPlane.display() #调用显示方法
enemyPlane.display() '''if flag == 0:
heroPlane.moveL()
if int(flag) == 1:
print("123")
heroPlane.moveF()
'''
#获取事件,按键
for event in pygame.event.get():
if event.type ==QUIT: #QUIT:窗口上的叉号
print("exit")
exit() #结束程序的执行
elif event.type == KEYDOWN:
if event.key == K_a or event.key == K_LEFT: #按下小写的a或者是方向键左箭头
#print("left") 程序编写时的检测代码
heroPlane.moveLeft()
elif event.key == K_d or event.key == K_RIGHT:
#print("right")
heroPlane.moveRight()
elif event.key == K_w or event.key == K_UP:
#print("up")
heroPlane.moveUP()
elif event.key == K_s or event.key == K_DOWN:
#print("down")
heroPlane.moveDown()
elif event.key == K_SPACE:
#print("space")
heroPlane.shootBullet()
time.sleep(0.01) #防止CPU占用过高 pygame.display.update() #更新要显示的内容
version1.0
#coding=utf-8
import time
import pygame
from pygame.locals import*
import random #创建一个基类,因为飞机和敌机都需要传递screen和name所以提取出来,减少代码
class Base:
def __init__(self,screen,name):
self.screen = screen
self.name = name class Plan(Base): #飞机类继承了基类
def __init__(self,screen,name):
super().__init__(screen,name) #调用父类的方法,注意此时的参数为plan的name和screen
self.image=pygame.image.load(self.imageName).convert() #保存要显示的飞机图片
self.bulletList=[] #存储飞机发射的子弹 def display(self): #显示方法
self.screen.blit(self.image,(self.x,self.y)) #设置飞机要显示的位置 needDelItemList=[] #存放需要删除的对象信息
for i in self.bulletList:
if i.judge():
needDelItemList.append(i)
for i in needDelItemList:
self.bulletList.remove(i) for bullet in self.bulletList: #遍历更新导弹
bullet.display()
bullet.move() #修改所有导弹的位置 def shootBullet(self): #发射导弹
newBullet=PublicBullet(self.x,self.y,self.screen,self.name)
self.bulletList.append(newBullet) #创建一个玩家飞机类,继承自飞机类
class GamePlan(Plan):
def __init__(self,screen,name): #重写父类的__init__方法
self.x=200 #设置玩家飞机默认的位置
self.y=450
self.imageName='hero.gif'
super().__init__(screen,name)
def moveLeft(self):
self.x-=10
def moveRight(self):
self.x+=10 #创建一个敌人飞机类,继承自飞机类
class EnemyPlan(Plan):
def __init__(self,screen,name):
self.x=0
self.y=0
self.imageName='enemy-1.gif'
super().__init__(screen,name)
self.direction='right' #敌机要自行移动,先初始化其移动方向
def move(self):
#如果碰到了右边的边界,就往左走,碰到了左边的边界,就往右走
if self.direction=='right':
self.x+=2
elif self.direction=='left':
self.x-=2 if self.x>480-50: #规定了左和右的范围,50是飞机的宽度,480是窗口的宽度
self.direction='left'
elif self.x<0:
self.direction='right' def shootBullet(self): #随机发射导弹
num=random.randint(1,100)
if num==88: #当为某一个固定的数时发射,控制随机数的产生范围,即可控制速度
super().shootBullet() class PublicBullet(Base): #导弹类
def __init__(self,x,y,screen,planName):
super().__init__(screen,planName)
#根据飞机的名字,来选择导弹的类型,即哪个飞机发射的,还要设置子弹飞行的方向
if planName=='game':
imageName='bullet-3.gif'
self.x=x+40 #子弹相对于飞机的位置,不同子弹相对于飞机的位置不同
self.y=y-20
elif planName=='enemy':
imageName='bullet-1.gif'
self.x=x+30
self.y=y+30
self.image=pygame.image.load(imageName).convert() def move(self): #导弹的移动方法
if self.name=='game':
self.y-=2
elif self.name=='enemy':
self.y+=2 def display(self): #导弹的显示方法
self.screen.blit(self.image,(self.x,self.y)) def judge(self): #判断导弹是否超出屏幕范围
if self.y>650 or self.y<0:
return True
else:
return False if __name__=='__main__':
screen=pygame.display.set_mode((480,650),0,32)
background=pygame.image.load('background.png').convert() gamePlan=GamePlan(screen,"game") #创建一个玩家飞机对象 enemyPlan=EnemyPlan(screen,"enemy") #创建一个敌人飞机对象 while True:
screen.blit(background,(0,0)) #把背景图片放到窗口中显示
gamePlan.display()
enemyPlan.move()
enemyPlan.shootBullet()
enemyPlan.display() for event in pygame.event.get(): #判断是否点击了退出按钮
if event.type==QUIT:
exit()
elif event.type==KEYDOWN: if event.key==K_a or event.key==K_LEFT:
gamePlan.moveLeft()
elif event.key==K_d or event.key==K_RIGHT:
gamePlan.moveRight()
elif event.key==K_SPACE: #控制飞机让其发射导弹
gamePlan.shootBullet() pygame.display.update() #整个屏幕的更新
time.sleep(0.01)
verison2.0
Python基础--01小项目体现的基础知识的更多相关文章
- python网页爬虫小项目开发
这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...
- java基础部分小项目
贪吃蛇项目 import java.awt.Color; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.even ...
- python爬虫下载小视频和小说(基础)
下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...
- Java基础自学小项目
实现一个基于文本界面的<家庭记账软件> 需求:能够记录家庭的收入,支出,并能够收支明细表 主要涉及一下知识点: - 局部变量和基本数据类型 - 循环语句 - 分支语句 - 方法调用和返回值 ...
- [Python]Python入坑小项目推荐- Flask example minitwit
知乎上看到的Python练手项目推荐,链接见:https://www.zhihu.com/question/29372574,不知道是我自己懒得看还是理解力不行,这些项目真的是...太大了呀~~~~ ...
- python flask实现小项目方法
本文目的是为了完成一个项目用到的flask基本知识,例子会逐渐加深.最好对着源码,一步一步走. 下载源码,运行 pip install -r requirements.txt 建立环境 python ...
- python 的一些小项目
1.在线教育平台(视频播放) 2.仿微信网页版(语音.视频.文字聊天) 3.高德API + Python 解决租房问题 4.仿知乎 5.Django打造文件分享系统.文件管理.搜索引擎(仿云盘) 6. ...
- Spring 框架基础(01):核心组件总结,基础环境搭建
本文源码:GitHub·点这里 || GitEE·点这里 一.Spring框架 1.框架简介 Spring是一个开源框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 ...
- Python 综合应用小项目一
数据库报错重连机制 利用异常捕获来获取mysql断开的报错,然后再重连 import MySQLdb as mysql class DB: def __init__(self,host,user,pa ...
随机推荐
- Proxy 和aop
Proxy 就是代理,意思就是 你不用去做,别人代替你去处理 先来个静态代理 public interface Hello { void say(String name); } 被代理类 public ...
- 剑指offer38:输入一棵二叉树,求该树的深度
1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...
- 剑指offer18:操作给定的二叉树,将其变换为源二叉树的镜像。
1 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 2 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ ...
- selenium模块基础用法详解
目录 selenium模块 官方文档 介绍 安装 有界面浏览器 无界浏览器 selenium+谷歌浏览器headless模式 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 隐式 ...
- gitlab LFS 的应用实践
今天看到的gitlab LFS的文档,将自己的理解整理成博客,加深自己的印象.具体gitlab LFS的介绍可以直接百度了,不在这里详细阐述.只提一下他的作用:LFS就是Large File Stor ...
- LeetCode 61——旋转链表(JAVA)
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4-& ...
- 选择最佳策略:简单的方式和globals()
promos = [fidelity_promo, bulk_item_promo, large_order_promo] ➊ def best_promo(order): ➋ "" ...
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末
事情发生在5月中旬,ATN技术人员发现Token合约由于存在漏洞受到攻击.不过ATN基金会随后透露,将销毁1100万个ATN,并恢复ATN总量,同时将在主链上线映射时对黑客地址内的资产予以剔除,确保原 ...
- 怎样监听xhr.readyState值的变化
可以使用 xhr.onreadystatechange 属性指向的函数去监听 xhr.readyState 值的变化. 示例如下: var xhr = new XMLHttpRequest(); xh ...
- thinkphp 4.8 漏洞测试
首先要部署环境 这里利用docker的方便部署性,来直接找个现成的 git clone https://github.com/vulnspy/thinkphp-5.1.29.git 下载安装后, ...