国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python新手實現2048小游戲

2019-11-25 17:53:20
字體:
來源:轉載
供稿:網友

接觸 Python 不久,看到很多人寫2048,自己也搗鼓了一個,主要是熟悉Python語法。

程序使用Python3 寫的,代碼150行左右,基于控制臺,方向鍵使用輸入字符模擬。

演示圖片

2048.py

# -*- coding:UTF-8 -*-#! /usr/bin/python3 import random v = [[0, 0, 0, 0],   [0, 0, 0, 0],   [0, 0, 0, 0],   [0, 0, 0, 0]] def display(v, score):    '''顯示界面     '''    print('{0:4} {1:4} {2:4} {3:4}'.format(v[0][0], v[0][1], v[0][2], v[0][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[1][0], v[1][1], v[1][2], v[1][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[2][0], v[2][1], v[2][2], v[2][3]))    print('{0:4} {1:4} {2:4} {3:4}'.format(v[3][0], v[3][1], v[3][2], v[3][3]), '  Total score: ', score) def init(v):    '''隨機分布網格值         '''    for i in range(4):        v[i] = [random.choice([0, 0, 0, 2, 2, 4]) for x in range(4)] def align(vList, direction):    '''對齊非零的數字     direction == 'left':向左對齊,例如[8,0,0,2]左對齊后[8,2,0,0]    direction == 'right':向右對齊,例如[8,0,0,2]右對齊后[0,0,8,2]    '''     # 移除列表中的0    for i in range(vList.count(0)):        vList.remove(0)    # 被移除的0    zeros = [0 for x in range(4 - len(vList))]    # 在非0數字的一側補充0    if direction == 'left':        vList.extend(zeros)    else:        vList[:0] = zeros     def addSame(vList, direction):    '''在列表查找相同且相鄰的數字相加, 找到符合條件的返回True,否則返回False,同時還返回增加的分數         direction == 'left':從右向左查找,找到相同且相鄰的兩個數字,左側數字翻倍,右側數字置0    direction == 'right':從左向右查找,找到相同且相鄰的兩個數字,右側數字翻倍,左側數字置0    '''    score = 0    if direction == 'left':        for i in [0, 1, 2]:            if vList[i] == vList[i+1] != 0:                 vList[i] *= 2                vList[i+1] = 0                score += vList[i]                return {'bool':True, 'score':score}    else:        for i in [3, 2, 1]:            if vList[i] == vList[i-1] != 0:                vList[i-1] *= 2                vList[i] = 0                score += vList[i-1]                return {'bool':True, 'score':score}    return {'bool':False, 'score':score} def handle(vList, direction):    '''處理一行(列)中的數據,得到最終的該行(列)的數字狀態值, 返回得分     vList: 列表結構,存儲了一行(列)中的數據    direction: 移動方向,向上和向左都使用方向'left',向右和向下都使用'right'    '''    totalScore = 0    align(vList, direction)    result = addSame(vList, direction)    while result['bool'] == True:        totalScore += result['score']        align(vList, direction)        result = addSame(vList, direction)    return totalScore      def operation(v):    '''根據移動方向重新計算矩陣狀態值,并記錄得分    '''    totalScore = 0    gameOver = False    direction = 'left'    op = input('operator:')    if op in ['a', 'A']:  # 向左移動        direction = 'left'        for row in range(4):            totalScore += handle(v[row], direction)    elif op in ['d', 'D']: # 向右移動        direction = 'right'        for row in range(4):            totalScore += handle(v[row], direction)    elif op in ['w', 'W']: # 向上移動        direction = 'left'        for col in range(4):            # 將矩陣中一列復制到一個列表中然后處理            vList = [v[row][col] for row in range(4)]            totalScore += handle(vList, direction)            # 從處理后的列表中的數字覆蓋原來矩陣中的值            for row in range(4):                v[row][col] = vList[row]    elif op in ['s', 'S']: # 向下移動        direction = 'right'        for col in range(4):            # 同上            vList = [v[row][col] for row in range(4)]            totalScore += handle(vList, direction)            for row in range(4):                v[row][col] = vList[row]    else:        print('Invalid input, please enter a charactor in [W, S, A, D] or the lower')        return {'gameOver':gameOver, 'score':totalScore}     # 統計空白區域數目 N    N = 0    for q in v:      N += q.count(0)    # 不存在剩余的空白區域時,游戲結束    if N == 0:        gameOver = True        return {'gameOver':gameOver, 'score':totalScore}     # 按2和4出現的幾率為3/1來產生隨機數2和4    num = random.choice([2, 2, 2, 4])     # 產生隨機數k,上一步產生的2或4將被填到第k個空白區域    k = random.randrange(1, N+1)    n = 0    for i in range(4):        for j in range(4):            if v[i][j] == 0:                n += 1                if n == k:                    v[i][j] = num                    break     return {'gameOver':gameOver, 'score':totalScore} init(v)score = 0print('Input:W(Up) S(Down) A(Left) D(Right), press <CR>.')while True:    display(v, score)    result = operation(v)    if result['gameOver'] == True:        print('Game Over, You failed!')        print('Your total score:', score)    else:        score += result['score']        if score >= 2048:            print('Game Over, You Win!!!')            print('Your total score:', score)

以上所述就是本文給大家分享的全部代碼了,希望能夠對大家學習Python有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安顺市| 固阳县| 上犹县| 顺义区| 阿拉善左旗| 英吉沙县| 平邑县| 郴州市| 泽州县| 揭西县| 政和县| 天门市| 大足县| 绿春县| 萨嘎县| 普安县| 什邡市| 罗甸县| 奉新县| 深泽县| 三亚市| 安龙县| 宁陕县| 云霄县| 米林县| 故城县| 方城县| 宕昌县| 德令哈市| 中阳县| 乐亭县| 长寿区| 新龙县| 什邡市| 嵊州市| 类乌齐县| 靖远县| 平度市| 年辖:市辖区| 黑龙江省| 聊城市|