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脚本
Feb 10 Python
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
flask入门之表单的实现
Jul 18 Python
python实现C4.5决策树算法
Aug 29 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 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
一个odbc连mssql分页的类
2006/10/09 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
软件测试有哪些?什么是配置项?
2012/02/12 面试题
启动一个线程是用run()还是start()
2016/12/25 面试题
酒后驾车标语
2014/06/30 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
债务授权委托书范本
2014/10/17 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
接待员岗位职责范本
2015/04/15 职场文书
责任书格式
2019/04/18 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
利用javaScript处理常用事件详解
2021/04/14 Javascript
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
python opencv通过按键采集图片源码
2021/05/20 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js