使用graphics.py实现2048小游戏


Posted in Python onMarch 10, 2015

1、过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大。正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN一位朋友封装的model.py(2048逻辑部分)
2、由于是练手的所以不免有写的不好的地方请大家喷的轻点。

先看看演示图片

使用graphics.py实现2048小游戏

附上源码:

2048主程

#-*-coding:utf-8-*-

#python3.3.5

from graphics import*

from tkinter.messagebox import askquestion

from tkinter.messagebox import showinfo      

import time,random,model,configparser

import GUI_2048 as g

class Application():

    '''

    初始化应用程序

    '''

    def __init__(self): 

        self.matrix = model.init()

        self.win = g.init()

        self.create_r_2048(self.win)

        self.show_matrix(self.matrix) 

        self.win.master.bind("<Key>", self.bind_key)

        while 1:

            update()

    '''

    创建网格上的16个方格、最佳成绩、当前分数

    '''

    def create_r_2048(self,win): 

        p = Point(10, 190)

        n = 4

        self.rt =  [0 for row in range(n*n)]

        for i in range(n): 

            for a in range(n): 

                _p = Point(p.x + 60*i, p.y + 60*a) 

                self.rt[i+4*a] = g.rectangle_2048(win,_p)

        #最佳成绩

        self.zjcj = g._text(win,Point(135, 60 + 30),Point(135 + 115, 60 + 30 + 30),self.getMaxScore())

        #当前分数

        self.dqjf = g._text(win,Point(135, 120 + 30),Point(135 + 115, 120 + 30 + 30),'0')

    '''

    从配置文件中获取最佳成绩

    '''     

    def getMaxScore(self):

        config = configparser.ConfigParser() 

        config.read('config.ini')  

        maxScore = config.get("Score", "maxScore") 

        return maxScore

    '''

    把最佳成绩写入配置文件

    ''' 

    def setMaxScore(self,score):

        config = configparser.ConfigParser()

        config.optionxform = str

        config.read('config.ini')  

        config.set("Score", "maxScore",str(score)) 

        config.write(open("config.ini", "w"))

    '''

    初始化数据和界面,在游戏结束后调用

    '''

    def my_init(self):

        maxScore = self.getMaxScore()

        if int(maxScore) < model.getScore(): 

            self.setMaxScore(model.getScore())

            self.zjcj.setText(model.getScore())

        matrix = model.init() 

        self.dqjf.setText(model.getScore())

        return matrix

    '''

    绑定键盘事件 捕获上下左右和Q键

    '''   

    def bind_key(self, event):

        '''

        key event

        '''

        if model.is_over(self.matrix):

            if askquestion("GAME OVER","GAME OVER!\nDo you want to init it?") == 'yes':

                self.matrix = self.my_init() 

                self.show_matrix(self.matrix)

                return

            else:

                self.win.close()

        else:

            if event.keysym.lower() == "q":

                self.win.close()

            elif event.keysym == "Left":

                self.matrix = model.move_left(self.matrix)

            elif event.keysym == "Right":

                self.matrix = model.move_right(self.matrix)

            elif event.keysym == "Up":

                self.matrix = model.move_up(self.matrix)

            elif event.keysym == "Down":

                self.matrix = model.move_down(self.matrix)  

            if event.keysym in ["q", "Left", "Right", "Up", "Down"]:

                try:

                    self.matrix = model.insert(self.matrix)

                    self.dqjf.setText(model.getScore())

                    self.show_matrix(self.matrix)

                except:

                    pass

        if model.is_win(self.matrix):

            if askquestion("WIN","You win the game!\nDo you want to init it?") == 'yes':

                self.matrix = self.my_init() 

                self.show_matrix(self.matrix)

                return

            else:

                self.win.close() 

    '''

    从二维数组中获取结果数据并展示在16方格中

    '''

    def show_matrix(self, matrix): 

        for i in range(16):

            num = matrix[i//4][i%4]

            print(num)

            if num == 0:

                num = ''

            self.rectangle_2048(i,num)

    '''

    对16个方格做颜色和数字变更

    '''

    def rectangle_2048(self,i,num): 

        c = color_rgb(200, 190, 180)

        if num == 2:

            c = color_rgb(240, 230, 220)

        elif num == 4:

            c = color_rgb(240, 220, 200) 

        elif num == 8:

            c = color_rgb(240, 180, 120)  

        elif num == 16:

            c = color_rgb(240, 140, 90)  

        elif num == 32:

            c = color_rgb(240, 120, 90)  

        elif num == 64:

            c = color_rgb(240, 90, 60)  

        elif num == 128:

            c = color_rgb(240, 90, 50)   

        elif num == 256:

            c = color_rgb(240, 200, 70) 

        elif num == 512:

            c = color_rgb(240, 200, 70)  

        elif num == 1024:

            c = color_rgb(0, 130, 0)  

        elif num == 2048:

            c = color_rgb(0, 130, 0)

        '''

        循环设置颜色和数字

        '''

        self.rt[i][0].setFill(c)

        self.rt[i][1].setText(num)

#main

Application()

2048gui部分
#-*-coding:utf-8-*-

#python3.3.5

from graphics import*

#初始化并构建2048界面

def init():

    win = GraphWin("2048", 260, 450)

    win.master.geometry('+400+150')  #屏幕位置

    c = color_rgb(206, 194, 180) 

    win.setBackground(c)

    hint(win)

    _title(win)

    _grid(win)

    maxScore(win)

    curScore(win) 

    return win 

#2048方格

def rectangle_2048(win, p1 = Point(10, 10),txt='',c = color_rgb(206, 194, 180)): 

    p2 = Point(p1.x + 60, p1.y + 60)

    r = _rectangle(win,p1,p2,c)

    t = _text(win,p1,p2,txt)

    return r,t

#挂牌

def hint(win,p1 = Point(10, 10)): 

    p2 = Point(p1.x + 240, p1.y + 40)

    c = color_rgb(187, 173, 164)

    _rectangle(win,p1,p2,c)

    t = _text(win,p1,p2,'真英雄 挑战2048~') 

    t.setTextColor(color_rgb(238, 231, 221))

    return t

#标题logo

def _title(win,p1 = Point(10, 60)): 

    p2 = Point(p1.x + 120, p1.y + 120)

    c = color_rgb(228, 184, 0)

    _rectangle(win,p1,p2,c)

    t = Text(Point((p2.x + p1.x) / 2, (p2.y + p1.y) / 2), '2048')

    t.setSize(35)

    t.setStyle('bold')

    t.setTextColor('white')

    t.draw(win)

#画正方形

def _rectangle(win,p1,p2,c):

    r = Rectangle(p1, p2) 

    r.setFill(c) 

    r.setOutline(color_rgb(198, 186, 174))

    r.draw(win)

    return r

#写文字    

def _text(win,p1,p2,txt):

    t = Text(Point((p2.x + p1.x) / 2, (p2.y + p1.y) / 2), txt)

    t.draw(win)

    return t

#网格

def _grid(win,p1 = Point(10, 190)):

    #上面 

    p_u_1 = Point(p1.x + 60, p1.y) 

    p_u_2 = Point(p1.x + 120, p1.y)

    p_u_3 = Point(p1.x + 180, p1.y)

    p_u_4 = Point(p1.x + 240, p1.y)

    #左面

    p_l_1 = Point(p1.x, p1.y + 60) 

    p_l_2 = Point(p1.x, p1.y + 120)

    p_l_3 = Point(p1.x , p1.y + 180)

    p_l_4 = Point(p1.x , p1.y + 240)

    #右面

    p_r_1 = Point(p1.x + 240, p1.y + 60)

    p_r_2 = Point(p1.x + 240, p1.y + 120)

    p_r_3 = Point(p1.x + 240, p1.y + 180)

    p_r_4 = Point(p1.x + 240, p1.y + 240)

    #下面

    p_d_1 = Point(p1.x + 60 , p1.y + 240)

    p_d_2 = Point(p1.x + 120 , p1.y + 240)

    p_d_3 = Point(p1.x + 180 , p1.y + 240)

    p_d_4 = Point(p1.x + 240 , p1.y + 240)

    c = color_rgb(198, 186, 174) 

    #画横线

    l_W_1 = Line(p1, p_u_4)

    l_W_2 = Line(p_l_1, p_r_1)

    l_W_3 = Line(p_l_2, p_r_2)

    l_W_4 = Line(p_l_3, p_r_3)

    l_W_5 = Line(p_l_4, p_r_4)

    l_W_1.setFill(c)

    l_W_2.setFill(c)

    l_W_3.setFill(c)

    l_W_4.setFill(c)

    l_W_5.setFill(c)

    l_W_1.draw(win)

    l_W_2.draw(win)

    l_W_3.draw(win)

    l_W_4.draw(win)

    l_W_5.draw(win)

    #画竖线

    l_H_1 = Line(p1, p_l_4)

    l_H_2 = Line(p_u_1, p_d_1)

    l_H_3 = Line(p_u_2, p_d_2)

    l_H_4 = Line(p_u_3, p_d_3)

    l_H_5 = Line(p_u_4, p_d_4)

    l_H_1.setFill(c)

    l_H_2.setFill(c)

    l_H_3.setFill(c)

    l_H_4.setFill(c)

    l_H_5.setFill(c)

    l_H_1.draw(win)

    l_H_2.draw(win)

    l_H_3.draw(win)

    l_H_4.draw(win)

    l_H_5.draw(win)

#最佳成绩

def maxScore(win,p1 = Point(135, 60)): 

    p2 = Point(p1.x + 115, p1.y + 30)

    c = color_rgb(187, 173, 164)

    _rectangle(win,p1,p2,c)

    _text(win,p1,p2,'最佳成绩:')

#当前分数

def curScore(win,p1 = Point(135, 120)): 

    p2 = Point(p1.x + 115, p1.y + 30)

    c = color_rgb(187, 173, 164)

    _rectangle(win,p1,p2,c)

    _text(win,p1,p2,'当前分数:')

以上就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
用实例说明python的*args和**kwargs用法
Nov 01 Python
利用Python进行异常值分析实例代码
Dec 07 Python
python机器学习之神经网络(三)
Dec 20 Python
Scrapy框架使用的基本知识
Oct 21 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
基于Python实现简单学生管理系统
Jul 24 Python
python request 模块详细介绍
Nov 10 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
python3判断IP地址的方法
Mar 04 Python
Python实现去除代码前行号的方法
Mar 10 #Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 #Python
Python获取DLL和EXE文件版本号的方法
Mar 10 #Python
Python接收Gmail新邮件并发送到gtalk的方法
Mar 10 #Python
Python创建xml的方法
Mar 10 #Python
Python实现生成简单的Makefile文件代码示例
Mar 10 #Python
Python和GO语言实现的消息摘要算法示例
Mar 10 #Python
You might like
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
Ajax PHP分页演示
2007/01/02 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
javascript window对象属性整理
2009/10/24 Javascript
javascript 面向对象的JavaScript类
2010/05/04 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
javascript实现数独解法
2015/03/14 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
为Python的web框架编写前端模版的教程
2015/04/30 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
pyspark 随机森林的实现
2020/04/24 Python
python3跳出一个循环的实例操作
2020/08/18 Python
英语专业推荐信
2013/11/16 职场文书
与美同行演讲稿
2014/09/13 职场文书
教师自查自纠材料
2014/10/14 职场文书
民主评议党员工作总结
2014/10/20 职场文书
计划生育工作汇报
2014/10/28 职场文书
护士求职简历自我评价
2015/03/10 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
600字作文之感受大自然
2019/11/27 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
springboot用户数据修改的详细实现
2022/04/06 Java/Android