使用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中文分词实现方法(安装pymmseg)
Jun 14 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
Python学生信息管理系统修改版
Mar 13 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
Python中super函数用法实例分析
Mar 18 Python
python与字符编码问题
May 24 Python
PyTorch加载自己的数据集实例详解
Mar 18 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
python装饰器三种装饰模式的简单分析
Sep 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
各种战术和打法的原创者
2020/03/04 星际争霸
PHP的FTP学习(三)
2006/10/09 PHP
php GUID生成函数和类
2014/03/10 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
js闭包学习心得总结
2018/04/17 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Python中IPYTHON入门实例
2015/05/11 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
python实现比较文件内容异同
2018/06/22 Python
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
毕业生求职简历的自我评价
2013/10/23 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
网聊搭讪开场白
2015/05/28 职场文书
办公用品管理制度
2015/08/04 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Python如何使用循环结构和分支结构
2022/04/13 Python