【Python小游戏】智商爆棚,推荐一款益智类亲子娱乐首选—某程序员老爸:成语编成填空“游戏”,贪玩女儿1天牢记500词(厉害了我的Python)

news2024/9/29 18:49:18

前言

成语填空想必大家都是十分熟悉的了,特别是有在上小学的家长肯定都有十分深刻的印象。

在我们的认知里看图猜成语不就是一些小儿科的东西吗?

当然了你也别小看了成语调控小游戏,有的时候知识储备不够,你还真的不一定猜得出来是什

么?更重要的是有的时候给你这个提示你都看不懂,那你就拿他没办法。

所有文章完整的素材+源码都在👇👇

粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

——小学语文必备

成语是小学语文非常重要的一个知识点,几乎是逢考必有,作为基础,自然是需要长期的积

累,并且需要积累到一定的数量,有了一定的量才能够产生质变,对于语文成绩才能够有一个

分数上的提高。

词汇是语文不变的重点,尤其是成语,在作文中适量运用,可以为作文增加不少情感色彩,丰

富情感表达,使内容变得更有味道,更具味道,内涵。

但是对于成语的记忆却是很多同学语文学习中的痛难点,死记硬背效果太差,忙活一天就背了

几个词,效率实在是低下。

然而小学正是养成一个良好学习习惯的阶段,所以要找到适合自己的学习方法,这款游戏不仅

可以锻炼小孩子的思维能力,更能增加家人之间的娱乐呢!家里有小孩子的可以一起玩儿哦!

正文

一、环境准备

1)运行环境

 本文用到的环境如下—— 

 Python3、Pycharm社区版,第三方模块:pygame等部分自带的库只 要安装完 Python就可

以直接使用了,需要安装 的库的话看教程下🎐 

 一般安装:pip install +模块名

 镜像源安装:pip install -i https://pypi.douban.com/simple/+模块名 

 (之前有说过安装报错的几种方式跟解决方法,不会安装的可以去看下,还有很多国内镜像源 也有文章的)

2)素材图片等

二、代码展示

主程序:

​
import sys
import random
import pygame
from pygame.locals import *
reload(sys)
sys.setdefaultencoding('utf-8')

f = open('words.txt')
all_idiom = f.readlines()
f.close()

word_dic = {}
for idiom in all_idiom:
	idiom = idiom.strip().decode('utf-8')
	for word in idiom:
		if word not in word_dic: 
			word_dic[word] = [idiom]
		else:
		    word_dic[word].append(idiom)

word_arr = list(word_dic.keys())

header_height = 30
main_space = 20

block_size = 36
block_num=12
bspace = 2
space = 20
width = block_size * block_num + main_space * 2
height = header_height + block_size * block_num + main_space * 2 + (block_size+space) * 3

pygame.init()
screen = pygame.display.set_mode((width,height))
screencaption = pygame.display.set_caption(u'成语填空')

font = pygame.font.Font(u'syht.otf', int(block_size*0.8))

dray_gray = 50,50,50
white = 255,255,255
#textImage = font.render(u'你好', True, white)

class IdiomInfo(object):
	def __init__(self,idiom):
		self.idiom = idiom
		self.dire = 0
		self.word_arr = []

class WordInfo(object):
	def __init__(self, word, i, j):
		self.i = i
		self.j = j
		self.word = word
		self.is_lock = True
		self.state = -1
		self.hide_index = -1
		self.op_hide_index = -1

class Matrix(object):
    rows = 0
    cols = 0
    data = []

    def __init__(self, rows, cols, data=None):
        self.rows = rows
        self.cols = cols
        if data is None: data = [None for i in range(rows * cols)]
        self.data = data

    def set_val(self, x, y, val):
        self.data[y * self.cols + x] = val

    def get_val(self, x, y):
        return self.data[y * self.cols + x]

    def exist_val_four_around(self, x, y, ignore_set):
    	move_arr = [(-1,0),(1,0),(0,-1),(0,1)]

    	for dx,dy in move_arr:
    		tx = x + dx
    		ty = y + dy
    		if (tx,ty) in ignore_set: continue
    		if tx < 0 or tx >= self.cols or ty <0 or ty >= self.rows: continue
    		if self.data[ty * self.cols + tx]: return True
    	return False

