1. 程式人生 > >2048小遊戲Python3.6.5實現

2048小遊戲Python3.6.5實現

這個2048遊戲是我自學python以後寫的, 用了幾天時間。

其中的某些方法可能寫的很笨, 也可能還存在各種BUG, 歡迎各位評論指出。

下面貼出完整程式碼供大家學習交流。

import random

#遊戲分數
gameScore = 0
#遊戲矩陣
matrix = []

#初始化遊戲矩陣
def init_matrix():
    global matrix
    matrix = [[0 for i in range(4)] for i in range(4)]

#判斷列印數字或空格
def init_gameNum(num):
    return num if num != 0 else ' '

#列印遊戲介面
def print_game():
    print("當前分數:", gameScore)
    print(""" 
              ┌─────┬─────┬─────┬─────┐
              │%4s │%4s │%4s │%4s │
              ├─────┬─────┬─────┬─────┤
              │%4s │%4s │%4s │%4s │
              ├─────┬─────┬─────┬─────┤
              │%4s │%4s │%4s │%4s │
              ├─────┬─────┬─────┬─────┤
              │%4s │%4s │%4s │%4s │
              └─────┴─────┴─────┴─────┘""" %(init_gameNum(matrix[0][0]), init_gameNum(matrix[0][1]), init_gameNum(matrix[0][2]), init_gameNum(matrix[0][3]), \
                                            init_gameNum(matrix[1][0]), init_gameNum(matrix[1][1]), init_gameNum(matrix[1][2]), init_gameNum(matrix[1][3]), \
                                            init_gameNum(matrix[2][0]), init_gameNum(matrix[2][1]), init_gameNum(matrix[2][2]), init_gameNum(matrix[2][3]), \
                                            init_gameNum(matrix[3][0]), init_gameNum(matrix[3][1]), init_gameNum(matrix[3][2]), init_gameNum(matrix[3][3])) )

#隨機產生2 or 4, time代表產生數字的個數
def getNum2oR4(time = 1):
    global matrix
    numSum = 0
    while True:
        num = 2 if random.randrange(0, 20) >= 1 else 4  #2:4 的產生概率為 20:1
        index = divmod(random.randrange(0, 16), 4)#divmod()函式把除數和餘數運算結果結合起來,返回一個包含商和餘數的元組(a // b, a % b)。
        if matrix[index[0]][index[1]] == 0:
            matrix[index[0]][index[1]] = num
            numSum += 1

        if numSum == time:
            break

#檢查遊戲是否GG
def check_GG():
    for i in range(0, 4):
        for j in range(0, 3):
            if matrix[i][j] == 0 or matrix[i][j + 1] == 0 or matrix[i][j] == matrix[i][j + 1] or matrix[j][i] == matrix[j + 1][i]:
                return True
    else:
        return False

#檢查是否可以上移, 若每個非零數字上側均無0 或者 每個非零數字上側均無相等數字 則該次上移無效
def check_move_up():
    for j in range(0, 4):
        for i in range(1, 4):
            if (matrix[i][j] != 0 and matrix[i - 1][j] == 0) or (matrix[i][j] != 0 and matrix[i][j] == matrix[i - 1][j]):
                return True
    print("當前不可上移!")
    return False

#左移
def move_up():
    if check_move_up():
        global  gameScore

        #迴圈列
        for column in range(0, 4):
            #合併本列相同數字, 並計算分數
            for i in range(0, 3):
                for j in range(i + 1, 4):
                    if matrix[j][column] != 0 and matrix[j][column] != matrix[i][column]:  # 避免隔數合併
                        break
                    if matrix[j][column] != 0 and matrix[j][column] == matrix[i][column]:
                        matrix[i][column] = matrix[i][column] * 2
                        matrix[j][column] = 0
                        gameScore += matrix[i][column]

                        # 如果出現 2048 則遊戲結束, 並給出本局得分
                        if matrix[i][column] == 2048:
                            print("您贏了!\n本局得分為:", gameScore)
                            exit()

                        break

            # 消除本列空位
            for j in range(0, 4):
                #定義臨時列表, 儲存 j 列非零值, 下標用 k 表示
                temp_matrix = [0, 0, 0, 0]
                k = 0
                for i in range(0, 4):
                    if matrix[i][j] != 0:
                        temp_matrix[k] = matrix[i][j]
                        k += 1
                for i in range (0, 4):
                    matrix[i][j] = temp_matrix[i]

        getNum2oR4()

    else:
        pass

