基于第二次数独游戏,添加GUI界面

项目需求:

  1. 生成任意数量的数独题目并将数独棋局依次显示,棋盘上总空格数大于30,小于60,每3*3小棋盘中挖空不少于2个。
  2. 数独题目有且仅有唯一解。
  3. 用户可以在界面上通过编辑输入完成数独题目。
  4. 用户完成数独题目后可以得到正确性反馈。
  5. 友好的使用说明。

sudo2源码:

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <fstream>
#include <stdlib.h>
#include "sudo2.h"
using namespace std;
#define Random(x) (rand()%x)
int sudo[9][9];
bool flag = false;//冲突标志

void Init_sudo(int(*sudo)[9])
{
	for (int r = 0; r<9; r++)
	{
		for (int c = 0; c < 9; c++)
			sudo[r][c] = 0;
	}
	srand((unsigned)time(NULL));
	for (int i = 1; i<10; i++)
	{
		int j = Random(9);
		sudo[i - 1][j] = i;
	}
}
void Init_sudo_part(int(*sudo)[9])
{
	for (int r = 3; r < 9; r++)
	{
		for (int c = 0; c < 9; c++)
			sudo[r][c] = 0;
	}
	for (int r = 0; r < 3; r++)
	{
		for (int c = 3; c < 9; c++)
			sudo[r][c] = 0;
	}
}
bool check_sudo(int sudo[9])
{
	int temp;
	for (int i = 0; i < 9; i++)
	{
		temp = sudo[i];
		for (int j = i + 1; j < 9; j++)
		{
			if (sudo[j] == temp)
				return false;
		}
	}
	return true;
}
//行检查
bool Sudoku_Row(int sudo[9][9], int row, int num)
{
	for (int i = 0; i < 9; i++)
	{
		if (sudo[row][i] == num)
		{
			flag = true;
			break;
		}
	}
	return flag;
}
//列检查
bool Sudoku_Col(int sudo[9][9], int col, int num)
{
	for (int i = 0; i < 9; i++)
	{
		if (sudo[i][col] == num)
		{
			flag = true;
			break;
		}
	}
	return flag;
}
//宫检查
bool Sudoku_Square(int sudo[9][9], int row, int col, int num)
{
	int Square_Row = row / 3 * 3;
	int Square_col = col / 3 * 3;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{

			if (sudo[Square_Row + i][Square_col + j] == num)
			{
				flag = true;
				break;
			}
		}
	}
	return flag;
}
void print_sudoku(int sudo[9][9])
{
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			cout << sudo[i][j] << ‘ ‘;
		}
		cout << endl;
	}
	cout << endl;
}
//生成宫格
bool makeSquare(int sudo[9][9], int num)
{
	int square_row = (num / 3) * 3;
	int square_col = (num % 3) * 3;
	int x, y;
	int temp;
	if (num = 0) //第一个宫格
	{
		for (int i = 1; i < 9; i++)
		{
			x = square_row + i / 3;
			y = square_col + i % 3;
			temp = Random(8) + 2;//生成2~9的随机数
			if (!Sudoku_Square(sudo, x, y, temp) && !Sudoku_Col(sudo,
				y, temp) && !Sudoku_Row(sudo, x, temp))
			{
				sudo[x][y] = temp;
			}
			else i--;
		}
	}
	else //生成其他宫格
	{
		int try_count = 0;
		temp = Random(9) + 1;//生成1~9的随机数
		for (int i = 0; i < 9; i++)
		{
			x = square_row + i / 3;
			y = square_col + i % 3;
			temp++;
			temp = temp % 10;//循环随机数在1~9范围内
			if (!Sudoku_Square(sudo, x, y, temp) && !Sudoku_Col(sudo,
				y, temp) && !Sudoku_Row(sudo, x, temp) && temp != 0)
			{
				sudo[x][y] = temp;
				try_count = 0;
			}
			else
			{
				i--;
				try_count++;
			}
			if (try_count > 10)
			{
				return false;
				break;
			}//若所有可能试完则返回无解
		}

	}
	return true;//有解
}
//随机选择挖空点
void GetPoint()
{
	int temp = 0;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			temp = Random(5) + 2;
			while (temp > 0)
			{
				int local = Random(9);
				int r = local / 3;
				int row = r + i * 3;
				int col = local - 3 * r + j * 3;
				if (sudo[row][col] == ‘0‘) { continue; }
				else { sudo[row][col] = ‘0‘; }
				temp--;
			}
		}
	}

}
int main(int argc, char *argv[])
{
	int N = atoi(argv[argc - 1]);
	int(*sudo)[9] = new int[9][9];
	ofstream outfile;
	outfile.open("sudoku.text");//输出到文档
	if (N > 0 && N <= 1000000)
	{
		srand(unsigned int(time(NULL)));//初始化种子为当前时间
		bool retry;//重试
		int retry_count = 0;//重试次数
		for (int i = 0; i < N;)
		{
			retry = false;
			if (retry_count == 0)
			{
				Init_sudo(sudo);
				makeSquare(sudo, 0);
				GetPoint();
				print_sudoku(sudo);
			}
			else Init_sudo_part(sudo);
			for (int j = 1; j < 9; j++)
			{
				bool flag = makeSquare(sudo, j);
				if (!flag)
				{
					retry = true;
					break;
				}
			}
			if (!retry)
			{
				for (int row = 0; row < 9; row++)
				{
					for (int col = 0; col < 9; col++)
					{
						GetPoint();
						outfile << sudo[row][col] << ‘ ‘;
						print_sudoku(sudo);
					}
					outfile << endl;
				}
				outfile << endl;
				retry_count = 0;
				i++;
			}
			else
			{
				retry_count++;
			}//无解重试
		}
		outfile.close();
	}
		return 0;
}

  coding地址:https://coding.net/u/dhlg_201810812009/p/sudo2/git

       性能分析:编译起来耗时较短,生成的数独具有唯一解,这是在原来的基础上改动了一些地方。

