python 实现"神经衰弱"翻牌游戏


Posted in Python onNovember 09, 2020

"神经衰弱"翻牌游戏考察玩家的记忆力,游戏的开头会短时间给你看一小部分牌的图案,当玩家翻开两张相同图案牌的时候,会消除,和你的小伙伴比一比谁用时更短把。

源代码

import random, pygame, sys
from pygame.locals import *

FPS = 30 # frames per second, the general speed of the program
WINDOWWIDTH = 640 # size of window's width in pixels
WINDOWHEIGHT = 480 # size of windows' height in pixels
REVEALSPEED = 8 # speed boxes' sliding reveals and covers
BOXSIZE = 40 # size of box height & width in pixels
GAPSIZE = 10 # size of gap between boxes in pixels
BOARDWIDTH = 10 # number of columns of icons
BOARDHEIGHT = 7 # number of rows of icons
assert (BOARDWIDTH * BOARDHEIGHT) % 2 == 0, 'Board needs to have an even number of boxes for pairs of matches.'
XMARGIN = int((WINDOWWIDTH - (BOARDWIDTH * (BOXSIZE + GAPSIZE))) / 2)
YMARGIN = int((WINDOWHEIGHT - (BOARDHEIGHT * (BOXSIZE + GAPSIZE))) / 2)

#      R  G  B
GRAY   = (100, 100, 100)
NAVYBLUE = ( 60, 60, 100)
WHITE  = (255, 255, 255)
RED   = (255,  0,  0)
GREEN  = ( 0, 255,  0)
BLUE   = ( 0,  0, 255)
YELLOW  = (255, 255,  0)
ORANGE  = (255, 128,  0)
PURPLE  = (255,  0, 255)
CYAN   = ( 0, 255, 255)

BGCOLOR = NAVYBLUE
LIGHTBGCOLOR = GRAY
BOXCOLOR = WHITE
HIGHLIGHTCOLOR = BLUE

DONUT = 'donut'
SQUARE = 'square'
DIAMOND = 'diamond'
LINES = 'lines'
OVAL = 'oval'

ALLCOLORS = (RED, GREEN, BLUE, YELLOW, ORANGE, PURPLE, CYAN)
ALLSHAPES = (DONUT, SQUARE, DIAMOND, LINES, OVAL)
assert len(ALLCOLORS) * len(ALLSHAPES) * 2 >= BOARDWIDTH * BOARDHEIGHT, "Board is too big for the number of shapes/colors defined."

def main():
  global FPSCLOCK, DISPLAYSURF
  pygame.init()
  FPSCLOCK = pygame.time.Clock()
  DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))

  mousex = 0 # used to store x coordinate of mouse event
  mousey = 0 # used to store y coordinate of mouse event
  pygame.display.set_caption('Memory Game')

  mainBoard = getRandomizedBoard()
  revealedBoxes = generateRevealedBoxesData(False)

  firstSelection = None # stores the (x, y) of the first box clicked.

  DISPLAYSURF.fill(BGCOLOR)
  startGameAnimation(mainBoard)

  while True: # main game loop
    mouseClicked = False

    DISPLAYSURF.fill(BGCOLOR) # drawing the window
    drawBoard(mainBoard, revealedBoxes)

    for event in pygame.event.get(): # event handling loop
      if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE):
        pygame.quit()
        sys.exit()
      elif event.type == MOUSEMOTION:
        mousex, mousey = event.pos
      elif event.type == MOUSEBUTTONUP:
        mousex, mousey = event.pos
        mouseClicked = True

    boxx, boxy = getBoxAtPixel(mousex, mousey)
    if boxx != None and boxy != None:
      # The mouse is currently over a box.
      if not revealedBoxes[boxx][boxy]:
        drawHighlightBox(boxx, boxy)
      if not revealedBoxes[boxx][boxy] and mouseClicked:
        revealBoxesAnimation(mainBoard, [(boxx, boxy)])
        revealedBoxes[boxx][boxy] = True # set the box as "revealed"
        if firstSelection == None: # the current box was the first box clicked
          firstSelection = (boxx, boxy)
        else: # the current box was the second box clicked
          # Check if there is a match between the two icons.
          icon1shape, icon1color = getShapeAndColor(mainBoard, firstSelection[0], firstSelection[1])
          icon2shape, icon2color = getShapeAndColor(mainBoard, boxx, boxy)

          if icon1shape != icon2shape or icon1color != icon2color:
            # Icons don't match. Re-cover up both selections.
            pygame.time.wait(1000) # 1000 milliseconds = 1 sec
            coverBoxesAnimation(mainBoard, [(firstSelection[0], firstSelection[1]), (boxx, boxy)])
            revealedBoxes[firstSelection[0]][firstSelection[1]] = False
            revealedBoxes[boxx][boxy] = False
          elif hasWon(revealedBoxes): # check if all pairs found
            gameWonAnimation(mainBoard)
            pygame.time.wait(2000)

            # Reset the board
            mainBoard = getRandomizedBoard()
            revealedBoxes = generateRevealedBoxesData(False)

            # Show the fully unrevealed board for a second.
            drawBoard(mainBoard, revealedBoxes)
            pygame.display.update()
            pygame.time.wait(1000)

            # Replay the start game animation.
            startGameAnimation(mainBoard)
          firstSelection = None # reset firstSelection variable

    # Redraw the screen and wait a clock tick.
    pygame.display.update()
    FPSCLOCK.tick(FPS)


