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 相关文章推荐
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
详解 Python 读写XML文件的实例
Aug 02 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
通过shell+python实现企业微信预警
Mar 07 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
python操作gitlab API过程解析
Dec 27 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Python flask框架端口失效解决方案
Jun 04 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
vue多次循环操作示例
2019/02/08 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
Python中的各种装饰器详解
2015/04/11 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
在python中做正态性检验示例
2019/12/09 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
什么时候用assert
2015/05/08 面试题
银行办公室岗位职责
2014/03/10 职场文书
先进党组织事迹材料
2014/12/26 职场文书
大班下学期个人总结
2015/02/13 职场文书