C语言编写数独小游戏

1.前言

这次数独小游戏的灵感来源于上次力扣做的题目,解数独。正好利用题目余热写了这一款小小游戏。
感兴趣的可以看看题目,哈哈

2.效果展示

在这里插入图片描述

3.代码

#pragma once

#include <stdio.h>
#include <graphics.h>
#pragma warning (disable :4996)
#include <windows.h>


#define SIZE 700 //背景大小
#define NUM  60 //数字大小
#define ROW 9
#define COL 9
#define NUM2 30


void Game();

void Load();//图片加载
void Show();//画面展示

int Input(char *str);
void Word();
bool JudgeNum(char sudu[][COL], int row, int col, char ch);
#include "suduko.h"


//文件定义
IMAGE zero_mask;
IMAGE zero_back;
IMAGE one_mask;
IMAGE one_back;
IMAGE two_mask;
IMAGE two_back;
IMAGE there_mask;
IMAGE there_back;
IMAGE four_mask;
IMAGE four_back;
IMAGE five_mask;
IMAGE five_back;
IMAGE six_mask;
IMAGE six_back;
IMAGE seven_mask;
IMAGE seven_back;
IMAGE eight_mask;
IMAGE eight_back;
IMAGE nine_mask;
IMAGE nine_back;
IMAGE background;
IMAGE fail;

void Load()//图片加载
{
    
    
	loadimage(&background, "background.jpg", SIZE, SIZE);
	loadimage(&fail, "fail.jpg", SIZE, SIZE);
	loadimage(&zero_back, "zero_back.jpg", NUM, NUM);
	loadimage(&zero_mask, "zero_mask.jpg", NUM, NUM);
	loadimage(&one_back, "one_back.jpg", NUM, NUM);
	loadimage(&one_mask, "one_mask.jpg", NUM, NUM);
	loadimage(&two_back, "two_back.jpg", NUM, NUM);
	loadimage(&two_mask, "two_mask.jpg", NUM, NUM);
	loadimage(&there_back, "there_back.jpg", NUM, NUM);
	loadimage(&there_mask, "there_mask.jpg", NUM, NUM);
	loadimage(&four_back, "four_back.jpg", NUM, NUM);
	loadimage(&four_mask, "four_mask.jpg", NUM, NUM);
	loadimage(&five_back, "five_back.jpg", NUM, NUM);
	loadimage(&five_mask, "five_mask.jpg", NUM, NUM);
	loadimage(&six_back, "six_back.jpg", NUM, NUM);
	loadimage(&six_mask, "six_mask.jpg", NUM, NUM); 
	loadimage(&seven_mask, "seven_mask.jpg", NUM, NUM);
	loadimage(&seven_back, "seven_back.jpg", NUM, NUM);
	loadimage(&eight_mask, "eight_mask.jpg", NUM, NUM);
	loadimage(&eight_back, "eight_back.jpg", NUM, NUM);
	loadimage(&nine_back, "nine_back.jpg", NUM, NUM);
	loadimage(&nine_mask, "nine_mask.jpg", NUM, NUM);
}


char *str = "012345678";
void Show(char sudo[][COL],int row,int col)
{
    
    
	BeginBatchDraw();//双缓冲绘图,防闪烁
	putimage(0, 0, &background, SRCPAINT);

	for (int i = 0; i < col; i++)//输出下标
	{
    
    
		outtextxy(0, i*NUM+NUM/2, str[i]);
		outtextxy(i*NUM+50, 0, str[i]);
	}
	
	

	for (int i = 0; i < row; i++)
	{
    
    
		for (int j = 0; j < col; j++)
		{
    
    
			if (sudo[i][j] == '.')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &zero_mask, SRCAND);//一行行打印,一行之中改变的是x的坐标
				putimage(j*NUM + NUM2, i*NUM + NUM2, &zero_back, SRCPAINT);
			}
			else if (sudo[i][j] == '1')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &one_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &one_back, SRCPAINT);
			}
			else if (sudo[i][j] == '2')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &two_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &two_back, SRCPAINT);
			}
			else if (sudo[i][j] == '3')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &there_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &there_back, SRCPAINT);
			}
			else if (sudo[i][j] == '4')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &four_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &four_back, SRCPAINT);
			}
			else if (sudo[i][j] == '5')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &five_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &five_back, SRCPAINT);
			}
			else if (sudo[i][j] == '6')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &six_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &six_back, SRCPAINT);
			}
			else if (sudo[i][j] == '7')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &seven_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &seven_back, SRCPAINT);
			}
			else if (sudo[i][j] == '8')
			{
    
    
				putimage(j*NUM + NUM2, i*NUM + NUM2, &eight_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &eight_back, SRCPAINT);
			}
			else if (sudo[i][j] == '9')
			{
    
    
				putimage(j*NUM +NUM2, i*NUM + NUM2, &nine_mask, SRCAND);
				putimage(j*NUM + NUM2, i*NUM + NUM2, &nine_back, SRCPAINT);
			}

		}
	}

	EndBatchDraw();
}