def check_new_idiom(matrix, new_idiom, new_dire, word_info):
	windex = new_idiom.index(word_info.word)
	cx,cy = word_info.i, word_info.j
	ignore_set = set([(cx,cy)])

	new_idiom_word_arr=[]
	for i in range(-windex,-windex+len(new_idiom)): 
		if i==0: 
			new_idiom_word_arr.append(word_info)
		else:
			tx = cx+i  if new_dire == 0 else  cx
			if tx < 0 or tx >= block_num: return None,None

			ty = cy if new_dire == 0 else cy+i
			if ty < 0 or ty >= block_num: return None,None

			if matrix.exist_val_four_around(tx, ty, ignore_set): return None,None

			old_word_info = matrix.get_val(tx, ty)
			if old_word_info:
				return None,None

			new_word_info = WordInfo(new_idiom[i+windex], tx, ty)
			new_idiom_word_arr.append(new_word_info)


	return new_idiom_word_arr,windex

def add_idiom_to_matrix(matrix, word_dic, idiom_dic, idiom_num):
	if idiom_num == 0: return 0
	for idiom,idiom_info in idiom_dic.items():
		dire = idiom_info.dire
		new_dire = 1 - dire
		for word_info in idiom_info.word_arr:
			word = word_info.word
			idiom_list = word_dic[word]
			for new_idiom in idiom_list:
				if new_idiom in idiom_dic: continue
				new_idiom_word_arr,windex = check_new_idiom(matrix, new_idiom, new_dire, word_info)
				if new_idiom_word_arr:
					new_idiom_info = IdiomInfo(new_idiom)
					new_idiom_info.dire = new_dire
					for new_index in range(len(new_idiom_word_arr)):
						new_word_info = new_idiom_word_arr[new_index]
						if new_index == windex:
							new_idiom_info.word_arr.append(word_info)
						else:
							matrix.set_val(new_word_info.i, new_word_info.j , new_word_info)
							new_idiom_info.word_arr.append(new_word_info)
					idiom_dic[new_idiom] = new_idiom_info

					return len(new_idiom) -1 + add_idiom_to_matrix(matrix, word_dic, idiom_dic, idiom_num - 1)

	return 0

def get_idiom_matrix(word_arr, word_dic, idiom_num):
	cx = 4
	cy = 4
	matrix = Matrix(block_num, block_num)
	n = random.randint(0,len(word_arr)-1)
	word = word_arr[n]
	idiom = word_dic[word][0]
	idiom_dic={}
	idiom_dic[idiom] = IdiomInfo(idiom)
	wn = len(idiom)
	last_i = -100
	for i in range(len(idiom)):
		word_info = WordInfo(idiom[i],cx-1+i,cy)
		matrix.set_val(cx-1+i,cy,word_info)
		idiom_dic[idiom].word_arr.append(word_info)

	wn += add_idiom_to_matrix(matrix, word_dic, idiom_dic, idiom_num-1)
	return matrix, idiom_dic, wn


bg_image = pygame.image.load('bg.jpeg')
bg_image = pygame.transform.scale(bg_image,(width, height))

bg2_image = pygame.image.load('bg2.jpeg')
bg2_image = pygame.transform.scale(bg2_image,(block_size*block_num,block_size*block_num))

block_bg_image = pygame.image.load('tzg.jpg')
block_bg_image = pygame.transform.scale(block_bg_image,(block_size-bspace*2,block_size-bspace*2))

