OpenCV Python实现拼图小游戏

基于OpenCV实现拼图版小游戏,供大家参考,具体内容如下

效果展示

实现

思路

1.对图像进行分割,分割成m*n个子图
2.打乱子图的顺序
3.将子图重新组成一幅新的图片并显示
4.添加鼠标点击响应动作,交换鼠标依次点击的两张图的位置
5.每次交换后,判断是否与原图是否一致

python代码

import cv2 as cv
import numpy
import random
import math

src = cv.imread("D:\\CvPic\\1.jpg")
print(src.shape)
h = src.shape[0]
w = src.shape[1]
c = src.shape[2]

row = 3
col = 3

offset_h = h/row
offset_w = w/col

firstClick = False
clickIdx = [0,0]

tileList = []
def calPicIdx(x, y):
 print(str(y)+" "+str(h/col))
 i = y//(offset_h)
 print(str(y%offset_h)+" "+str(offset_w))
 j = math.ceil((x%w)/offset_w)
 idx = i*row+j
 print("i:"+str(i)+" j:"+str(j)+" idx:"+str(idx))
 return int(idx)

def onMouse(event, x, y, flag ,params):
 if event==cv.EVENT_LBUTTONDOWN:
  print("left button down:"+str(x)+" "+str(y))
  idx = calPicIdx(x, y)
  global firstClick
  firstClick = not firstClick
  print(firstClick)
  if firstClick:
   clickIdx[0] = idx
  else:
   clickIdx[1] = idx
   tileList[clickIdx[0]], tileList[clickIdx[1]] = tileList[clickIdx[1]], tileList[clickIdx[0]]
   for i in range(0, row):
    for j in range (0, col):
     dst[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1] = tileList[i*row+j]
   cv.imshow("dst", dst)

   difference = cv.subtract(dst, src2)
   result = not numpy.any(difference) #if difference is all zeros it will return False
   print("result:"+str(result))
  print(clickIdx)

# --------------splite image into n*n tile--------------

tile = numpy.zeros((offset_h-1, offset_w-1, c),numpy.uint8)

for i in range(0, row):
 for j in range (0, col):
  tile = src[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1]
  tileList.append(tile)
  # cv.imshow("tile", tile)

# --------------ramdom the tiles--------------------
print(len(tileList))
for i in range(len(tileList)-1,0,-1):
 randomIdx = random.randint(0,i-1)
 print("swap:"+str(random.randint(0,i-1))+" "+str(i))
 tileList[i], tileList[randomIdx] = tileList[randomIdx], tileList[i]

# debug show every tile
# for k,tile in enumerate(tileList):
# cv.imshow("tile"+str(k), tile)

dst = numpy.zeros((h, w, c), numpy.uint8)
for i in range(0, row):
 for j in range (0, col):
  dst[i*offset_h:(i+1)*offset_h-1, j*offset_w:(j+1)*offset_w-1] = tileList[i*row+j]
cv.namedWindow("dst")
cv.setMouseCallback("dst", onMouse)
cv.imshow("dst", dst)

# -------------match the origin image and now--------------
src2 = src.copy()
for i in range(1, row):
 src2[i*offset_h-1:i*offset_h]= numpy.zeros((1,w,3), numpy.uint8)
 for j in range(1, col):
  src2[0:h,j*offset_w-1:j*offset_w]= numpy.zeros((h,1,3), numpy.uint8)
# cv.imshow("src2", src2)

cv.waitKey(0)

参考

90年代经典“手游”—拼图板小游戏Opencv实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-03-22

OpenCV实现拼图板小游戏

80后可能还对儿时玩过的一种经典木质的拼图板游戏记忆犹新,一般是一种4*4或5*5规格的手持活动板,通过挪动每个小板子的位置,拼出来板子上完整的图像,那时候还没有网吧,手机也还是大哥大的天下,所以这也可以算得上是最早的"手游"了吧. 今天我们用OpenCV来复现一下儿时的经典! 代码: #include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/im

Opencv实现拼图板游戏

80后可能还对儿时玩过的一种经典木质的拼图板游戏记忆犹新,一般是一种4*4或5*5规格的手持活动板,通过挪动每个小板子的位置,拼出来板子上完整的图像,那时候还没有网吧,手机也还是大哥大的天下,所以这也可以算得上是最早的"手游"了吧-- 简单的就是经典的,现在的Windows 7小工具里还保留了这个小游戏,当然你可能从来没有留意过~,就是下边的这个: 可以在控制面板->外观->桌面小工具里调出来. 这里准备用opencv里的模板匹配,通过鼠标响应事件来实现这个小游戏. 首先第

python实现拼图小游戏

