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实现简单socket通信的方法
Apr 19 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
python实现聚类算法原理
Feb 12 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
python的concat等多种用法详解
Nov 28 Python
python画双y轴图像的示例代码
Jul 07 Python
详解python中各种文件打开模式
Jan 19 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 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
Web程序工作原理详解
2014/12/25 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
web打印小结
2017/01/11 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
python编写的最短路径算法
2015/03/25 Python
pandas多级分组实现排序的方法
2018/04/20 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python configparser模块操作代码实例
2020/06/08 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
python 装饰器的基本使用
2021/01/13 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
《王二小》教学反思
2014/02/27 职场文书
保护环境倡议书范文
2014/05/13 职场文书
房屋出售授权委托书
2014/10/12 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
关于做家务的心得体会
2016/01/23 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书