int Input(char sudo[][COL],int row,int col,int *x,int *y)
{
    
    
	int flag = 1;

	char ch='a';
	char *str = "请输入横纵坐标和要填入的数字";
	char*str2 = "每输入一个数字按回车输入一下个数字";
	char *str3 = "输入有误,请从新输入";

	outtextxy(100, 580,str);
	outtextxy(100, 610,str2);

	while (1)
	{
    
    
		scanf("%d %d %c", x, y, &ch);

		if (*x >= 0 && *x < 9 && *y >= 0 && *y < 9 && ch - '0' >= 0 && ch - '0' <= 9 && sudo[*x][*y] == '.')
		{
    
    
			if (JudgeNum(sudo, *x, *y, ch) == false)
				flag = 0;

			sudo[*x][*y] = ch;
			break;
		}
		else
			outtextxy(100, 650, str3);
	}

	return flag;

}

void Word()//文字设置
{
    
    
	//文字设置
	LOGFONT w;
	gettextstyle(&w);//获得文字设置
	w.lfHeight = 30;//高
	w.lfWeight = 50;//宽
	settextcolor(YELLOW);
	settextstyle(&w);//设置字体样式
	setbkmode(TRANSPARENT);//设置文字透明背景
}

bool JudgeNum(char sudu[][COL], int row, int col, char ch)//判断是否能够放入字符
{
    
    
	for (int i = 0; i<9; i++)
	{
    
    
		if (sudu[row][i] == ch)//当前行是否有重复数字
			return false;

		if (sudu[i][col] == ch)//当前列是否有重复数字
			return false;

		if (sudu[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == ch)//当前九宫格有重复数字
			return false;
	}
	return true;//可以填入

}
void Game()
{
    
    
	Word();

 char sudo[ROW][COL] = 
		{
    
    
			{
    
     '5', '3', '.', '.', '7', '.', '.', '.', '.' },
			{
    
     '6', '.', '.', '1', '9', '5', '.', '.', '.' },
			{
    
     '.', '9', '8', '.', '.', '.', '.', '6', '.' },
			{
    
     '8', '.', '.', '.', '6', '.', '.', '.', '3' },
			{
    
     '4', '.', '.', '8', '.', '3', '.', '.', '1' },
			{
    
     '7', '.', '.', '.', '2', '.', '.', '.', '6' },
			{
    
     '.', '6', '.', '.', '.', '.', '2', '8', '.' },
			{
    
     '.', '.', '.', '4', '1', '9', '.', '.', '5' },
			{
    
     '.', '.', '.', '.', '8', '.', '.', '7', '9' } };
	
 int count = 0;
 while (1)
 {
    
    
	 //输入的横纵坐标
	 int x = 0;
	 int y = 0;

	 Show(sudo, ROW, COL);


	 if (!Input(sudo, ROW, COL, &x, &y))//失败
	 {
    
    
		 cleardevice();//清屏
		 putimage(0, 0, &fail, SRCPAINT);
		 getchar();

		 break;
	 }
	 if (x==8&&y==8)//胜利了
	 {
    
    
		 cleardevice();//清屏
		 char *str = "恭喜你,挑战成功!";
		 outtextxy(0, 0, str);
	 }
	cleardevice();//清屏
 }
 
}
#include "suduko.h"

int main()

{
    
    
	initgraph(SIZE, SIZE);//打开窗口
	Load();
	Game();
	getchar();
} 

猜你喜欢

转载自blog.csdn.net/ych9527/article/details/115354698