def get_hide_arr(matrix, idiom_dic, all_word_num, percent):
	hide_arr = []
	for k,v in idiom_dic.items():
		n = random.randint(0, len(v.word_arr)-1)
		word_info = v.word_arr[n]
		if word_info.hide_index != -1:continue
		word = word_info.word
		info = matrix.get_val(word_info.i,word_info.j)
		info.word = ''
		info.hide_index = len(hide_arr)
		info.is_lock = False
		hide_arr.append([word_info.i,word_info.j,word,None])

	tmp_arr = []
	for i in range(block_num):
		for j in range(block_num):
			info = matrix.get_val(i,j)
			if info and info.word:
				tmp_arr.append((i,j,info.word))

	while len(hide_arr) < all_word_num*percent:
		n = random.randint(0,len(tmp_arr)-1)
		i,j,word = tmp_arr.pop(n)
		info = matrix.get_val(i,j)
		info.word = ''
		info.hide_index = len(hide_arr)
		info.is_lock = False
		hide_arr.append([i,j,word,None])

	return hide_arr  

def get_next_select(matrix, x, y):
	arr = []
	for i in range(block_num):
		for j in range(block_num):
			info = matrix.get_val(i, j)
			if info is not None and len(info.word) == 0:
				dist = (i-x)*(i-x)+(j-y)*(j-y)
				if i<x: dist+=0.2
				if j<y: dist+=0.4
				arr.append((i,j,dist))
	if len(arr) == 0:
		return None
	arr.sort(cmp=lambda x,y:cmp(x[-1],y[-1]))
	return (arr[0][0],arr[0][1])

def check_idiom():
	for idiom, idiom_info in idiom_dic.items():
		tmp_idiom_str = ''
		word_arr = idiom_info.word_arr
		for word_info in word_arr:
			word = word_info.word
			if len(word) > 0:
				tmp_idiom_str+=word
		if len(tmp_idiom_str) == len(idiom):
			state = 1 if tmp_idiom_str == idiom else 2
		else:
			state = 0

		for word_info in word_arr:
			if word_info.state != 1: word_info.state = state

	for idiom, idiom_info in idiom_dic.items():
		word_arr = idiom_info.word_arr
		for word_info in word_arr:
			if word_info.state != 1:
				return False
	return True

stage = 1

def init(new_stage):
	idiom_num = (new_stage/5)+3
	if new_stage>100:
		percent = 0.7
	else:
		percent = 0.2+(new_stage*1.0/100)*(0.7-0.2)
	matrix,idiom_dic,all_word_num = get_idiom_matrix(word_arr, word_dic, idiom_num)
	hide_arr = get_hide_arr(matrix, idiom_dic, all_word_num, percent)
	select_rect = hide_arr[0][0],hide_arr[0][1]
	stage_textImage = pygame.font.Font(u'syht.otf', 30).render(u'第%s关'%new_stage, True, dray_gray)
	return matrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage

matrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage = init(stage)

stage_font_width, stage_font_height = stage_textImage.get_size()
stage_x = (width - stage_font_width)/2
stage_y = (header_height - stage_font_height)/2+main_space/2
while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
		   	pygame.quit()
		   	exit()

		if event.type == MOUSEBUTTONDOWN:
			pressed_array = pygame.mouse.get_pressed()
			if pressed_array[0]:
				x, y = pygame.mouse.get_pos()

				for i in range(block_num):
					for j in range(block_num):
						bx = main_space + block_size*i+bspace
						by = header_height + main_space + block_size*j+bspace
						if x >= bx and x <= bx+block_size-bspace*2 and y >= by and y<= by+block_size-bspace*2:
							info = matrix.get_val(i, j)
							if info and info.state != 1 and info.hide_index >= 0:
								if info.op_hide_index>=0:
									hide_arr[info.op_hide_index][-1] = None
									info.word = ''
									info.op_hide_index=-1
									check_idiom()
								select_rect = i,j
								break

				sx = main_space
				sy = header_height + main_space+ block_size*block_num +space
				n = 0
				for hi in range(len(hide_arr)):
					tmp_x = sx + (n%block_num)*block_size
					tmp_y = sy + (n/block_num)*block_size
					if hide_arr[hi][-1] is None and x >= tmp_x and x <= tmp_x+block_size-bspace*2 and y >= tmp_y and y<= tmp_y+block_size-bspace*2:
						info = matrix.get_val(select_rect[0],select_rect[1])
						info.word = hide_arr[hi][2]
						info.op_hide_index = hi
						info.state = 0
						hide_arr[hi][-1] = select_rect
						new_select_rect = get_next_select(matrix, select_rect[0],select_rect[1])
						select_rect = new_select_rect
						flag = check_idiom()
						if flag:
							stage += 1
							matrix,idiom_dic,all_word_num,hide_arr,select_rect,stage_textImage = init(stage)
						break

					n += 1


	screen.blit(bg_image, (0,0))
	screen.blit(stage_textImage, (stage_x,stage_y))

	panel = screen.subsurface((main_space,header_height+main_space,block_size*block_num,block_size*block_num))
	panel.blit(bg2_image, (0,0))

	for i in range(block_num):
		for j in range(block_num):
			info = matrix.get_val(i,j)
			if info is not None:
				bx = block_size*i+bspace
				by = block_size*j+bspace
				panel.blit(block_bg_image, (bx,by))
				
				if info.state == 1:
					textImage = font.render(info.word, True, (30,144,30))
				elif info.state == 2:
					textImage = font.render(info.word, True, (255,0,0))
				elif info.is_lock == 1:
					textImage = font.render(info.word, True, (150,150,150))
				else:
					textImage = font.render(info.word, True, dray_gray)

				tw, th = textImage.get_size()
				dx=(block_size-bspace*2-tw)/2
				dy=(block_size-bspace*2-th)/2
				panel.blit(textImage, (bx+dx,by+dy))
				if (i,j) == select_rect:
					pygame.draw.rect(panel,(255,0,0),(bx,by,block_size-bspace*2,block_size-bspace*2),2)

	sx = main_space
	sy = header_height + main_space+ block_size*block_num +space
	n = 0
	for i,j,word,op in hide_arr:
		screen.blit(block_bg_image, (sx + (n%block_num)*block_size,sy + (n/block_num)*block_size))
		if op is None:
			textImage = font.render(word, True, dray_gray)
			tw, th = textImage.get_size()
			dx=(block_size-bspace*2-tw)/2
			dy=(block_size-bspace*2-th)/2
			screen.blit(textImage, (dx+sx+ (n%block_num)*block_size,dy+sy+ (n/block_num)*block_size))
		n+=1

	pygame.display.update()


​

三、效果展示

1)成语填空第2关

2)成语填空第56关

总结

填词、娱乐、做游戏……原来成语还能这么记哦~

这样娱乐性质的学习是不是更加能激起孩子的学习动力呀,看来这款小游戏还是做的挺值得的

哈,有想要代码的可以滴滴我哈!

✨完整的素材源码等:可以滴滴我吖!或者点击文末hao自取免费拿的哈~

 🔨推荐往期文章——

项目4.4 【Pygame实战】这两款脑洞大开的文字剧情版游戏,99% 的人打了五星好评-《巨龙之洞》-《太空矿工》

项目4.5  【Pygamre实战】2023人气超高的模拟经营类游戏:“梦想小镇“代码版火爆全场,免费体验分享下载哦~

项目1.5  Pygame小游戏:植物大战僵尸游戏真的有“毒”?戒不掉啊~

项目1.6 【Pygame小游戏】斗地主我见多了,BUT 这款开源欢乐斗地主,最让人服气~

项目0.5   重温经典:Python版飞机大战源码,装逼神器。玩游戏就玩自己开发的~

项目0.6 【Python实战项目】做一个 刮刮乐 案例,一不小心....着实惊艳到我了。

🎁文章汇总——

Python文章合集 | (入门到实战、游戏、Turtle、案例等)

(文章汇总还有更多你案例等你来学习啦~源码找我即可免费!)    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式STM32F767BGT6规格STM32F767BIT6引脚图 32Bit MCU+FPU