Python小白一只,正在成长,程序自己设计,很多不足,算法很多地方能优化.欢迎大佬来指教. 游戏效果 创建设置类,储存游戏基础数据 可以不使用这个类,在程序中直接使用相应的数据.但是使用这个类更便于程序阅读和修改基础数据. class Settings: def __init__(self): self.picture_num = 4 # 每行图片数 self.screen_width = 408 # 窗口宽度 self.screen_length = 809 # 窗口长度 self.pict

Python加pyGame实现的简单拼图游戏实例

本文实例讲述了Python加pyGame实现的简单拼图游戏.分享给大家供大家参考.具体实现方法如下: import pygame, sys, random from pygame.locals import * # 一些常量 WINDOWWIDTH = 500 WINDOWHEIGHT = 500 BACKGROUNDCOLOR = (255, 255, 255) BLUE = (0, 0, 255) BLACK = (0, 0, 0) FPS = 40 VHNUMS = 3 CELLNUMS

python 使用pygame工具包实现贪吃蛇游戏(多彩版)

今天我们用python和python的工具包pygame来编写一个贪吃蛇的小游戏 贪吃蛇游戏功能介绍 贪吃蛇的游戏规则如下: 通过上下左右键或者WASD键来移动蛇来,让它吃到食物,每吃到食物,蛇的长度变长,并获得分数.若蛇碰到游戏边际 或者自身,则蛇死亡,游戏结束. 游戏设计思路 根据游戏规则,我们需要: 1.初始化游戏环境. 2.初始化蛇.食物 3.监听键盘动作 4.蛇的运动,吃食物,是否死亡 5.该局游戏结束,是否还有再玩. 其中的难点在于如何在屏幕上展示蛇的运动,其实我们肉眼所见的蛇的运动

Python加载带有注释的Json文件实例

由于json文件不支持注释,所以如果在json文件中标记了注释,则使用python中的json.dump()无法加载该json文件. 本文旨在解决当定义"//"为json注释时,如何正确解析有注释的json文件. 程序实现 # encoding: utf-8 import json import re import sys reload(sys) sys.setdefaultencoding('utf8') CAUTION_PRINT_HEAD = 'caution: ' # 创建一个

python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

最近又回顾了下Websocket,发现已经忘的七七八八了.于是用js写了客户端,用python写了服务端,来复习一下这方面的知识. 先看一下python简单聊天工具最终效果 一个客户端连上服务的并发送消息 另一个客户端连上服务的并发送消息 服务的收到客户端的全部消息并返回消息 一个客户端掉线并不影响其它socket连接 列取全部连接客户端对象和当前发消息的客户端对象 先安装websockets pip install websockets python简单聊天工具实例源码 Python聊天工具服

python使用pygame模块实现坦克大战游戏

本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹,炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类,分别是玩家类,敌人类,炮弹类及地图类,开始游戏界面以及结束界面,血条等等. 开始coding. 主函数,new一个对象(java乱入emmm),声明一个对象. # encoding : utf-8 # anthor : comi from gameloop import * from pygame

利用原生的JavaScript实现简单拼图游戏

前言 本篇主要讲解,如何利用原生的 JavaScript 来实现一个简单的拼图小游戏. 一.游戏的基础逻辑 想用一门语言来开发游戏,必须先了解如何使用这门语言来实现一些基础逻辑,比如图像的绘制.交互的处理.定时器等. 1.图形绘制 图形绘制是一切的基础,这里使用 JavaScript 在 canvas 上进行绘制.即先在 html 中创建 canvas 元素,然后在 JavaScript 中,通过 id 拿到这个元素,并且通过 canvas 拿到对应的上下文环境 context ,为后续的绘图做

Python实现的简单算术游戏实例

本文实例讲述了Python实现的简单算术游戏.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python from operator import add, sub from random import randint, choice ops = {'+': add, '-':sub} #定义一个字典 MAXTRIES = 2 def doprob(): op = choice('+-') #用choice从'+-'中随意选择操作符 nums = [randint(1,

Python实现的简单hangman游戏实例

本文实例讲述了Python实现的简单hangman游戏.分享给大家供大家参考.具体如下: #!/usr/bin/env python import random import cPickle class Hangman(object): '''A simple hangman game that tries to improve your vocabulary a bit ''' def __init__(self): # the variables used, this is not nece

python使用pygame框架实现推箱子游戏

本代码来源于 <Python和Pygame游戏开发指南>中的 Star Pusher 游戏,供大家参考,具体内容如下 # Star Pusher (a Sokoban clone) # By Al Sweigart al@inventwithpython.com # http://inventwithpython.com/pygame # Released under a "Simplified BSD" license import random, sys, copy,

C语言编写简单拼图游戏

本文为大家分享了使用C语言编写一个简单的拼图游戏,供大家参考,具体内容如下 制作一款拼图小游戏 #include <graphics.h> // 引用图形库头文件 #include <conio.h> #include<stdio.h> typedef enum { UP, DOWN, LEFT, RIGHT, UNKOWN } DRCT; const int level = 5; DRCT getKey() { char key; DRCT ret; key = _g