数独游戏

  • 前言
  • 开始
    • 献上代码
    • 代码剖析
    • 项目github
      • 作者

前言

开始

献上代码

from tkinter.messagebox import *
from pygame.locals import *
from random import *
import tkinter as tk
import pygame
base = tk.Tk()
base.geometry('0x0')
base.resizable(False,False)
pygame.init()
def gen_sudoku():def list_roll(ls,n):new = list(ls)for i in range(n):new.append(new.pop(0))return news = [i for i in range(1,10)]n = [0,3,6,1,4,7,2,5,8]shuffle(s)sudoku = []for i in range(9):row = list_roll(s,n[i])sudoku.append(row)return sudoku
def gen_question(sudoku):res = [[j for j in i] for i in sudoku]n = randint(21,56)for i in range(n):x = randint(0,8)y = randint(0,8)while(res[x][y] == None):x = randint(0, 8)y = randint(0, 8)res[x][y] = Nonereturn res
def show_sudoku(surf,sudoku,s,e):font = pygame.font.Font('songti SC.TTF',100)for i in range(len(sudoku)):for j in range(len(sudoku[i])):if((j,i) == s):color = ((255,255,255),(65,105,225))elif((j,i) in e):color = ((227,23,13),(0,0,0))else:color = ((255,255,255),(0,0,0))if(sudoku[i][j] == None):t = font.render(' ', True, color[0],color[1])else:t = font.render(str(sudoku[i][j]),True,color[0],color[1])t = pygame.transform.scale(t,(64,64))surf.blit(t,(64 * j,64 * i))pygame.draw.rect(surf,(255,255,255),Rect((64 * j,64 * i),(64,64)),1)
def main():scr = pygame.display.set_mode((576,576),DOUBLEBUF)ans = gen_sudoku()ques = gen_question(ans)selected = Noneerrors = []while(1):pygame.display.update()show_sudoku(scr,ques,selected,errors)if(ques == ans):pygame.display.update()returnfor ev in pygame.event.get():if(ev.type == QUIT):exit()elif(ev.type == MOUSEBUTTONDOWN):x,y = ev.pos[0] // 64,ev.pos[1] // 64if(ques[y][x] == None or (x,y) in errors):selected = (x,y)elif(ev.type == KEYDOWN):if(ev.unicode not in '123456789' or (not ev.unicode) or (not selected)):continueques[selected[1]][selected[0]] = int(ev.unicode)if(ans[selected[1]][selected[0]] != ques[selected[1]][selected[0]]):errors.append(selected)if(ans[selected[1]][selected[0]] == ques[selected[1]][selected[0]] and selected in errors):errors.remove(selected)
if(__name__ == '__main__'):main()showinfo('Congratulations!','Congratulations!You\'done it!')

只有83行,还是那么优秀的我啊

代码剖析

from tkinter.messagebox import *
from pygame.locals import *
from random import *
import tkinter as tk
import pygame
base = tk.Tk()
base.geometry('0x0')
base.resizable(False,False)
pygame.init()

导入库并初始化

def gen_sudoku():def list_roll(ls,n):new = list(ls)for i in range(n):new.append(new.pop(0))return news = [i for i in range(1,10)]n = [0,3,6,1,4,7,2,5,8]shuffle(s)sudoku = []for i in range(9):row = list_roll(s,n[i])sudoku.append(row)return sudoku

生成数独
思路见这篇文章

def gen_question(sudoku):res = [[j for j in i] for i in sudoku]n = randint(21,56)for i in range(n):x = randint(0,8)y = randint(0,8)while(res[x][y] == None):x = randint(0, 8)y = randint(0, 8)res[x][y] = Nonereturn res

随机再数独上挖空,生成谜题

def show_sudoku(surf,sudoku,s,e):font = pygame.font.Font('songti SC.TTF',100)for i in range(len(sudoku)):for j in range(len(sudoku[i])):if((j,i) == s):color = ((255,255,255),(65,105,225))elif((j,i) in e):color = ((227,23,13),(0,0,0))else:color = ((255,255,255),(0,0,0))if(sudoku[i][j] == None):t = font.render(' ', True, color[0],color[1])else:t = font.render(str(sudoku[i][j]),True,color[0],color[1])t = pygame.transform.scale(t,(64,64))surf.blit(t,(64 * j,64 * i))pygame.draw.rect(surf,(255,255,255),Rect((64 * j,64 * i),(64,64)),1)

显示数独

def main():scr = pygame.display.set_mode((576,576),DOUBLEBUF)ans = gen_sudoku()ques = gen_question(ans)selected = Noneerrors = []

初始化变量:

  • 窗口对象
  • 数独答案
  • 谜题
  • 选择的空
  • 错误位置
    while(1):pygame.display.update()show_sudoku(scr,ques,selected,errors)if(ques == ans):pygame.display.update()returnfor ev in pygame.event.get():if(ev.type == QUIT):exit()elif(ev.type == MOUSEBUTTONDOWN):x,y = ev.pos[0] // 64,ev.pos[1] // 64if(ques[y][x] == None or (x,y) in errors):selected = (x,y)elif(ev.type == KEYDOWN):if(ev.unicode not in '123456789' or (not ev.unicode) or (not selected)):continueques[selected[1]][selected[0]] = int(ev.unicode)if(ans[selected[1]][selected[0]] != ques[selected[1]][selected[0]]):errors.append(selected)if(ans[selected[1]][selected[0]] == ques[selected[1]][selected[0]] and selected in errors):errors.remove(selected)

