python版2048小游戏

 学python也有一段时间了,放假闲着没事就试着来写了个小游戏2048,在这里我直接将源代码奉上,供python初学者学习,希望能够对大家有所帮助。

总体来讲这个小游戏还是比较简单的,对于初学者而言做做这种比较简单的小游戏是一种很好的学习方法,一方面可以增强学习兴趣,增进学习的信心,另一方面还可以熟悉编程知识,首先给大家看看效果图吧!游戏初始界面的效果图为:

python版2048小游戏_第1张图片

游戏运行中的效果图为:

python版2048小游戏_第2张图片

源代码是最好的学习资料,废话不多说,接下来就直接上代码了:

from tkinter import messagebox
import tkinter as tk
import numpy as np
import random

def main():
    window=tk.Tk()
    window.title('欢迎畅玩白杨版2048小游戏')
    window.geometry('1160x600')

    round_over=False
    color = {'0': 'gray86', '2': 'green1', '4': 'cyan', '8': 'blue1', '16': 'pink4', '32': 'yellow1', '64': 'yellow4',
             '128': 'pink','256': 'green4', '512': 'yellow4', '1024': 'orange4', '2048': 'red'}

    def initi(a):
        m1 = random.randint(0, 3)    #从0到3之间产生一个随机整数(包含端点)
        n1 = random.randint(0, 3)
        m2 = random.randint(0, 3)
        n2 = random.randint(0, 3)
        while ((m1 == m2) and (n1 == n2)):
            m2 = random.randint(0, 3)
            n2 = random.randint(0, 3)
        a[m1][n1] = random.choice([2, 2, 2, 4])   #从列表中随机选中一个数
        a[m2][n2] = random.choice([2, 2, 2, 4])

    # 创建原始数组
    board = np.zeros((4, 4), dtype=np.int16)
    initi(board)

    # 绘制初始的界面
    lab = {}
    Ox, Oy = 20, 20
    for i in range(4):
        for j in range(4):
            tlx=Ox+j*140
            tly=Oy+i*140
            num = i * 4 + j
            key = str(board[i][j])
            l = tk.Label(window, text=board[i][j], bg=color[key], font=('Arial', 30), height=2, width=4)
            lab[num] = l
            l.place(x=tlx,y=tly)

    # 定义各种操作函数
    def left_move(a):
        k = 0
        for i in range(4):
            if a[i] != 0:
                a[k] = a[i]
                k += 1
        if k < 4:
            for j in range(k, 4):
                a[j] = 0

    def right_move(a):
        k = 3
        for i in range(4):
            if a[3 - i] != 0:
                a[k] = a[3 - i]
                k -= 1
        if k > 0:
            for j in range(0, k + 1):
                a[j] = 0

    def left_add(a):
        for i in range(3):
            if a[i] == a[i + 1]:
                a[i] = a[i] * 2
                if i + 1 < 3:
                    for k in range(i + 1, 3):
                        a[k] = a[k + 1]
                a[3] = 0

    def right_add(a):
        for i in range(3):
            if a[3 - i] == a[2 - i]:
                a[3 - i] = a[3 - i] * 2
                if 2 - i > 0:
                    for k in range(1, 3 - i):
                        a[3 - i - k] = a[2 - i - k]
                a[0] = 0

    def produce_rand(a):
        p = random.randint(0, 3)
        q = random.randint(0, 3)
        while (board[p][q] != 0):
            p = random.randint(0, 3)
            q = random.randint(0, 3)
        board[p][q] = random.choice([2, 2, 2, 4])

    def update(a):
        count = 0
        for i in range(4):
            for j in range(4):
                if a[i][j]:
                    count += 1
                num = i * 4 + j
                c_key = str(a[i][j])
                lab[num].config(text=a[i][j], bg=color[c_key])
        return count

    def judge_state(a):
        count = update(a)
        max_num=np.max(a)
        va.set(max_num)
        if max_num == 2048:
            round_over=True
            var1 = tk.messagebox.askyesno(title='闯关成功!', message='你想再来一次吗?')
            if var1:
                for i in range(4):
                    for j in range(4):
                        a[i][j]=0
                initi(a)
                round_over=False
                update(a)
            else:
                window.destroy()

        if count == 16:
            round_over=True
            var2 = tk.messagebox.askyesno(title='闯关失败!', message='  Game Over!\n你想再试一次吗?')
            if var2:
                for i in range(4):
                    for j in range(4):
                        a[i][j]=0
                initi(a)
                round_over=False
                update(a)
            else:
                window.destroy()

    def compare(a,b):
        n_equal=False
        for i in range(4):
            for j in range(4):
                if a[i][j]!=b[i][j]:
                    n_equal=True
                    break
        return n_equal


    # 进行运算操作
    def up_op():
        ob=board.copy()
        tb = board.T
        for i in range(4):
            left_move(tb[i])
            left_add(tb[i])
        m = tb.T
        for i in range(4):
            for j in range(4):
                board[i][j] = m[i][j]
        if compare(ob,board):
            produce_rand(board)
        judge_state(board)

    def down_op():
        ob = board.copy()
        tb = board.T
        for i in range(4):
            right_move(tb[i])
            right_add(tb[i])
        m = tb.T
        for i in range(4):
            for j in range(4):
                board[i][j] = m[i][j]
        if compare(ob, board):
            produce_rand(board)
        judge_state(board)

    def left_op():
        ob = board.copy()
        for i in range(4):
            left_move(board[i])
            left_add(board[i])
        if compare(ob, board):
            produce_rand(board)
        judge_state(board)

    def right_op():
        ob = board.copy()
        for i in range(4):
            right_move(board[i])
            right_add(board[i])
        if compare(ob, board):
            produce_rand(board)
        judge_state(board)

    def restart_op():
        for i in range(4):
            for j in range(4):
                board[i][j] = 0
        initi(board)
        update(board)

    def exit_op():
        window.destroy()

    # 创建按钮和标签
    va=tk.StringVar()
    va.set(0)
    tk.Label(window,text='Your Score is:',bg='gray80',font=('Arial',20)).place(x=750,y=60)
    tk.Label(window, textvariable=va, bg='gray96', font=('Arial', 20)).place(x=970, y=60)
    tk.Button(window, text='up', bg='gray80', font=('Arial',20),width=4, height=1, command=up_op).place(x=820, y=160)
    tk.Button(window, text='down', bg='gray80', font=('Arial',20),width=4, height=1, command=down_op).place(x=820, y=360)
    tk.Button(window, text='left', bg='gray80', font=('Arial',20),width=4, height=1, command=left_op).place(x=720, y=260)
    tk.Button(window, text='right', bg='gray80', font=('Arial',20),width=4, height=1, command=right_op).place(x=920, y=260)
    tk.Button(window, text='Restart', bg='gray86', font=('Arial', 20), width=6, height=1, command=restart_op).place(x=680,y=500)
    tk.Button(window, text='Exit', bg='gray86', font=('Arial', 20), width=4, height=1, command=exit_op).place(x=950,y=500)

    window.mainloop()

if __name__=='__main__':
    main()

你可能感兴趣的:(python,tkinter)