#檢查是否可以下移, 若每個非零數字下側均無0 或者 每個非零數字下側均無相等數字 則該次下移無效
def check_move_down():
    for j in range(0, 4):
        for i in range(2, -1, -1):
            if (matrix[i][j] != 0 and matrix[i + 1][j] == 0) or (matrix[i][j] != 0 and matrix[i][j] == matrix[i + 1][j]):
                return True
    print("當前不可下移!")
    return False

#左移
def move_down():
    if check_move_down():
        global  gameScore

        #迴圈列
        for column in range(0, 4):
            #合併本列相同數字, 並計算分數
            for i in range(3, 0, -1):
                for j in range(i - 1, -1, -1):
                    if matrix[j][column] != 0 and matrix[j][column] != matrix[i][column]:  # 避免隔數合併
                        break
                    if matrix[j][column] != 0 and matrix[j][column] == matrix[i][column]:
                        matrix[i][column] = matrix[i][column] * 2
                        matrix[j][column] = 0
                        gameScore += matrix[i][column]

                        # 如果出現 2048 則遊戲結束, 並給出本局得分
                        if matrix[j][column] == 2048:
                            print("您贏了!\n本局得分為:", gameScore)
                            exit()

                        break

            # 消除本列空位
            for j in range(0, 4):
                #定義臨時列表, 儲存 j 列非零值, 下標用 k 表示
                temp_matrix = [0, 0, 0, 0]
                k = 3
                for i in range(3, -1, -1):
                    if matrix[i][j] != 0:
                        temp_matrix[k] = matrix[i][j]
                        k += -1
                for i in range (3, -1, -1):
                    matrix[i][j] = temp_matrix[i]

        getNum2oR4()

    else:
        pass

#檢查是否可以左移, 若每個非零數字左側均無0 或者 每個非零數字左側沒有相等數字 則該次左移無效
def check_move_left():
    for i in range(0, 4):
        for j in range(1, 4):
            if (matrix[i][j] != 0 and matrix[i][j - 1] == 0) or (matrix[i][j] != 0 and matrix[i][j] == matrix[i][j - 1]):
                return True
    print("當前不可左移!")
    return False

#左移
def move_left():
    if check_move_left():
        global  gameScore
        #迴圈行
        for row in range(0, 4):
            # 合併本行相同數字, 並計算分數
            for i in range(0, 3):
                for j in range(i + 1, 4):
                    if matrix[row][j] != 0 and matrix[row][j] != matrix[row][i]:  # 避免隔數合併  eg:0242 (left)-> 0440
                        break
                    if matrix[row][j] != 0 and matrix[row][j] == matrix[row][i]:
                        matrix[row][i] = matrix[row][i] * 2
                        matrix[row][j] = 0
                        gameScore += matrix[row][i]

                        # 如果出現 2048 則遊戲結束, 並給出本局得分
                        if matrix[row][i] == 2048:
                            print("您贏了!\n本局得分為:", gameScore)
                            exit()

                        break

            # 消除本行空位
            for i in range(0, 4):
                #定義臨時列表, 儲存 i 行非零值, 下標用 k 表示
                temp_matrix = [0, 0, 0, 0]
                k = 0
                for j in range(0, 4):
                    if matrix[i][j] != 0:
                        temp_matrix[k] = matrix[i][j]
                        k += 1
                for j in range (0, 4):
                    matrix[i][j] = temp_matrix[j]
        getNum2oR4()

    else:
        pass

#檢查是否可以右移, 若每個非零數字右側均無0 或者 每個非零數字右側均無相等數字 則該次右移無效
def check_move_right():
    for i in range(0, 4):
        for j in range(2, -1, -1):
            if (matrix[i][j] != 0 and matrix[i][j + 1] == 0) or (matrix[i][j] != 0 and matrix[i][j] == matrix[i][j + 1]):
                return True
    print("當前不可右移!")
    return False

