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 24 Python
实例解析Python中的__new__特殊方法
Jun 02 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
python字符串的拼接方法总结
Nov 18 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 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&amp;mysql 日期操作小记
2012/02/27 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
python optparse模块使用实例
2015/04/09 Python
Python Property属性的2种用法
2015/06/21 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
Python变量类型知识点总结
2019/02/18 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python中wheel的用法整理
2020/06/15 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
寄语十八大感言
2014/02/07 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
2014年图书室工作总结
2014/12/09 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
Python 语言实现六大查找算法
2021/06/30 Python
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL