2018-02-09 新聞、對(duì)冒泡排序中for循環(huán)嵌套的理解、AugularJS-指令、Pygame編寫游戲《外星人入侵》、 JS數(shù)組

第一組:姚成棟 新聞

今天沒什么干貨要給大家的,只想給大家看一個(gè)新聞,更精確的說是想給大家介紹一個(gè)人。首先簡(jiǎn)單講了一下這條新聞:
北京時(shí)間2月7日,“獵鷹重型”運(yùn)載火箭從美國(guó)佛羅里達(dá)州肯尼迪航天中心發(fā)射升空。太空探索技術(shù)公司(SpaceX)官網(wǎng)、美國(guó)全國(guó)廣播公司網(wǎng)站、哥倫比亞廣播公司網(wǎng)站7日消息稱,“獵鷹重型”火箭首次發(fā)射成功,標(biāo)志著人類商業(yè)太空探索的重大突破?;鸺齼蓚€(gè)助推器同時(shí)完成回收,芯級(jí)火箭海上平臺(tái)回收失敗。但首射成功這一至關(guān)重要的動(dòng)作,仍讓該火箭奪下當(dāng)今航天界“運(yùn)載火箭之王”的桂冠。這是人類首次實(shí)現(xiàn)重型火箭助推器回收。以往的所有的太空探索所使用的火箭皆一次性使用,不僅發(fā)射費(fèi)用高昂,同時(shí)還造成了大量的太空垃圾。

而此次火箭發(fā)射的核心人物正是我想給大家介紹的人——Elon Musk。有人說他是白日夢(mèng)想家,也有人說他是當(dāng)代愛迪生,真人版“鋼鐵俠”。在燃油車大行其道的21世紀(jì)初,馬斯克看到燃油帶來(lái)嚴(yán)重的環(huán)境污染,于是決心創(chuàng)辦使用環(huán)保清潔能源的特斯拉電動(dòng)汽車。最困難的時(shí)候公司只剩下兩三個(gè)人,為了不讓特斯拉破產(chǎn),他想盡辦法讓特斯拉上市。卻被華爾街評(píng)為“最不可能成功的公司”,電視節(jié)目上被主持人公然嘲笑說“大家都不應(yīng)該買特斯拉的股票!”。然而他卻成功連本帶利還清了4億美金的貸款,而一開始被大家看好的老牌廠商通用和福特卻一直拖欠。他成功地狙擊了各大汽車廠商,讓特斯拉成為新能源車的代名詞。

看過特斯拉車子人肯定會(huì)被驚訝到,這么高科技的車。在自動(dòng)駕駛還處于大多數(shù)廠商的研發(fā)測(cè)試階段時(shí),特斯拉已經(jīng)能成熟地運(yùn)用。特別是model X的鷹翼門設(shè)計(jì),使第二、三排乘客即使在狹窄的泊車環(huán)境中也能輕松進(jìn)出車廂,與傳統(tǒng) SUV 車門和 MPV 滑動(dòng)門相比,提供了前所未有的便利。值得一提的是他的鷹翼門上有無(wú)數(shù)的傳感器,即使你在很窄的車位或者很矮的地方停車時(shí)也不會(huì)平道周邊。

有人說馬斯克是賈躍亭,也有人說他是喬布斯,而我認(rèn)為,他和他們都不一樣。他有賈躍亭的夢(mèng)想,但他不會(huì)做白日夢(mèng)。他也有喬布斯的著眼于現(xiàn)實(shí)的革命,但他比喬更多的是展望于未來(lái),熱衷創(chuàng)造新的賽道。


第二組:馮佳麗 對(duì)冒泡排序中for循環(huán)嵌套的理解(BubbleSort)

——轉(zhuǎn)載

1. 冒泡排序

冒泡排序是把無(wú)序的數(shù)據(jù)按從小到大的順序進(jìn)行排列。就像它本身的命名一樣,把數(shù)組中小的數(shù)據(jù)值依次往前(或向上)推進(jìn),確保數(shù)組0下標(biāo)的數(shù)據(jù)值為整組中最小的數(shù)值。

