使用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变量作用范围实例分析
Jul 07 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
python如何获取服务器硬件信息
May 11 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
pycharm远程调试openstack代码
Nov 21 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
python实现可逆简单的加密算法
Mar 22 Python
Python搭建HTTP服务过程图解
Dec 14 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 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
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
php 魔术方法详解
2014/11/11 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
python中enumerate函数用法实例分析
2015/05/20 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
pandas 将索引值相加的方法
2018/11/15 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Python 列表的清空方式
2020/01/13 Python
python代码xml转txt实例
2020/03/10 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Python调用C语言程序方法解析
2020/07/07 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
搬家公司的创业计划书
2014/01/01 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
工程承包协议书
2014/04/22 职场文书
趵突泉导游词
2015/02/03 职场文书
篮球拉拉队口号
2015/12/25 职场文书
导游词之上海豫园
2019/10/24 职场文书