这里分开剖析

    while(1):pygame.display.update()show_sudoku(scr,ques,selected,errors)if(ques == ans):pygame.display.update()return

加载数独并检查是否已经完成

        for ev in pygame.event.get():if(ev.type == QUIT):exit()elif(ev.type == MOUSEBUTTONDOWN):x,y = ev.pos[0] // 64,ev.pos[1] // 64if(ques[y][x] == None or (x,y) in errors):selected = (x,y)elif(ev.type == KEYDOWN):if(ev.unicode not in '123456789' or (not ev.unicode) or (not selected)):continueques[selected[1]][selected[0]] = int(ev.unicode)if(ans[selected[1]][selected[0]] != ques[selected[1]][selected[0]]):errors.append(selected)if(ans[selected[1]][selected[0]] == ques[selected[1]][selected[0]] and selected in errors):errors.remove(selected)

处理:

  • 点击(x)退出
  • 鼠标按下将选择的位置改为按下位置
  • 键盘按下将选择的位置的数改为按下的。如果输错了,将选择位置添加到error里。如果将本来错误的改对了,将选择位置从error里将位置删去
if(__name__ == '__main__'):main()showinfo('Congratulations!','Congratulations!You\'done it!')

运行并输出完成的提示语。

项目github

github传送门

作者

hit-road

拜拜,下课!
回到顶部

python数独游戏相关推荐

  1. python数独游戏源代码_使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate(): # 初始网格 ...

  2. python数独游戏源代码100行_python实现自动解数独小程序

    跟朋友最近聊起来数独游戏,突发奇想使用python编写一个自动计算数独解的小程序. 数独的规则不再过多阐述,在此描述一下程序的主要思路: (当前程序只针对于简单的数独,更复杂的还待深入挖掘) 1.计算 ...

  3. python数独游戏源代码100行_python实现解数独程序代码

    偶然发现linux系统附带的一个数独游戏,打开玩了几把.无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了. 于是就打算借助计算机的强大运算力来暴力解数独,还是很有乐趣的. 下面就记录一下我写 ...

  4. python可以数独游戏吗_简单实现python数独游戏

    网上看到一个python写的数独,很好玩,分享给大家. import random import itertools from copy import deepcopy def make_board( ...

  5. python数独游戏源代码_数独源程序py

    #!/usr/bin/python #coding=utf-8 #sudoku # import random class sudoku(object): def __init__(self): se ...

  6. 使用Python编写数独游戏自动出题程序

    数独是一个很好玩的游戏,可以锻炼推理能力.下面的代码可以自动生成数独游戏题目. from random import shuffle, randrange def generate():     # ...

  7. 让Python程序自动玩数独游戏,秒变最强大脑!

    游戏界面如下图所示 当然这类玩数独游戏的网站很多,现在我们先以该网站为例进行演示.希望能用Python实现自动计算并填好数独游戏! 大概效果能像下面这样就好啦

  8. 9 9简单的数独游戏python_如何使用tkinter GUI python创建9*9数独生成器?

    如何使用python和tkinter创建9*9数独生成器?,如何将其生成到gui?在 我试过这些:import random numbers = [1,2,3,4,5,6,7,8,9] def reg ...

  9. 使用Python编写程序求解数独游戏答案

    问题描述:数独盘面是个九宫,每一宫又分为九个小格.在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字.使1-9每个数字在每一行.每一列和每一宫中都只出现一次,所 ...

  10. python可以数独游戏吗_学习python编程如何一键做出数独游戏答案 | k12教育网

    在学习python编程如何一键做出数独游戏答案之前,我们需要知道什么是Python? Python指的是Python编程语言(用于编写被认为是有效Python代码的语法规则)和Python解释器软件, ...

最新文章

  1. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.13
  2. iOS一些推荐的学习路径发展
  3. Orchard Core一分钟搭建ASP.NET Core CMS
  4. 在Twitter上使用Apache Mesos和Apache Aurora进行资源调度和任务启动
  5. Random Forest算法参数解释及调优
  6. ARP和RARP报头结构
  7. 还来一篇说下json_value 以及 json_query 的应用 (3)
  8. Educational Codeforces Round 7
  9. 台达伺服电机编码器改功率刷功率软件
  10. Django-ftpserver 的两个坑
  11. Win10 安装 Rational Rose 教程(带超详细图文)
  12. 网站SEO实践之 - 网站关键词库扩展的几种方法
  13. word快捷键复制粘贴无法使用
  14. 创宇区块链|Inverse Finance 安全事件分析
  15. JZ38 字符串的排列
  16. Python爬虫之Requests模块巩固深入案例
  17. http/https接口调用
  18. Elasticsearch Java Client创建索引
  19. CSS2:宽度与高度疑难点解析
  20. js实现匹配到文字设置为红色

热门文章

  1. 小学C++编程入门书籍及相关资料介绍(一)
  2. CES2013前瞻:1080p屏幕手机集中爆发
  3. 周杰伦新专辑预售热点传播分析报告概览
  4. 手机电源管理芯片一般在哪
  5. 网络(韩志刚版笔记)
  6. 康托尔点集matlab实数,为什么康托尔集内的数和实数个数一样多
  7. 01费曼技巧 - 助你快速掌握软件测试知识
  8. python创建person类_python类的创建
  9. 不同网段共享文件服务器,不同局域网如何共享文件
  10. 基于SBO程序开发框架的实例:仓库扩展属性设置