#右移
def move_right():
    if check_move_right():
        global  gameScore
        #迴圈行
        for row in range(0, 4):
            # 合併本行相同數字, 並計算分數
            for i in range(3, 0, -1):
                for j in range(i - 1, -1, -1):
                    if matrix[row][j] != 0 and matrix[row][j] != matrix[row][i]:  # 避免隔數合併
                        break
                    if matrix[row][j] != 0 and matrix[row][j] == matrix[row][i]:
                        matrix[row][i] = matrix[row][i] * 2
                        matrix[row][j] = 0
                        gameScore += matrix[row][i]

                        # 如果出現 2048 則遊戲結束, 並給出本局得分
                        if matrix[row][i] == 2048:
                            print("您贏了!\n本局得分為:", gameScore)
                            exit()

                        break

            # 消除本行空位
            for i in range(3, -1, -1):
                #定義臨時列表, 儲存 i 行非零值, 下標用 k 表示
                temp_matrix = [0, 0, 0, 0]
                k = 3
                for j in range(3, -1, -1):
                    if matrix[i][j] != 0:
                        temp_matrix[k] = matrix[i][j]
                        k += -1
                for j in range (3, -1, -1):
                    matrix[i][j] = temp_matrix[j]
        getNum2oR4()

    else:
        pass

#遊戲主函式
def main():
    global gameScore

    init_matrix()
    getNum2oR4(2)
    print_game()
    direction = input("(↑:w) (↓:s) (←:a) (→:d) (restart:r)")

    #開始遊戲迴圈,只有GG才會停止遊戲
    while True:

        #上移
        if direction == 'w':
            move_up()

        #下移
        elif direction == 's':
            move_down()

        #左移
        elif direction == 'a':
            move_left()

        #右移
        elif direction == 'd':
            move_right()

        #重新開始
        elif direction == 'r':
            init_matrix()
            getNum2oR4(2)
            gameScore = 0

        #其他輸入
        else:
            print("輸入無效!")

        print_game()

        if not check_GG():
            print("Game Over\nScore : ", gameScore)
            break

        direction = input("(↑:w) (↓:s) (←:a) (→:d) (restart:r)")

if __name__ == '__main__':
    main()

相關推薦

2048遊戲Python3.6.5實現

這個2048遊戲是我自學python以後寫的, 用了幾天時間。 其中的某些方法可能寫的很笨, 也可能還存在各種BUG, 歡迎各位評論指出。 下面貼出完整程式碼供大家學習交流。 import random #遊戲分數 gameScore = 0 #遊戲矩陣 matrix

2048遊戲主要算法實現

mes 方向 時間限制 上下左右 print ron weight color ges http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4681 4681: 2

C語言實現簡易2048遊戲

blog 而在 而是 null 移動 是我 我們 空指針 主體 一直很喜歡玩這個小遊戲,簡單的遊戲中包含運氣與思考與策略,喜歡這種簡約又不失內涵的遊戲風格。於是萌生了用C語言實現一下的想法。 具體代碼是模仿這個:https://www.cnblogs.com/judgeyo

C語言實現最簡單的2048遊戲

網上解釋很多了,直接上程式碼吧,這個功能很簡單,易於學習,後期有時間會完善功能 #include<stdio.h> #include<stdlib.h> #include<string.h> #define Key_Up 0x4800

C語言介面實現2048遊戲

這是我在大一第二學期(兩年前)為了參加比賽,自學後寫的一個Dome,拿出來和大家分享一下,程式碼為兩年前的程式碼,未改動,優化以及各式可能很一般,請見諒。 #include "stdio.h" #include "stdlib.h" #include "time.h" #d

[原始碼和文件分享]基於Python的PyGame庫實現2048遊戲

一、簡介 2048的遊戲規則很簡單,每次可以選擇上下左右其中一個方向去滑動,每滑動一次,所有的數字方塊都會往滑動的方向靠攏外,系統也會在空白的地方亂數出現一個數字方塊,相同數字的方塊在靠攏、相撞時會相加。系統給予的數字方塊不是2就是4,玩家要想辦法在這小小的16格範圍中湊出“2048”這個數字方

