第一组:姚成栋 新闻
今天没什么干货要给大家的,只想给大家看一个新闻,更精确的说是想给大家介绍一个人。首先简单讲了一下这条新闻:
北京时间2月7日,“猎鹰重型”运载火箭从美国佛罗里达州肯尼迪航天中心发射升空。太空探索技术公司(SpaceX)官网、美国全国广播公司网站、哥伦比亚广播公司网站7日消息称,“猎鹰重型”火箭首次发射成功,标志着人类商业太空探索的重大突破。火箭两个助推器同时完成回收,芯级火箭海上平台回收失败。但首射成功这一至关重要的动作,仍让该火箭夺下当今航天界“运载火箭之王”的桂冠。这是人类首次实现重型火箭助推器回收。以往的所有的太空探索所使用的火箭皆一次性使用,不仅发射费用高昂,同时还造成了大量的太空垃圾。
而此次火箭发射的核心人物正是我想给大家介绍的人——Elon Musk。有人说他是白日梦想家,也有人说他是当代爱迪生,真人版“钢铁侠”。在燃油车大行其道的21世纪初,马斯克看到燃油带来严重的环境污染,于是决心创办使用环保清洁能源的特斯拉电动汽车。最困难的时候公司只剩下两三个人,为了不让特斯拉破产,他想尽办法让特斯拉上市。却被华尔街评为“最不可能成功的公司”,电视节目上被主持人公然嘲笑说“大家都不应该买特斯拉的股票!”。然而他却成功连本带利还清了4亿美金的贷款,而一开始被大家看好的老牌厂商通用和福特却一直拖欠。他成功地狙击了各大汽车厂商,让特斯拉成为新能源车的代名词。
看过特斯拉车子人肯定会被惊讶到,这么高科技的车。在自动驾驶还处于大多数厂商的研发测试阶段时,特斯拉已经能成熟地运用。特别是model X的鹰翼门设计,使第二、三排乘客即使在狭窄的泊车环境中也能轻松进出车厢,与传统 SUV 车门和 MPV 滑动门相比,提供了前所未有的便利。值得一提的是他的鹰翼门上有无数的传感器,即使你在很窄的车位或者很矮的地方停车时也不会平道周边。
有人说马斯克是贾跃亭,也有人说他是乔布斯,而我认为,他和他们都不一样。他有贾跃亭的梦想,但他不会做白日梦。他也有乔布斯的着眼于现实的革命,但他比乔更多的是展望于未来,热衷创造新的赛道。
第二组:冯佳丽 对冒泡排序中for循环嵌套的理解(BubbleSort)
——转载
1. 冒泡排序
冒泡排序是把无序的数据按从小到大的顺序进行排列。就像它本身的命名一样,把数组中小的数据值依次往前(或向上)推进,确保数组0下标的数据值为整组中最小的数值。
2. 冒泡排序代码
1. //冒泡排序
2. public class BubbleSort {
3. public static void sort(int[] array){
4. int temp=0;//临时变量
5. for(int i=0;i<array.length-1;i++){ j="array.length-1;j" for(int="" 遍历数组内的全部数据="">i;j--){//用来比较数组内的数据,把最小的数据往前移动
6. if(array[j]<array[j-1]){ pre="" <="" }="" array[j-1]="temp;" array[j]="array[j-1];" temp="array[j];"></array[j-1]){></array.length-1;i++){>
3. 冒泡中for循环嵌套的理解
array
-5
50
30
假设数组array是[ -5 50 30]的一个无序数组,经过冒泡排序后变成[-5 30 50]。
第一个for循环是用来控制i来遍历数组内的全部数据。
i 表示从这个数组下标值为 i 的数据开始进行遍历。
比如在array数组中,则是从下标值为0的数据 -5 开始,往后进行遍历,一直到数组中的最后一个数据。第二个for循环(嵌套在第一个for循环内)是用来比较数据值大小——从最后一个与前一个开始进行循环,到下标值为 i 时结束。
j 表示从这个数组最大下标值为 j 的数据开始,让这个数据与前一个数据比较大小。
若最后这个数据小,则交换两个数据的值,然后下标值j-1,进行剩余数据的比较;反之,不改变最后一个数据的值,然后让下标值j-1,进行剩余数据的比较。
比如在array数组【 -5 50 30】,则从数据30与50开始进行比较,
因为30<50,交换两者的数据值。那么 a[2] 的数据值为50,a[1] 的数据值为30。
接着 j- -,比较30与-5,得到a[1]=30,a[0]= - 5。i 和j 控制了从哪一段区域进行比较
在每一次大循环(第一个for + 第二个嵌套的for)内,i 控制起始位置,j 控制结束位置。
假设arrays为[0 80 5 15 50 20],
第一趟大循环内,所有的比较数据为 {0,80,5,15,50,20} ,
从数据0开始进行到数据20结束,比较后的结果为 {0,5,80,15,20,50};
第二趟大循环内,所有的比较数据为 {5,80,15,20,50} ,
从数据5开始进行到数据50结束,比较后的结果为{5,15,80,20,50};
第三趟大循环内,所有的比较数据为 {15,80,20,50},
从数据15开始进行到数据50结束,比较后的结果为{15,20,80,50};
第四趟大循环内,所有的比较数据为{20,80,50},
从数据20开始进行到数据50结束,比较后的结果为{20,50,80};
到这后所有的比较判断结束,输出时就是一个有序的数列了。总结
冒泡排序中最关键是要了解 <冒泡排序原理> 和 <for嵌套中的for分别控制了什么内容>。
第三组:蔡永坚 AugularJS-指令
通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的。
模板中可以使用的东西包括以下四种:
- 指令(directive):ng提供的或者自定义的标签和属性,用来增强HTML表现力;
- 标记(markup):即双大括号{{}},可将数据单向绑定到HTML中;
- 过滤器(filter):用来格式化输出数据;
- 表单控制:用来增强表单的验证功能。
其中,指令无疑是使用量最大的,ng内置了很多指令用来控制模板,如ng-repeat,ng-class,也有很多指令来帮你完成业务逻辑,如ng-controller,ng-model。
指令的几种使用方式如下:
- 作为标签:<my-dir></my-dir>
- 作为属性:<span my-dir="exp"></span>
- 作为注释:
- 作为类名:<span class="my-dir: exp;"></span>
其实常用的就是作为标签和属性。
样式相关的指令
既然模板就是普通的HTML,那我首要关心的就是样式的控制,元素的定位、字体、背景色等等如何可以灵活控制。下面来看看常用的样式控制指令。
ng-class
ng-class用来给元素绑定类名,其表达式的返回值可以是以下三种:
l 类名字符串,可以用空格分割多个类名,如’class1 class2;
与ng-class相近的,ng还提供了ng-class-odd、ng-class-even两个指令,用来配合ng-repeat分别在奇数列和偶数列使用对应的类。这个用来在表格中实现隔行换色再方便不过了。ng-style
ng-style用来绑定元素的css样式,其表达式的返回值为一个js对象,键为css样式名,值为该样式对应的合法取值。ng-show,ng-hide
对于比较常用的元素显隐控制,ng也做了封装,ng-show和ng-hide的值为boolean类型的表达式,当值为true时,对应的show或hide生效。框架会用display:block和display:none来控制元素的显隐。
表单控件功能相关指令
对于常用的表单控件功能,ng也做了封装,方便灵活控制。
ng-checked控制radio和checkbox的选中状态
ng-selected控制下拉框的选中状态
ng-disabled控制失效状态
ng-multiple控制多选
ng-readonly控制只读状态
以上指令的取值均为boolean类型,当值为true时相关状态生效,道理比较简单就不多做解释。注意: 上面的这些只是单向绑定,即只是从数据到模板,不能反作用于数据。要双向绑定,还是要使用 ng-model 。
第四组:张元一 Pygame编写游戏《外星人入侵》
五.重构模块game_functions()
import sys
import pygame
from pygame.sprite import Sprite
from alienx import Alien
from bullet import Bullet
from time import sleep
def check_events(ai_settings,screen,states,play_button,ship,aliens,bullets,sb):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event,ship)
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x,mouse_y = pygame.mouse.get_pos()
check_play_button(states,play_button,mouse_x,mouse_y,ship,aliens,bullets,ai_settings,screen, sb)
def check_play_button(states,play_button,mouse_x,mouse_y,ship,aliens,bullets,ai_settings,screen,sb):
button_clicked = play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not states.game_active:
ai_settings.initialize_dynamic_settings()
pygame.mouse.set_visible(False)
if play_button.rect.collidepoint(mouse_x, mouse_y):
states.reset_states()
states.game_active = True
states.score = 0
sb.prep_score()
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, aliens)
ship.center_ship()
def check_keydown_events(event,ai_settings,screen,ship,bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key == pygame.K_SPACE:
fire_bullet(ai_settings,screen,ship,bullets)
elif event.key == pygame.K_q:
sys.exit()
def fire_bullet(ai_settings,screen,ship,bullets):
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def update_bullets(ai_settings, screen, ship, aliens, bullets, states, sb):
bullets.update()
collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
#记分
if collisions:
for aliens in collisions.values():
states.score += ai_settings.alien_points1*len(aliens)
sb.prep_score()
for bullet in bullets.copy():
if bullet.rect.bottom <= 0 and len(bullets)>0:
bullets.remove(bullet)
if len(aliens) == 0:
bullets.empty()
ai_settings.increase_speed()
create_fleet(ai_settings,screen,aliens)
def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def create_fleet(ai_settings,screen,aliens):
alien = Alien(ai_settings,screen)
alien_width = alien.rect.width
for line_number in range(3):
for alien_number in range(8):
alien = Alien(ai_settings,screen)
alien.x = alien_width + 2*alien_width*alien_number
alien.rect.x = alien.x
alien.rect.y = -6 * alien.rect.height + 2 * alien.rect.height * line_number
if(alien.rect.right < ai_settings.screen_width and alien.rect.left > 0):
aliens.add(alien)
def update_screen(ai_settings, screen, sb, ship, aliens, bullets, states, play_button):
screen.fill(ai_settings.bg_color)
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
sb.show_score()
aliens.draw(screen)
if not states.game_active:
play_button.draw_button()
#让最近绘制的屏幕可见
pygame.display.flip()
def update_aliens(aliens,ai_settings,ship,states,screen,bullets):
aliens.update(ai_settings)
check_aliens_bottom(ai_settings, states, screen, ship, aliens, bullets)
if pygame.sprite.spritecollideany(ship,aliens):
ship_hit(ai_settings, states, screen, ship, aliens, bullets)
def ship_hit(ai_settings,states,screen,ship,aliens,bullets):
if states.ship_left > 0:
states.ship_left -= 1
aliens.empty()
bullets.empty()
create_fleet(ai_settings, screen, aliens)
ship.center_ship()
sleep(0.5)
else:
states.game_active = False
pygame.mouse.set_visible(True)
def check_aliens_bottom(ai_settings,states,screen,ship,aliens,bullets):
screen_rect = screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom >= screen_rect.bottom:
ship_hit(ai_settings,states,screen,ship,aliens,bullets)
break
此文件中包括了对键盘事件的监听等游戏逻辑处理
完整项目见github:
https://github.com/Frued/Python-Alien
第五组:陈孚楠 JS数组
JavaScript中创建数组有两种方式
(一)使用 Array 构造函数:
var arr1 = new Array(); //创建一个空数组
var arr2 = new Array(20); // 创建一个包含20项的数组
var arr3 = new Array("lily","lucy","Tom"); // 创建一个包含3个字符串的数组
(二)使用数组字面量表示法:
var arr4 = []; //创建一个空数组
var arr5 = [20]; // 创建一个包含1项的数组
var arr6 = ["lily","lucy","Tom"]; // 创建一个包含3个字符串的数组
数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些:
join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice()
splice()
indexOf()和 lastIndexOf()
forEach()
map()
filter()
every()
some()
reduce()和 reduceRight()
我觉得JS数组里最重要得是长度的可扩展性。