使用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使用arcpy.mapping模块批量出图
Mar 06 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
详解python单元测试框架unittest
Jul 02 Python
Python实现的特征提取操作示例
Dec 03 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
python绘制动态曲线教程
Feb 24 Python
python实现飞船游戏的纵向移动
Apr 24 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
python实现按日期归档文件
Jan 30 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 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
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
服务器安全设置的几个注册表设置
2007/07/28 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
境外导游求职信
2014/02/27 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
单位接收函格式
2015/01/30 职场文书
销售业务员岗位职责
2015/02/13 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python
ant design vue的form表单取值方法
2022/06/01 Vue.js