ARM Cortex-M7 STM32 F7 Microcontroller IC 32-Bit 216MHz 1MB (1M x 8) FLASH 208-LQFP (28x28)产品信息型号&#xff1a;STM32F767BGT6 / STM32F767BIT6类型&#xff1a;ARM微控制器 - MCU封装&#xff1a;LQFP-208明佳达电子下面是产品中文规格&#xff0c;仅供参考&#x…

云帆文档易用性功能设计之文档查阅

云帆文档管理系统是一款基于 SpringBootVue 开发的电子文档管理系统。系统集成了用户管理、角色管理、部门管理、文档管理、新闻管理、问答管理、通告管理、文档全文检索。 支持常用的 office 文档&#xff0c;视频文件、PDF 文档在线预览&#xff0c;下载&#xff0c;笔记&…

ChatGPT中文免费小程序(AI GPGT智能助手) - ChatGPT国内小程序版在线使用

ChatGPT中文网是一个面向中国用户的聊天机器人网站&#xff0c;旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊天对话&#xff0c;还可以帮助用户解决日常生活中的问题&#xff0c;提供有趣的谈话内容以及…

最新版EasyRecovery数据恢复软件使用测评介绍

我们在逐渐适应信息电子化的同时&#xff0c;也有一些潜在的麻烦接踵而来&#xff0c;其中较为常见的就是文件和数据的保存问题。显然&#xff0c;设备的存储空间是有限的&#xff0c;这就不可避免地会出现数据被删除、覆盖或丢失的现象&#xff0c;如果丢失的是重要数据&#…

【MyBatis】源码学习 01 - 泛型解析器 TypeParameterResolver

文章目录前言参考目录问题引入流程分析TypeParameterResolver#resolveReturnTypeTypeParameterResolver#resolveTypeTypeParameterResolver#resolveParameterizedTypeTypeParameterResolver#resolveTypeVar前言 最近结合着源码书学习 MyBatis&#xff0c;毫不夸张的说&#xf…

Kubernetes基本概念与组件

Kubernetes基本概念与组件 基本概念 Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象&#xff0c;下面我们一起学习一下常遇到的一些资源对象&#xff1a; Master&#xff1a;Master 节点是 Kubernetes 集群的控制节点&#xff0c;负责整个集群的管理和控…

Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

前面3篇我们讲解了camera的基础概念&#xff0c;MIPI协议&#xff0c;CSI2&#xff0c;常用命令等&#xff0c;本文带领大家入门&#xff0c;如何用c语言编写应用程序来操作摄像头。 Linux下摄像头驱动都是基于v4l2架构&#xff0c;要基于该架构编写摄像头的应用程序&#xff…

Java 反射深入浅出

Java 反射深入浅出&#x1f4c8; 反射的概述&#xff1a;&#x1f4d1; Java Reflection(反射) 被视为动态语言的关键&#xff0c;Java并不是动态语言&#xff0c;但因为反射Java可以被称为准动态语言 反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息&a…

哪款蓝牙耳机性价比最高?无线蓝牙耳机性价比排行榜

我酷爱音乐&#xff0c;也是游戏发烧友&#xff0c;平时耳机从不离身。用的耳机多了&#xff0c;在选择上也有了自己的一些心得&#xff0c;通常来说&#xff0c;音乐耳机注重音效&#xff0c;游戏耳机注重低延迟&#xff0c;当前蓝牙耳机市场琳琅满目&#xff0c;下面推荐以下…

100M网口客户电脑插上网线就断线,自己工厂正常,是什么问题导致?

Hqst&#xff08;华强盛科技&#xff09;导读&#xff1a;物联工程师100M网口产品出现客户电脑插上网线就显示断线&#xff0c;无法通信&#xff0c;在自己工厂又正常使用&#xff0c;是什么问题&#xff1f;问&#xff1a;100M 网口&#xff0c; 使用改电路&#xff0c; 产品出…