心得体会:没有做出GUI界面,没有完成老师布置的任务,只完成部分要求。编程基础薄弱,这次项目用的时间很多,但收之甚少。期间查书,百度,参考别人代码和经验也花比较多的时间,在学习MFC时卡了好久,用的时候老是出错,对类的使用也比较模糊不能很好地衔接起来。虽然耗时多,但感到比较空虚掌握不到什么,因为大多程序里面的知识点我在这些天只是了解表面并没有深入去理解,导致动手的时候效率低下。参考别人代码和经验时会有一定启发但同时也会让自己的思路有点混乱,这也纠结了一些时间。总的来说,学而不精,甚至有点过于求成,导致一事无成。接下来要好好静下心来学习,多琢磨多动手,形成自己的编程思路。

原文地址:https://www.cnblogs.com/muyang2/p/9823317.html

时间: 2024-10-11 17:31:58

基于第二次数独游戏,添加GUI界面的相关文章

【转】基于Unity3D的Android游戏添加google广告的方法——使用AdMob

前几天由于项目需要,要搞定在游戏中添加广告的方法,在U吧中搜到了这篇文章, unity3d开发的android应用中加入AD系统的具体步骤 进而获得首发出处 http://tank2308635.iteye.com/blog/1126047 从该文中找到AdMob插件的出处 AdMob plugin that works in Unity 3.2 首先尝试了同胞的方法,折腾了大概一天时间吧,未果,老是报错,最后没办法,就想,从根上解决吧,于是开始看老外的帖子,说实话英文技术贴比小说什么的好理解多

【项目1】通过GUI界面向指定图片中添加指定字符串

# 代码长度:61行(最后一行) #项目所用模块:tkinter(GUI模块).PIL(图像处理模块).matplotlib(绘图模块,功能与Matlab中的plot类似) #项目界面: #代码实现 1.导入所需模块/方法 #! python3#-*-coding:utf-8-*- from tkinter import * from PIL import Image, ImageFont, ImageDraw import matplotlib as plot 2.创建GUI界面 从Frame

150+行Python代码实现带界面的数独游戏

150行代码实现图形化数独游戏 Github地址,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独生成由递归算法实现,由shuffle保证每次游戏都是不一样的情况,have fun: 功能列表: 图形化的数独游戏: python实现,依赖pygame库: 随机生成游戏,每次运行都不一样: 数字填入后的正确性判断以及颜色提示: 显示剩余需填入的空格,已经操作的次数: 难度可选,通过修改需要填入的空

150+行Python代码实现带界面的数独游戏!益智烧脑了解一下!

150行代码实现图形化数独游戏 Github地址 ,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独生成由递归算法实现,由shuffle保证每次游戏都是不一样的情况,have fun: 功能列表: 图形化的数独游戏: python实现,依赖pygame库: 随机生成游戏,每次运行都不一样: 数字填入后的正确性判断以及颜色提示: 显示剩余需填入的空格,已经操作的次数: 难度可选,通过修改需要填入的

实验4-2:掌握Android应用调试方法、添加新界面

第五章.添加新界面 代码清单5-1 添加字符串资源(strings.xml) 代码清单5-2 第二个activity的布局组件定义(activity_cheat.xml) 代码清单5-3 覆盖onCreate(...)方法(CheatActivity.java) 代码清单5-4 在manifest配置文件中声明CheatActivity(AndroidManifest.xml) 代码清单5-5 默认布局中添加cheat按钮(layout/activity_quiz.xml) 代码清单5-6 水平

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

Matlab GUI界面

做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序.一:创建GUI1.在 .m文件中动态添加 例如 h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,… 'numbertitle','of

MATLAB GUI界面总结

创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件 2.  使用 GUIDE 快速的生成GUI界面 显然第二种可视化编辑方法算更适合写大型程序. 一:创建GUI 1.在 .m文件中动态添加 例如 h_main=figure('name','a demo of gui design','menubar','none',- 'numbertitle','off','position',[100 100 300 100]); h_edit=uicontrol('styl

Android研究之为基于 x86 的 Android* 游戏选择合适的引擎详解

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎.上章研究了英特尔 Android* 开发人员指南上的对等应用详解,在选择引擎时,你可以考虑以下几个因素: 成本 - 你