def generateRevealedBoxesData(val):
  revealedBoxes = []
  for i in range(BOARDWIDTH):
    revealedBoxes.append([val] * BOARDHEIGHT)
  return revealedBoxes


def getRandomizedBoard():
  # Get a list of every possible shape in every possible color.
  icons = []
  for color in ALLCOLORS:
    for shape in ALLSHAPES:
      icons.append( (shape, color) )

  random.shuffle(icons) # randomize the order of the icons list
  numIconsUsed = int(BOARDWIDTH * BOARDHEIGHT / 2) # calculate how many icons are needed
  icons = icons[:numIconsUsed] * 2 # make two of each
  random.shuffle(icons)

  # Create the board data structure, with randomly placed icons.
  board = []
  for x in range(BOARDWIDTH):
    column = []
    for y in range(BOARDHEIGHT):
      column.append(icons[0])
      del icons[0] # remove the icons as we assign them
    board.append(column)
  return board


def splitIntoGroupsOf(groupSize, theList):
  # splits a list into a list of lists, where the inner lists have at
  # most groupSize number of items.
  result = []
  for i in range(0, len(theList), groupSize):
    result.append(theList[i:i + groupSize])
  return result


def leftTopCoordsOfBox(boxx, boxy):
  # Convert board coordinates to pixel coordinates
  left = boxx * (BOXSIZE + GAPSIZE) + XMARGIN
  top = boxy * (BOXSIZE + GAPSIZE) + YMARGIN
  return (left, top)


def getBoxAtPixel(x, y):
  for boxx in range(BOARDWIDTH):
    for boxy in range(BOARDHEIGHT):
      left, top = leftTopCoordsOfBox(boxx, boxy)
      boxRect = pygame.Rect(left, top, BOXSIZE, BOXSIZE)
      if boxRect.collidepoint(x, y):
        return (boxx, boxy)
  return (None, None)


def drawIcon(shape, color, boxx, boxy):
  quarter = int(BOXSIZE * 0.25) # syntactic sugar
  half =  int(BOXSIZE * 0.5) # syntactic sugar

  left, top = leftTopCoordsOfBox(boxx, boxy) # get pixel coords from board coords
  # Draw the shapes
  if shape == DONUT:
    pygame.draw.circle(DISPLAYSURF, color, (left + half, top + half), half - 5)
    pygame.draw.circle(DISPLAYSURF, BGCOLOR, (left + half, top + half), quarter - 5)
  elif shape == SQUARE:
    pygame.draw.rect(DISPLAYSURF, color, (left + quarter, top + quarter, BOXSIZE - half, BOXSIZE - half))
  elif shape == DIAMOND:
    pygame.draw.polygon(DISPLAYSURF, color, ((left + half, top), (left + BOXSIZE - 1, top + half), (left + half, top + BOXSIZE - 1), (left, top + half)))
  elif shape == LINES:
    for i in range(0, BOXSIZE, 4):
      pygame.draw.line(DISPLAYSURF, color, (left, top + i), (left + i, top))
      pygame.draw.line(DISPLAYSURF, color, (left + i, top + BOXSIZE - 1), (left + BOXSIZE - 1, top + i))
  elif shape == OVAL:
    pygame.draw.ellipse(DISPLAYSURF, color, (left, top + quarter, BOXSIZE, half))


def getShapeAndColor(board, boxx, boxy):
  # shape value for x, y spot is stored in board[x][y][0]
  # color value for x, y spot is stored in board[x][y][1]
  return board[boxx][boxy][0], board[boxx][boxy][1]


