python pygame实现2048游戏


Posted in Python onNovember 20, 2018

实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码。

效果图

python pygame实现2048游戏

python pygame实现2048游戏

代码

# -*- coding: utf-8 -*-
#!/usr/bin/python
'''
Created on May 31, 2014
@author: yuanzi
'''
import random
import sys
import pygame
from pygame.locals import *
 
PIXEL = 150
SCORE_PIXEL = 100
SIZE = 4
 
# 地图的类
class Map:
  def __init__(self, size):
    self.size = size
    self.score = 0
    self.map = [[0 for i in range(size)] for i in range(size)]
    self.add()
    self.add()
  
  # 新增2或4,有1/4概率产生4
  def add(self):
    while True:
      p = random.randint(0, self.size * self.size - 1)
      if self.map[p / self.size][p % self.size] == 0:
        x = random.randint(0, 3) > 0 and 2 or 4
        self.map[p / self.size][p % self.size] = x
        self.score += x
        break
  
  # 地图向左靠拢,其他方向的靠拢可以通过适当旋转实现,返回地图是否更新
  def adjust(self):
    changed = False
    for a in self.map:
      b = []
      last = 0
      for v in a:
        if v != 0:
          if v == last:
            b.append(b.pop() << 1)
            last = 0
          else:
            b.append(v)
            last = v
      b += [0] * (self.size - len(b))
      for i in range(self.size):
        if a[i] != b[i]:
          changed = True
      a[ : ] = b
    return changed
  
  # 逆时针旋转地图90度
  def rotate90(self):
    self.map = [[self.map[c][r] for c in range(self.size)] for r in reversed(range(self.size))]
  
  # 判断游戏结束
  def over(self):
    for r in range(self.size):
      for c in range(self.size):
        if self.map[r][c] == 0:
          return False
    for r in range(self.size):
      for c in range(self.size - 1):
        if self.map[r][c] == self.map[r][c + 1]:
          return False
    for r in range(self.size - 1):
      for c in range(self.size):
        if self.map[r][c] == self.map[r + 1][c]:
          return False
    return True
  
  def moveUp(self):
    self.rotate90()
    if self.adjust():
      self.add()
    self.rotate90()
    self.rotate90()
    self.rotate90()
  
  def moveRight(self):
    self.rotate90()
    self.rotate90()
    if self.adjust():
      self.add()
    self.rotate90()
    self.rotate90()
  
  def moveDown(self):
    self.rotate90()
    self.rotate90()
    self.rotate90()
    if self.adjust():
      self.add()
    self.rotate90()
  
  def moveLeft(self):
    if self.adjust():
      self.add()
 
# 更新屏幕
def show(map):
  for i in range(SIZE):
    for j in range(SIZE):
      # 背景颜色块
      screen.blit(map.map[i][j] == 0 and block[(i + j) % 2] or block[2 + (i + j) % 2], (PIXEL * j, PIXEL * i))
      # 数值显示
      if map.map[i][j] != 0:
        map_text = map_font.render(str(map.map[i][j]), True, (106, 90, 205))
        text_rect = map_text.get_rect()
        text_rect.center = (PIXEL * j + PIXEL / 2, PIXEL * i + PIXEL / 2)
        screen.blit(map_text, text_rect)
  # 分数显示
  screen.blit(score_block, (0, PIXEL * SIZE))
  score_text = score_font.render((map.over() and "Game over with score " or "Score: ") + str(map.score), True, (106, 90, 205))
  score_rect = score_text.get_rect()
  score_rect.center = (PIXEL * SIZE / 2, PIXEL * SIZE + SCORE_PIXEL / 2)
  screen.blit(score_text, score_rect)
  pygame.display.update()
 
map = Map(SIZE)
pygame.init()
screen = pygame.display.set_mode((PIXEL * SIZE, PIXEL * SIZE + SCORE_PIXEL))
pygame.display.set_caption("2048")
block = [pygame.Surface((PIXEL, PIXEL)) for i in range(4)]
# 设置颜色
block[0].fill((152, 251, 152))
block[1].fill((240, 255, 255))
block[2].fill((0, 255, 127))
block[3].fill((225, 255, 255))
score_block = pygame.Surface((PIXEL * SIZE, SCORE_PIXEL))
score_block.fill((245, 245, 245))
# 设置字体
map_font = pygame.font.Font(None, PIXEL * 2 / 3)
score_font = pygame.font.Font(None, SCORE_PIXEL * 2 / 3)
clock = pygame.time.Clock()
show(map)
 
while not map.over():
  # 12为实验参数
  clock.tick(12)
  for event in pygame.event.get():
    if event.type == QUIT:
      sys.exit()
  # 接收玩家操作
  pressed_keys = pygame.key.get_pressed()
  if pressed_keys[K_w] or pressed_keys[K_UP]:
    map.moveUp()
  elif pressed_keys[K_s] or pressed_keys[K_DOWN]:
    map.moveDown()
  elif pressed_keys[K_a] or pressed_keys[K_LEFT]:
    map.moveLeft()
  elif pressed_keys[K_d] or pressed_keys[K_RIGHT]:
    map.moveRight()
  show(map)
 
# 游戏结束
pygame.time.delay(3000)

后续可以考虑实现动画和AI。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
Python使用gRPC传输协议教程
Oct 16 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
opencv设置采集视频分辨率方式
Dec 10 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
PyQt5实现登录页面
May 30 Python
python pygame模块编写飞机大战
Nov 20 #Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 #Python
python版飞机大战代码分享
Nov 20 #Python
pygame实现雷电游戏雏形开发
Nov 20 #Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 #Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 #Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 #Python
You might like
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
Linux中为php配置伪静态
2014/12/17 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
Python内置数据类型详解
2014/08/18 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python中str.format()详解
2017/03/12 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
浅析python继承与多重继承
2018/09/13 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
会计岗位职责
2013/11/08 职场文书
个人自荐书
2013/12/20 职场文书
大学学习生活感言
2014/01/18 职场文书
领班岗位职责范文
2014/02/06 职场文书
运动会广播稿100字
2014/09/14 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android