1. 程式人生 > >一起來寫2048(160行python程式碼)

一起來寫2048(160行python程式碼)

前言:

        Life is short ,you need python.

                                                                 --Bruce Eckel

我與2048的緣,不是緣於一個玩家,而是一次,一次,又一次的ACM比賽.四月份校賽初賽,第一次碰到2048,兩週後決賽再次遇到2048,後來五月份的廣東省賽,又出現了2048。在這三次比賽過程中,我一次2048都沒玩過..全靠隊友的解釋,直到昨天,我突然想起寫個2048吧,於是下了個2048玩了幾盤,之後就開始用python來寫了,心想就不寫介面了,為了簡潔。

我對python並不熟悉,但是我在之前的博文就提過我希望成為一個python的玩家,所以我選擇了python,同時,也希望大家也可以用非常簡單的程式碼取實現2048。

首先,如果你沒有玩過2048,沒關係,你只要隨便在網上或電子市場一搜索肯定會有各種版本,之後玩幾把就會了。

來到這裡,我假設大家都玩過2048了,於是我們先分析一下怎麼來寫一個簡單的2048?回想一下,遊戲的過程是很簡單的:

              開始===>(  進行操作(上下左右)===>矩陣移動===>數字合併===>計分  )===>退出

括號內就是遊戲的進行過程了,我們退出大概就是兩個:1.出現2048,勝利退出 2.無法合併同時無法出現新數(是且的關係)

懂得這個執行過程後,我們就一步步來寫,整個過程也不會難,哪怕你跟我一樣基本是新手

先看看簡略圖,看起來雖然真的很樸素,但是愛美的你,可以在看完我的程式後自己美化。


儲存結構:列表,其中包括二維矩陣列表,即所謂的mtr[4][4],以及棧,棧是用於退回,如果大家不想要這個功能可以直接忽略。

我們的變數定義:

declare = "←:a/h  ↓: s/j ↑: w/k →: d/l ,q(uit),b(ack)"
illegal = "Illegal operation!"
noefficient = "This move has no efficient"
score = 0
step = 0
mtr = init()  # init the matrix
mtr_stk = []  # use step for back
scr_stk = []

稍微解釋一下: declare是解釋操作提示,自己喜歡怎麼寫就怎麼寫~

                             illegal是我們輸入非正常操作提示,,可以省略

                             noefficient是我們往這個方向沒效果,也可以省略~

                             score是得分,step是走了多少步,

                             mtr是我們的二維方陣,

                             mtr_stk,scr_stk是儲存棧,用於後退功能,如果不要後退,還是可以省略~

演算法實現:

 ·「注:其實沒有演算法可言....更準確叫函式實現。」

(1).在我們這個沒有介面的2048中,我們只能用製表符啦,所以我們需要一個display函式。

 這是一個非常簡單的事情,跟C語言的printf基本一致, 像如下程式碼,基本就能繪製出一個固定數字的表格了。

        print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
        print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
        print "└"+("─"*5+"┴")*3+"─"*5+"┘"

但是我們需要的是將固定的數字變成我們矩陣mtr的數字。

另外可以,注意到一點,數字輸出的形式是固定的,表格邊線,只有交叉點是不同,其他是0。而交叉點有五個,我們可以走迴圈(覺得麻煩可以直接忽略)

為了美觀,我們不將0輸出,所以我們輸出時候選擇的是字串即%s,這樣,我們遇到0,就可以輸出' ',其他直接輸出。

我們可以用python的三目運算子號

print "%4s " %(mtr[i][j] if mtr[i][j] else ' ')
所以我們的繪製表格寫成這樣子:最直接的方法!
def T(a):
    return a if a else ' '
