学python也有一段时间了,放假闲着没事就试着来写了个小游戏2048,在这里我直接将源代码奉上,供python初学者学习,希望能够对大家有所帮助。
总体来讲这个小游戏还是比较简单的,对于初学者而言做做这种比较简单的小游戏是一种很好的学习方法,一方面可以增强学习兴趣,增进学习的信心,另一方面还可以熟悉编程知识,首先给大家看看效果图吧!游戏初始界面的效果图为:
游戏运行中的效果图为:
源代码是最好的学习资料,废话不多说,接下来就直接上代码了:
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()