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之使用Python查询更新数据库
Nov 25 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
python画一个玫瑰和一个爱心
Aug 18 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
python实现最速下降法
Mar 24 Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
基于Django集成CAS实现流程详解
Nov 28 Python
python实现的人脸识别打卡系统
May 08 Python
Python 数据可视化之Bokeh详解
Nov 02 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php的ddos攻击解决方法
2015/01/08 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
代码生成器 document.write()
2007/04/15 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
js实现打字小游戏
2019/12/17 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
python3实现windows下同名进程监控
2018/06/21 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python脚本开机自启的实现方法
2019/06/28 Python
Python类反射机制使用实例解析
2019/12/30 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
社会工作专业求职信
2014/07/15 职场文书
毕业证委托书范文
2014/09/26 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
医生见习报告范文
2014/11/03 职场文书
小学优秀教师材料
2014/12/15 职场文书
教师个人学习总结
2015/02/11 职场文书