Learning C++ No.10【STL No.2】

引言&#xff1a; 北京时间&#xff1a;2023/2/14/23:18&#xff0c;放假两个月&#xff0c;没有锻炼&#xff0c;今天去跑了几圈&#xff0c;一个字&#xff0c;累&#xff0c;感觉人都要原地升天了&#xff0c;所以各位小伙伴&#xff0c;准确的说是各位卷王&#xff0c;一定…

与其被行业内卷,还不如主动出击,打破困境~

如今的 “互联行业内卷”这事好像成为了一种常态&#xff0c;尤其是在一些已处于饱和状态和即将处于饱和状态的行业比较突出&#xff0c;比如&#xff1a;Android 开发行业、前端、……等等 造成行业内卷原因是什么&#xff1f; 市场竞争加剧&#xff0c;企业更加注重成本控制…

大数据---Hadoop集群搭建

Hadoop集群搭建 再起启动一台虚拟机并且安装jdk&#xff0c;开启免密登录 不需要安装zookeeper 文章目录Hadoop集群搭建时间同步4台机器安装npdate设置定时任务集群配置图将Hadoop安装包上传到zk1zk1---解压到soft目录下zk1---更名zk1---修改配置文件core-site.xmlhdfs-site.x…

第四届宁波网安市赛训练题

Crypto 散乱的密文 8fd4a4c94gf15{50}l72d3提示了2 1 6 5 3 4&#xff0c;我们直接横向排列 2165348fd4a4c94gf15{50}l72d3 按顺序竖着抄下来fc1l84f}a45dg034{2d957,然后栅栏解密&#xff0c;注意这里是W型栅栏解密&#xff0c;行数6 flag:flag{52048c453d794df1} 综合解密…

stm32f429FMC外设学习

功能框图 这是一种型号为 W9825G6KH 的 SDRAM 芯片内部结构框图&#xff0c;以它为模型进行学习 CLK -- FMC_SDCLK //同步时钟信号 CKE -- FMC_SDCKE[1:0] //SDCKE0&#xff1a; SDRAM 存储区域 1 时钟使能,;SDCKE1&#xff1a; SDRAM 存储区域 2 时钟使能.这里表示的…

QT(16)- QFileDevice

QT&#xff08;16&#xff09;- QFileDevice1 简介2 公有类型2.1 enum QFileDevice::FileError2.2 enum QFileDevice&#xff1a;&#xff1a;FileHandleFlag2.3 enum QFileDevice::FileTime2.4 enum QFileDevice&#xff1a;&#xff1a;MemoryMapFlags2.5 enum QFileDevice::…

【OJ】计数的梦

&#x1f4da;Description: Bessie 处于半梦半醒的状态。过了一会儿&#xff0c;她意识到她好像在数羊&#xff0c;不能入睡。Bessie的大脑反应灵敏&#xff0c;仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码&#xff1a;每一个数码在计数的过程中出现过多少次…

华为OD机试 - 箱子之形摆放(Python)| 真题+思路+考点+代码+岗位

箱子之形摆放 题目 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE CD 输入 输入一行字符串,通过空格分隔,前面部…

关于tensorboard --logdir=logs的报错解决办法记录

我在运行tensorboard --logdirlogs时&#xff0c;产生了如下的报错&#xff0c;找遍全网后&#xff0c;解决办法如下 先卸载 pip uninstall tensorboard再安装 pip install tensorboard最后出现如下报错 Traceback (most recent call last): File “d:\newanaconda\envs\imo…

华为3面,官网显示面试通过了...开始泡池子,进入漫长等待期

背景&#xff1a; 现在双非本科&#xff0c;非计算机科班&#xff0c;有算法方面的奖&#xff0c;有嵌入式开发经历&#xff0c;官网显示面试通过&#xff0c;短信说录用情况在十个工作日内告知&#xff0c;看别人的说法应该是泡池子了。 全程视频面试&#xff0c;一天面完三…