2. 冒泡排序代碼
1.  //冒泡排序  
2.  public class BubbleSort {  
3.      public static void sort(int[] array){  
4.          int temp=0;//臨時(shí)變量  
5.          for(int i=0;i<array.length-1;i++){ j="array.length-1;j" for(int="" 遍歷數(shù)組內(nèi)的全部數(shù)據(jù)="">i;j--){//用來(lái)比較數(shù)組內(nèi)的數(shù)據(jù),把最小的數(shù)據(jù)往前移動(dòng)  
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循環(huán)嵌套的理解
array
-5
50
30

假設(shè)數(shù)組array是[ -5 50 30]的一個(gè)無(wú)序數(shù)組,經(jīng)過冒泡排序后變成[-5 30 50]。

  1. 第一個(gè)for循環(huán)是用來(lái)控制i來(lái)遍歷數(shù)組內(nèi)的全部數(shù)據(jù)。
    i 表示從這個(gè)數(shù)組下標(biāo)值為 i 的數(shù)據(jù)開始進(jìn)行遍歷。
    比如在array數(shù)組中,則是從下標(biāo)值為0的數(shù)據(jù) -5 開始,往后進(jìn)行遍歷,一直到數(shù)組中的最后一個(gè)數(shù)據(jù)。

  2. 第二個(gè)for循環(huán)(嵌套在第一個(gè)for循環(huán)內(nèi))是用來(lái)比較數(shù)據(jù)值大小——從最后一個(gè)與前一個(gè)開始進(jìn)行循環(huán),到下標(biāo)值為 i 時(shí)結(jié)束。
    j 表示從這個(gè)數(shù)組最大下標(biāo)值為 j 的數(shù)據(jù)開始,讓這個(gè)數(shù)據(jù)與前一個(gè)數(shù)據(jù)比較大小。
    若最后這個(gè)數(shù)據(jù)小,則交換兩個(gè)數(shù)據(jù)的值,然后下標(biāo)值j-1,進(jìn)行剩余數(shù)據(jù)的比較;反之,不改變最后一個(gè)數(shù)據(jù)的值,然后讓下標(biāo)值j-1,進(jìn)行剩余數(shù)據(jù)的比較。
    比如在array數(shù)組【 -5 50 30】,則從數(shù)據(jù)30與50開始進(jìn)行比較,
    因?yàn)?0<50,交換兩者的數(shù)據(jù)值。那么 a[2] 的數(shù)據(jù)值為50,a[1] 的數(shù)據(jù)值為30。
    接著 j- -,比較30與-5,得到a[1]=30,a[0]= - 5。

  3. i 和j 控制了從哪一段區(qū)域進(jìn)行比較
    在每一次大循環(huán)(第一個(gè)for + 第二個(gè)嵌套的for)內(nèi),i 控制起始位置,j 控制結(jié)束位置。
    假設(shè)arrays為[0 80 5 15 50 20],
    第一趟大循環(huán)內(nèi),所有的比較數(shù)據(jù)為 {0,80,5,15,50,20} ,
    從數(shù)據(jù)0開始進(jìn)行到數(shù)據(jù)20結(jié)束,比較后的結(jié)果為 {0,5,80,15,20,50};
    第二趟大循環(huán)內(nèi),所有的比較數(shù)據(jù)為 {5,80,15,20,50} ,
    從數(shù)據(jù)5開始進(jìn)行到數(shù)據(jù)50結(jié)束,比較后的結(jié)果為{5,15,80,20,50};
    第三趟大循環(huán)內(nèi),所有的比較數(shù)據(jù)為 {15,80,20,50},
    從數(shù)據(jù)15開始進(jìn)行到數(shù)據(jù)50結(jié)束,比較后的結(jié)果為{15,20,80,50};
    第四趟大循環(huán)內(nèi),所有的比較數(shù)據(jù)為{20,80,50},
    從數(shù)據(jù)20開始進(jìn)行到數(shù)據(jù)50結(jié)束,比較后的結(jié)果為{20,50,80};
    到這后所有的比較判斷結(jié)束,輸出時(shí)就是一個(gè)有序的數(shù)列了。

  4. 總結(jié)
    冒泡排序中最關(guān)鍵是要了解 <冒泡排序原理> 和 <for嵌套中的for分別控制了什么內(nèi)容>。


第三組:蔡永堅(jiān) AugularJS-指令

通過使用模板,我們可以把model和controller中的數(shù)據(jù)組裝起來(lái)呈現(xiàn)給瀏覽器,還可以通過數(shù)據(jù)綁定,實(shí)時(shí)更新視圖,讓我們的頁(yè)面變成動(dòng)態(tài)的。

模板中可以使用的東西包括以下四種:

  1. 指令(directive):ng提供的或者自定義的標(biāo)簽和屬性,用來(lái)增強(qiáng)HTML表現(xiàn)力;
  2. 標(biāo)記(markup):即雙大括號(hào){{}},可將數(shù)據(jù)單向綁定到HTML中;
  3. 過濾器(filter):用來(lái)格式化輸出數(shù)據(jù);
  4. 表單控制:用來(lái)增強(qiáng)表單的驗(yàn)證功能。

其中,指令無(wú)疑是使用量最大的,ng內(nèi)置了很多指令用來(lái)控制模板,如ng-repeat,ng-class,也有很多指令來(lái)幫你完成業(yè)務(wù)邏輯,如ng-controller,ng-model。

指令的幾種使用方式如下:

  • 作為標(biāo)簽:<my-dir></my-dir>
  • 作為屬性:<span my-dir="exp"></span>
  • 作為注釋:
  • 作為類名:<span class="my-dir: exp;"></span>

其實(shí)常用的就是作為標(biāo)簽和屬性。

樣式相關(guān)的指令

既然模板就是普通的HTML,那我首要關(guān)心的就是樣式的控制,元素的定位、字體、背景色等等如何可以靈活控制。下面來(lái)看看常用的樣式控制指令。

  1. ng-class
    ng-class用來(lái)給元素綁定類名,其表達(dá)式的返回值可以是以下三種:
    l 類名字符串,可以用空格分割多個(gè)類名,如’class1 class2;
    與ng-class相近的,ng還提供了ng-class-odd、ng-class-even兩個(gè)指令,用來(lái)配合ng-repeat分別在奇數(shù)列和偶數(shù)列使用對(duì)應(yīng)的類。這個(gè)用來(lái)在表格中實(shí)現(xiàn)隔行換色再方便不過了。

  2. ng-style
    ng-style用來(lái)綁定元素的css樣式,其表達(dá)式的返回值為一個(gè)js對(duì)象,鍵為css樣式名,值為該樣式對(duì)應(yīng)的合法取值。

  3. ng-show,ng-hide
    對(duì)于比較常用的元素顯隱控制,ng也做了封裝,ng-show和ng-hide的值為boolean類型的表達(dá)式,當(dāng)值為true時(shí),對(duì)應(yīng)的show或hide生效??蚣軙?huì)用display:block和display:none來(lái)控制元素的顯隱。
    表單控件功能相關(guān)指令
    對(duì)于常用的表單控件功能,ng也做了封裝,方便靈活控制。
    ng-checked控制radio和checkbox的選中狀態(tài)
    ng-selected控制下拉框的選中狀態(tài)
    ng-disabled控制失效狀態(tài)
    ng-multiple控制多選
    ng-readonly控制只讀狀態(tài)
    以上指令的取值均為boolean類型,當(dāng)值為true時(shí)相關(guān)狀態(tài)生效,道理比較簡(jiǎn)單就不多做解釋。注意: 上面的這些只是單向綁定,即只是從數(shù)據(jù)到模板,不能反作用于數(shù)據(jù)。要雙向綁定,還是要使用 ng-model 。


第四組:張?jiān)? Pygame編寫游戲《外星人入侵》

五.重構(gòu)模塊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

此文件中包括了對(duì)鍵盤事件的監(jiān)聽等游戲邏輯處理
完整項(xiàng)目見github:
https://github.com/Frued/Python-Alien


第五組:陳孚楠 JS數(shù)組

JavaScript中創(chuàng)建數(shù)組有兩種方式

(一)使用 Array 構(gòu)造函數(shù):

var arr1 = new Array(); //創(chuàng)建一個(gè)空數(shù)組
var arr2 = new Array(20); // 創(chuàng)建一個(gè)包含20項(xiàng)的數(shù)組
var arr3 = new Array("lily","lucy","Tom"); // 創(chuàng)建一個(gè)包含3個(gè)字符串的數(shù)組

(二)使用數(shù)組字面量表示法:

var arr4 = []; //創(chuàng)建一個(gè)空數(shù)組
var arr5 = [20]; // 創(chuàng)建一個(gè)包含1項(xiàng)的數(shù)組
var arr6 = ["lily","lucy","Tom"]; // 創(chuàng)建一個(gè)包含3個(gè)字符串的數(shù)組

數(shù)組的方法有數(shù)組原型方法,也有從object對(duì)象繼承來(lái)的方法,這里我們只介紹數(shù)組的原型方法,數(shù)組原型方法主要有以下這些:

join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice()
splice()
indexOf()和 lastIndexOf()
forEach()
map()
filter()
every()
some()
reduce()和 reduceRight()

我覺得JS數(shù)組里最重要得是長(zhǎng)度的可擴(kuò)展性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容