JQuery初體驗-JavaScript實現2048遊戲PC端

目錄 效果圖 遊戲頁面 遊戲頁面樣式 遊戲基礎邏輯 遊戲動畫邏輯 遊戲主邏輯 遊戲互動邏輯 效果圖: 遊戲頁面: <!DOCTYPE html> <html lang="en"> <head> <

C++實現2048遊戲(控制檯版的)

無聊,在公司寫了個2048小遊戲的程式,聊以自娛。(事實是我手機壞了,沒得玩)。 很簡單,直接上程式碼了。 #include <iostream> #include <windows.h> #include <ctime> using

lua實現一個2048遊戲

用lua寫了個在consle上執行的2048,這裡簡單說下是如何實現的。(原始碼地址:http://download.csdn.net/detail/c_boy_lu/9393255) 1.實現一

java實現2048遊戲

學習Java基礎有一段時間了,一直想做個小的桌面程式練下手,最近自己有點時間用Java寫了一個2048的桌面程式,和大家分享一下!!! 遊戲效果展示: 1、設計思想 AppFrame.java遊戲的啟動類,只調用了一個MainFrame的構造方法 MainFrame.ja

C語言實現2048遊戲

給大一新生寫的一個小遊戲。 缺點:函式名稱和功能略微不對應,函式功能寫得比較亂,時間記錄有誤差,可擴充套件性弱。 優點:通過幾個配置陣列,將單位方塊移動的函式縮短到30行以內。 #include <stdio.h> #include <windows.h&

[Python3] 2048遊戲

程式碼來源:https://www.shiyanlou.com/courses/368/labs/1172/document小白,最近看到實驗樓的2048的小遊戲,在程式碼上帶了自己的註釋。前期準備:有限狀態機      ##https://www.cnblogs.com/2

js實現2048遊戲

最近同學參加宣講會,說有個公司要求是寫一個2048小遊戲,參考了一點網上的程式碼以後,自己寫了一個。 寫的思路如下: 1.設定好HTML佈局。大盒子巢狀小盒子,這塊沒什麼可說的。 2.實現遊戲初始化,生成一開始的兩個小塊。這裡就要實現生成隨機2或4,還

C語言在linux終端下實現2048遊戲:第二版

原來我轉載過一個機遇ncurses的2048,今天無聊自己手寫了一個,看下我的目錄結構: $ tree ../2048/ ../2048/ ├── 2048.c ├── 2048.h └── main.c 0 directories, 3 files 2048.h

2048遊戲c++實現

用c++實現了一下2048小遊戲,沒有介面,用控制檯顯示。 #include <stdlib.h> #include <time.h> #include <string.h> #include <stdio.h&g

+js實現簡單的2048遊戲

學習前端半年,本著興趣用canvas結合了js寫了個2048小遊戲,有的地方沒有完善的歡迎各位大神指出。 在寫遊戲開始,首先要在html裡建立canvas標籤,併為canvas增添id,以便使用js呼叫。 <!DOCTYPE html> <html>

學Android--實現2048遊戲

1、遊戲佈局(activity_main.xml) 首先在xml檔案中實現遊戲的整體佈局 (1)新增兩個TextView用來顯示分數 <LinearLayout android:layout_width="match_pare

C#實現2048遊戲

要實現這個簡單的小遊戲主要在於實現一個方向移動 數字的移動及合併該如何處理 然後其它方向的邏輯是相同的 我做的這個基本功能實現了 主要分為三個類 Box.cs格子類(一些格子裡儲存的資料,行下標,列下標,是否合併過的開關。。) Grid.cs網格類(主要演算法在裡

C++實現2048遊戲

程式碼如下: #define _CRT_SECURE_NO_WARNINGS//去掉編譯器內部擴增問題#include<stdio.h>#include<stdlib.h>#include<math.h>#include<graphics.h>//需要下載圖形庫

【python學習】使用python寫一個2048遊戲

ast stc 遊戲 多少 wan nbsp 小遊戲 效果 參考 個人博客:jerwang.cn 沒有參考其他代碼,效果圖: 話不多少,源代碼: https://github.com/jerustc/Python/blob/master/2048.py【python學