def display(mtr):
        print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[0][0]),T(mtr[0][1]),T(mtr[0][2]),T(mtr[0][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[1][0]),T(mtr[1][1]),T(mtr[1][2]),T(mtr[1][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[2][0]),T(mtr[2][1]),T(mtr[2][2]),T(mtr[2][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[3][0]),T(mtr[3][1]),T(mtr[3][2]),T(mtr[3][3]))
        print "└"+("─"*5+"┴")*3+"─"*5+"┘"

如果走迴圈可以這樣寫:就是列舉交叉點情況。
def display(mtrx): #output function
    a = ("┌", "├", "├", "├", "└")
    b = ("┬", "┼", "┼", "┼", "┴")
    c = ("┐", "┤", "┤", "┤", "┘")
    for i in range(4):
        print a[i] + ("─" * 5 + b[i]) * 3 + ("─" * 5 + c[i])
        for j in range(4):
            print "│%4s" % (mtrx[i][j] if mtrx[i][j] else ' '),
        print "│"
    print a[4] + ("─" * 5 + b[4]) * 3 + ("─" * 5 + c[4])
(2)有了表格雛形,我們需要對矩陣進行初始化,then,我們就可以看到一個像模像樣的2048開始啦!

初始化矩陣是非常簡單的,我們在矩陣中選兩個不同位置,設定為2其他為0即可。

先設定為0(沒有memset,╮(╯▽╰)╭)

但是這樣就可以啦:(看不慣?沒關係,非常容易理解,慢慢習慣吧!)

mtr = [[0 for i in range(4)] for j in range(4)]  

我們選的位置是採取隨機的,要保證不同,方法很多,但是我們python的random.sample就非常棒了!

我們用簡單的一句

ran_pos = random.sample(range(16), 2)
便可以得到一個由兩個不同組成的片段

之後我們通過 4*i+j 進行二維到一維的對映,同樣也用( num/4 ,num%4)進行一維到二維的對映

所以我們初始話的過程也是十分簡單。(要是偷懶,也可以直接忽略隨機過程,自己指定吧!哈哈)

def init(): #initial of matrix
    mtr = [[0 for i in range(4)] for j in range(4)]  
    ran_pos = random.sample(range(16), 2)
    mtr[ran_pos[0]/4][ran_pos[0]%4] = mtr[ran_pos[1]/4][ran_pos[1]%4] = 2
    return mtr
怎麼樣?2048有2個2啦!!!O(∩_∩)O哈哈~

(3)動起來!!讓我們的2048動起來!
老實說,這個過程是全個程式最核心的部分,也是最難過的~不過理解了也就不難了。

我們先看向左移動吧。

記得我們玩的時候,合併過的格子是不會再在這次合併的,比如 某一行為 2 2 2 2 最後移動到的結果是4 4 0 0 而不是 8 0 0 0。我們要理解這個過程:

  我們對於每一行的操作是一樣的,即行間無關,所以我們現在要討論第i行,當我們向左動起來的時候,我們從最左開始確定,我們一開始合併前兩個,再合併前三個,再合併前4個。比如

     2 2 4 4   => 4 0 4 4 => 4 4 0 4 =>4 4 4 0 => 4 8 0 0

注意兩點: 1.合併過的不再參與合併,所以我們需要一個visit列表,用到前面所講的對映

                     2.合併的情況=>相鄰的相等,移動的情況=>當前元素為0

python程式碼

visit=[]
score=0 
for i in range(4):
         for j in range(1, 4):
              for k in range(j,0,-1):
                    if mtr[i][k - 1] == 0 :
                        mtr[i][k - 1] = mtr[i][k]
                        mtr[i][k] = 0
                    elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
                        mtr[i][k - 1] *= 2
                        mtr[i][k] = 0
                        score += mtr[i][k - 1]
                        visit.append(4 * i + k)
                        visit.append(4 * i + k - 1)
當你想明白這個過程後,整個move過程就自然清晰起來了。這個是本文第一個,最後一個比較長的函數了!
def move(mtr, dirct):#the core code!move by the four direction
    score = 0
    visit = []
    if dirct == 0:  # left
        for i in range(4):
            for j in range(1, 4):
                for k in range(j,0,-1):
                    if mtr[i][k - 1] == 0 :
                        mtr[i][k - 1] = mtr[i][k]
                        mtr[i][k] = 0
                    elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
                        mtr[i][k - 1] *= 2
                        mtr[i][k] = 0
                        score += mtr[i][k - 1]
                        visit.append(4 * i + k)
                        visit.append(4 * i + k - 1)
    elif dirct == 1:  # down
        for j in range(4):
            for i in range(3, 0, -1):
                for k in range(0,i):
                   if mtr[k+1][j] == 0:
                      mtr[k+1][j] = mtr[k][j]
                      mtr[k][j]=0
                   elif mtr[k+1][j]==mtr[k][j] and (4 *(k+1)+j) not in visit and (4*k+j) not in visit:
                      mtr[k+1][j]*=2
                      mtr[k][j]=0
                      score=mtr[k+1][j]
                      visit.append(4*(k)+j)
                      visit.append(4*(k+1)+j)
    elif dirct == 2:  # up
        for j in range(4):
            for i in range(1,4):
                for k in range(i,0,-1):
                    if mtr[k-1][j]==0:
                        mtr[k-1][j]=mtr[k][j]
                        mtr[k][j]=0
                    elif mtr[k-1][j]==mtr[k][j] and (4 *(k-1)+j) not in visit and (4*k+j) not in visit:
                        mtr[k-1][j]*=2
                        mtr[k][j]=0
                        score += mtr[k-1][j]
                        visit.append(4*(k)+j)
                        visit.append(4*(k-1)+j)
    elif dirct == 3:  # right
        for i in range(4):
            for j in range(3, 0, -1):
                for k in range(j):
                   if mtr[i][k+1]  == 0:
                      mtr[i][k+1] = mtr[i][k]
                      mtr[i][k]=0
                   elif mtr[i][k] ==mtr[i][k+1] and 4 * i + k + 1 not in visit and 4 * i + k not in visit:
                      mtr[i][k+1]*=2
                      mtr[i][k]=0
                      score+=mtr[i][k+1]
                      visit.append(4*i+k+1)
                      visit.append(4*i+k)
    return score
(4)當你來到這步,已經進入輕鬆的狀態了,讓控制檯讀入你的操作,短短兩行,其中一行是轉成小寫
        dirct = raw_input("Step :%d Score :%d (%s):" % (step, score, declare))
        dirct = dirct.lower()
(5)判斷讀入操作並處理
        if dirct == "q":
            break
        elif dirct == "a" or dirct == "h":
            dirct = 0
        elif dirct == "s" or dirct == "j":
            dirct = 1
        elif dirct == "w" or dirct == "k":
            dirct = 2
        elif dirct == "d" or dirct == "l":
            dirct = 3
        elif dirct == "b":
            if len(mtr_stk) == 1:
                print "Can't Back.."
            else:
                mtr_stk.pop()
                scr_stk.pop()
                mtr = copy.deepcopy(mtr_stk[-1])
                score = scr_stk[-1]
                step -= 1
            continue
        else:
            print illegal
            continue
我是vim 的腦殘粉,所以還支援了hjkl,如果你沒有習慣vim什麼的,直接asdw就可以了。

上面最麻煩最值得注意的就是要用深複製.這個bug我調了很久啊親,用"="傷不起啊。

上面的處理意思就是: 對映方向,和b,q的處理(有continue是因為我們將巢狀於while中)。

(6)移動的處理

在上面處理後,篩選出移動的操作,之後我們呼叫移動函式,進行加分,和比較。

        tmp = copy.deepcopy(mtr)
        op_scr = move(mtr, dirct)
        if tmp != mtr:
            score = score + op_scr
            update(mtr) #更新
            display(mtr)
            tmp = copy.deepcopy(mtr)
            mtr_stk.append(tmp)  # 插入後退佇列
            scr_stk.append(int(score))
            step = step + 1  # 步數加1
        else:
            print noefficient

注意:不能僅僅用加分來判斷!因為我們很多時候都是沒有碰撞合併,等待下一個2,4出現

我們用深複製,將老的矩陣放在tmp上,再移動,將老新矩陣比較,沒改變的時候就輸出 noefficient,否則就加分,插入新數字,並顯示,最後將矩陣壓入棧中,因為要後退!

(7)插入新數字

我們遍歷0-16,並對映後,將對應0的位置放入random列表,我們用random.choice選出一個,同理我們生成一個ran_num=[2,4],選取加分

之後對應位置加分咯!但是注意,當我們沒有空位時候不要插數字。

def update(mtr):
    ran_pos=[]
    ran_num=[2,4]

    for i in range(4):
        for j in range(4):
            if mtr[i][j]==0:
               ran_pos.append(4*i+j)
    if len(ran_pos)>0:
        k=random.choice(ran_pos)
        n=random.choice(ran_num)
        mtr[k/4][k%4]=n
(8)最後一個啦!!!遊戲的迴圈條件

這個還是很簡單的。遊戲進行,當前僅當:沒有2048且(有0或者可以合併)。

所以我們只需要判斷2048 in mtr,有就結束,沒有 == > 0 in mtr ?有就繼續,沒有==>可以合併?有繼續,沒有==》,就返回結束啦

def go_on(mtr, score):
    if 2048 in mtr:
        print "Great!You win!Your score is ", score
        raw_input("Press any key to continue...")
        exit()
    if 0 in mtr:
        return True
    for i in range(4):
        for j in range(4):
            if i < 3 and mtr[i][j] == mtr[i + 1][j]:
                return True
            if j < 3 and mtr[i][j] == mtr[i][j + 1]:
                return True
    print "Gameover!"
    return False
(9)一些其他的東西

注意一開始要畫出開始的畫面(迴圈外),一開始要將初始矩陣,初始分數,壓入棧。

最後來個最終版本的

#!/usr/bin/env python
# coding=utf-8
#********************************************************
# > OS     : Linux 3.2.0-60-generic #91-Ubuntu
#	> Author : yaolong
#	> Mail   : [email protected]
#	> Time   : 2014年06月01日 星期日 13:13:39
#********************************************************
import random
import copy

def T(a):
    return a if a else ' '
def display(mtr):
        print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[0][0]),T(mtr[0][1]),T(mtr[0][2]),T(mtr[0][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[1][0]),T(mtr[1][1]),T(mtr[1][2]),T(mtr[1][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[2][0]),T(mtr[2][1]),T(mtr[2][2]),T(mtr[2][3]))
        print "├"+("─"*5+"┼")*3+"─"*5+"┤"
        print "│%4s │%4s │%4s │%4s │"%(T(mtr[3][0]),T(mtr[3][1]),T(mtr[3][2]),T(mtr[3][3]))
        print "└"+("─"*5+"┴")*3+"─"*5+"┘"


def init():
    mtr = [[0 for i in range(4)] for j in range(4)]  # 小小蛋疼..
    ran_pos = random.sample(range(16), 2)
    mtr[ran_pos[0]/4][ran_pos[0]%4] = mtr[ran_pos[1]/4][ran_pos[1]%4] = 2
    
    return mtr

def go_on(mtr, score):
    if 2048 in mtr:
        print "Great!You win!Your score is ", score
        raw_input("Press any key to continue...")
        exit()
    if 0 in mtr:
        return True
    for i in range(4):
        for j in range(4):
            if i < 3 and mtr[i][j] == mtr[i + 1][j]:
                return True
            if j < 3 and mtr[i][j] == mtr[i][j + 1]:
                return True
    print "Gameover!"
    return False


def move(mtr, dirct):
    score = 0
    visit = []
    if dirct == 0:  # left
        for i in range(4):
            for j in range(1, 4):
                for k in range(j,0,-1):
                    if mtr[i][k - 1] == 0 :
                        mtr[i][k - 1] = mtr[i][k]
                        mtr[i][k] = 0
                    elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
                        mtr[i][k - 1] *= 2
                        mtr[i][k] = 0
                        score += mtr[i][k - 1]
                        visit.append(4 * i + k)
                        visit.append(4 * i + k - 1)
        # for i in range(4):
        #    for j in range(3):

    elif dirct == 1:  # down
        for j in range(4):
            for i in range(3, 0, -1):
                for k in range(0,i):
                   if mtr[k+1][j] == 0:
                      mtr[k+1][j] = mtr[k][j]
                      mtr[k][j]=0
                   elif mtr[k+1][j]==mtr[k][j] and (4 *(k+1)+j) not in visit and (4*k+j) not in visit:
                      mtr[k+1][j]*=2
                      mtr[k][j]=0
                      score=mtr[k+1][j]
                      visit.append(4*(k)+j)
                      visit.append(4*(k+1)+j)


    elif dirct == 2:  # up
        for j in range(4):
            for i in range(1,4):
                for k in range(i,0,-1):
                    if mtr[k-1][j]==0:
                        mtr[k-1][j]=mtr[k][j]
                        mtr[k][j]=0
                    elif mtr[k-1][j]==mtr[k][j] and (4 *(k-1)+j) not in visit and (4*k+j) not in visit:
                        mtr[k-1][j]*=2
                        mtr[k][j]=0
                        score += mtr[k-1][j]
                        visit.append(4*(k)+j)
                        visit.append(4*(k-1)+j)

    elif dirct == 3:  # right
        for i in range(4):
            for j in range(3, 0, -1):
                for k in range(j):
                   if mtr[i][k+1]  == 0:
                      mtr[i][k+1] = mtr[i][k]
                      mtr[i][k]=0
                   elif mtr[i][k] ==mtr[i][k+1] and 4 * i + k + 1 not in visit and 4 * i + k not in visit:
                      mtr[i][k+1]*=2
                      mtr[i][k]=0
                      score+=mtr[i][k+1]
                      visit.append(4*i+k+1)
                      visit.append(4*i+k)


    return score


def update(mtr):
    ran_pos=[]
    ran_num=[2,4]

    for i in range(4):
        for j in range(4):
            if mtr[i][j]==0:
               ran_pos.append(4*i+j)
    if len(ran_pos)>0:
        k=random.choice(ran_pos)
        n=random.choice(ran_num)
        mtr[k/4][k%4]=n

# map 0 left,1 down,2 up ,3 right
# a,h=> left ,s,j=>down, w,k=>up, d,l=>right
declare = "←:a/h  ↓: s/j ↑: w/k →: d/l ,q(uit),b(ack)"
illegal = "Illegal operation!"
noefficient = "This move has no efficient"
if __name__ == '__main__':
    score = 0
    step = 0
    mtr = init()
    mtr_stk = []  # for back
    scr_stk = []
    tmp = copy.deepcopy(mtr)
    mtr_stk.append(tmp)
    scr_stk.append(0)
    display(mtr)
    while go_on(mtr, score):
        dirct = raw_input("Step :%d Score :%d (%s):" % (step, score, declare))
        dirct = dirct.lower()
        if dirct == "q":
            break
        elif dirct == "a" or dirct == "h":
            dirct = 0
        elif dirct == "s" or dirct == "j":
            dirct = 1
        elif dirct == "w" or dirct == "k":
            dirct = 2
        elif dirct == "d" or dirct == "l":
            dirct = 3
        elif dirct == "b":
            if len(mtr_stk) == 1:
                print "Can't Back.."
            else:
                mtr_stk.pop()
                scr_stk.pop()
                mtr = copy.deepcopy(mtr_stk[-1])
                score = scr_stk[-1]
                step -= 1
            continue
        else:
            print illegal
            continue
        tmp = copy.deepcopy(mtr)
        op_scr = move(mtr, dirct)
        if tmp != mtr:
            score = score + op_scr
            update(mtr) #更新
            display(mtr)
            tmp = copy.deepcopy(mtr)
            mtr_stk.append(tmp)  # 插入後退佇列
            scr_stk.append(int(score))
            step = step + 1  # 步數加1
        else:
            print noefficient

還有我github的版本,大致一樣,點這裡

如果我的演算法有什麼不對,請提出,因為寫得匆忙,我未能很完整第測試,但是我自己玩了幾把還是OK了,沒玩到2048╮(╯▽╰)╭。。。

相關推薦

起來2048(160python程式碼)

前言:         Life is short ,you need python.                                                                  --Bruce Eckel 我與2048的緣,不是緣於一

70python程式碼製作款簡易的音樂播放器

今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象

70python程式碼製作款簡易的音樂播放器!

今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象、聲音。 我這裡

無聊,幾python程式碼一個聊天機器人陪你聊天

程式碼 利用爬蟲功能實現。 import urllib.request import re while True: x = input("主人:") x = urllib.parse.quote(x) link = urllib.req

python 之路,200Python程式碼了個打飛機遊戲!

早就知道pygame模組,就是沒怎麼深入研究過,恰逢這周未沒約到妹子,只能自己在家玩自己啦,一時興起,花了幾個小時寫了個打飛機程式。 很有意思,跟大家分享下。 先看一下專案結構 """ PlayPlane/ |-- bin/ | |-- main.py 程式執行主體程式

機器學習:用6Python程式碼開始第一個機器學習程式

import sklearn from sklearn import tree # features = [[140, "smooth"],[130, "smooth"],[150, "bumpy"],[170,  "bumpy"]] # labels = ["apple",

還在找遠控?來看我用十幾python程式碼個簡易遠端控制

剛開始學習程式設計的同學可能經常會問:“我學了這個幹什麼用?買菜的時候掏出電腦來編個程式算算多少錢?”其實,這跟大家的知識面和入門選擇的語言有很大關係,大部分同學會選擇C語言來入門程式設計,C語言雖然簡潔,但是面向過程的程式設計方式總會讓人覺得枯燥無味,無所適從。那咱們現在做

Atom Teletype:我們起來程式碼

在幾天前,確定是在2017年11月12號在舊金山舉辦的 QCon 大會上,著名的[交友網站]GitHub 釋出了一款Atom的外掛——Teletype,這款外掛的功能十分有趣:支援多名程式設計師同時攪基…阿不,支援多名程式設計師同時編輯程式碼。 其實多人同

Python新手教程:40python程式碼一個桌面翻譯器

這是我做出來的粗略版本,後面的UI設計就看大家的藝術細胞了 我們進行製作軟體所需要的模板庫,首先要進行引用。 # json r

人臉檢測真的不難,50Python程式碼就能實現人臉檢測

現在的人臉識別技術已經得到了非常廣泛的應用,支付領域、身份驗證、美顏相機裡都有它的應用。用iPhone的同學們應該對下面的功能比較熟悉 iPhone的照片中有一個“人物”的功能,能夠將照片裡的人臉識別出來並分類,背後的原理也是人臉識別技術。 這篇文章主要介紹怎樣用Python實現

手把手|100Python程式碼自動搶火車票!(包教包會)

又到一年一度春運大會,2017年春運搶火車票還是那麼難,各大網際網路公司都推出搶票服務,只要加錢給服務費就可以增加搶到票的機率,有些代售火車票點,說給100元服務費,可以幫搶到,看來這水很深啊! 下面我們利用自己學的技術來自動搶票,本次指令碼基於Python3.6+splinter來實現:

利用itchat 10python程式碼實現微信轟炸

''' 轉載:https://github.com/Gin79/WeChat-Bomb/blob/master/README.md ''' 說明 站在巨人的肩膀上 基於python,這個小程式是用python寫的 使用的是python第三方庫itchat,itc

用50Python程式碼從零開始實現一個AI平衡小遊戲!

集智導讀: 本文會為大家展示機器學習專家 Mike Shi 如何用 50 行 Python 程式碼建立一個 AI,使用增強學習技術,玩耍一個保持杆子平衡的小遊戲。所用環境為標準的 OpenAI Gym,只使用 Numpy 來建立 agent。 學習Python中有不明白推薦加入交流群號

50Python程式碼玩轉微信小遊戲"顏色王者"

50行Python程式碼玩轉微信小遊戲”顏色王者” 遊戲模式 在微信小程式裡搜尋“顏色王者”,即可找到該遊戲。 遊戲的目標比拼色彩敏感度。點選圖片中不一樣的色塊即可。 這遊戲前面20多級還是比較簡單的,到後面色塊實在太小,顏色越來越接近以至於到下圖的程度。 工具介

5 Python 程式碼呼叫電腦攝像頭

前提: 確保 python 中安裝了 opencv-python 模組。如果沒有安裝,可以參考:https://pypi.org/project/opencv-python/ 進行安裝。話不多少,直接上程式碼: import cv2 cap = cv2.Video

百度爬蟲工程師教你只用500Python程式碼構建一個輕量級爬蟲框架

  Features 簡單、易用; 易於定製的 Spider ; 多執行緒實現併發下載。 待改進 更多的測試程式碼; 新增更多的網站爬蟲示例; 完善爬蟲排程,支援 Request 優先順序排程。 xcrawler 介紹

100Python程式碼,幫你分析國慶應該去哪裡玩才是最好的選擇

小編有自己的Python學習交流群:865597862 !進群免費獲取2018最新的Python學習資料!文件、視訊!安排!!!! 統計結果 此次的統計結果只是從側面反映景點爆滿的問題,未必是完全準確的,僅供參考。此次統計的景點共有 100 個: 有需要Python

入門|三Python程式碼,讓資料預處理速度提高2到6倍 python入門

在 Python 中,我們可以找到原生的並行化運算指令。本文可以教你僅使用 3 行程式碼,大大加快資料預處理的速度。 入門|三行Python程式碼,讓資料預處理速度提高2到6倍 Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更

Python程式碼,讓資料預處理速度提高2到6倍

小編有自己的Python學習交流群865597862 !進群可以免費領取2018Python最新的學習資料哦! Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理資料。但當我們面臨大量資料時,一些問題就會顯現…… 目前,大資料(

100 python 程式碼告訴你國慶哪些景點爆滿

前言 舉國歡慶的國慶節馬上就要到來了,你想好去哪裡看人山人海了嗎?還是窩在家裡充電學習呢?說起國慶,塞車與爆滿這兩個詞必不可少,去年國慶我在想要是我能提前知道哪些景點爆滿就好了,就不用去湊熱鬧了。於是我開始折騰,想用 python 抓取有關出行方面的資料,便有了這篇文章。如