def drawBoxCovers(board, boxes, coverage):
  # Draws boxes being covered/revealed. "boxes" is a list
  # of two-item lists, which have the x & y spot of the box.
  for box in boxes:
    left, top = leftTopCoordsOfBox(box[0], box[1])
    pygame.draw.rect(DISPLAYSURF, BGCOLOR, (left, top, BOXSIZE, BOXSIZE))
    shape, color = getShapeAndColor(board, box[0], box[1])
    drawIcon(shape, color, box[0], box[1])
    if coverage > 0: # only draw the cover if there is an coverage
      pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, coverage, BOXSIZE))
  pygame.display.update()
  FPSCLOCK.tick(FPS)


def revealBoxesAnimation(board, boxesToReveal):
  # Do the "box reveal" animation.
  for coverage in range(BOXSIZE, (-REVEALSPEED) - 1, -REVEALSPEED):
    drawBoxCovers(board, boxesToReveal, coverage)


def coverBoxesAnimation(board, boxesToCover):
  # Do the "box cover" animation.
  for coverage in range(0, BOXSIZE + REVEALSPEED, REVEALSPEED):
    drawBoxCovers(board, boxesToCover, coverage)


def drawBoard(board, revealed):
  # Draws all of the boxes in their covered or revealed state.
  for boxx in range(BOARDWIDTH):
    for boxy in range(BOARDHEIGHT):
      left, top = leftTopCoordsOfBox(boxx, boxy)
      if not revealed[boxx][boxy]:
        # Draw a covered box.
        pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))
      else:
        # Draw the (revealed) icon.
        shape, color = getShapeAndColor(board, boxx, boxy)
        drawIcon(shape, color, boxx, boxy)


def drawHighlightBox(boxx, boxy):
  left, top = leftTopCoordsOfBox(boxx, boxy)
  pygame.draw.rect(DISPLAYSURF, HIGHLIGHTCOLOR, (left - 5, top - 5, BOXSIZE + 10, BOXSIZE + 10), 4)


def startGameAnimation(board):
  # Randomly reveal the boxes 8 at a time.
  coveredBoxes = generateRevealedBoxesData(False)
  boxes = []
  for x in range(BOARDWIDTH):
    for y in range(BOARDHEIGHT):
      boxes.append( (x, y) )
  random.shuffle(boxes)
  boxGroups = splitIntoGroupsOf(8, boxes)

  drawBoard(board, coveredBoxes)
  for boxGroup in boxGroups:
    revealBoxesAnimation(board, boxGroup)
    coverBoxesAnimation(board, boxGroup)


def gameWonAnimation(board):
  # flash the background color when the player has won
  coveredBoxes = generateRevealedBoxesData(True)
  color1 = LIGHTBGCOLOR
  color2 = BGCOLOR

  for i in range(13):
    color1, color2 = color2, color1 # swap colors
    DISPLAYSURF.fill(color1)
    drawBoard(board, coveredBoxes)
    pygame.display.update()
    pygame.time.wait(300)


def hasWon(revealedBoxes):
  # Returns True if all the boxes have been revealed, otherwise False
  for i in revealedBoxes:
    if False in i:
      return False # return False if any boxes are covered.
  return True


if __name__ == '__main__':
  main()

运行效果:

python 实现"神经衰弱"翻牌游戏

以上就是python 实现"神经衰弱"翻牌游戏的详细内容,更多关于python "神经衰弱"翻牌游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
初学python数组的处理代码
Jan 04 Python
python支持断点续传的多线程下载示例
Jan 16 Python
Python写的创建文件夹自定义函数mkdir()
Aug 25 Python
kNN算法python实现和简单数字识别的方法
Nov 18 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
Python从零开始创建区块链
Mar 06 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Django中提示消息messages的设置方式
Nov 15 Python
Python json转字典字符方法实例解析
Apr 13 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
Python字典dict常用方法函数实例
Nov 09 #Python
Python实现哲学家就餐问题实例代码
Nov 09 #Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 #Python
Python暴力破解Mysql数据的示例
Nov 09 #Python
python 实现一个图形界面的汇率计算器
Nov 09 #Python
python 读取串口数据的示例
Nov 09 #Python
Cpython解释器中的GIL全局解释器锁
Nov 09 #Python
You might like
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
小程序实现投票进度条
2019/11/20 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
python GUI实例学习
2017/11/21 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
python使用Matplotlib画饼图
2018/09/25 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python中Unittest框架的具体使用
2019/08/27 Python
pip install命令安装扩展库整理
2021/03/02 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
一分钟演讲稿
2014/04/30 职场文书
相亲大会策划方案
2014/06/05 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
法院授权委托书格式
2014/09/28 职场文书
技术股东合作协议书
2014/12/02 职场文书
基于Python实现nc批量转tif格式
2022/08/14 Python