前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言命令行数独游戏

C语言命令行数独游戏

作者头像
里克贝斯
发布2021-05-21 14:59:36
2.3K0
发布2021-05-21 14:59:36
举报
文章被收录于专栏:图灵技术域图灵技术域

特性及功能

  1. 设计一个命令行界面的游戏,登入游戏界面后,应该有游戏规则说明,按键说明。
  2. 进入游戏前应该有难度选择:1表示简单、2表示中等、3表示困难。
  3. 在游戏主界面中有可以循环输入数独值、可以连续玩好几局直到退出、检查结果、查看答案、新开一局的功能。
  4. 信息提示功能:输入错误时应有提示、游戏失败或获取胜利时应有庆祝界面等。

代码

代码语言:javascript
复制
#include <iostream>
#include <cstring>
#include <cstdio>
#include <time.h>
#include <cstdlib>
#include<windows.h>
using namespace std;
int a[15][15],ans_pre,ans[15][15],b[15][15];
bool square[10][10],lie[10][10],hang[10][10],flag[15][15];
bool check;
bool f[15];
int c[15];
int difficult;

void SetColor(unsigned short ForeColor=7,unsigned short BackGroundColor=0)
{
	HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);
}
int ge(int x,int y)
{
    return(((x-1)/3)*3+(y-1)/3+1);
}

int print(){
	SetColor(15);
	cout<<"\n    ";
	for(int i=1;i<=9;i++){
        cout<<i<<"   ";
	}
    cout<<endl;
	printf("  ㄘ━━━┳━━━┳━━━");
	SetColor(9);
	printf("┳");
	SetColor(15);
	printf("━━━┳━━━┳━━━");
	SetColor(9);
	printf("┳");
	SetColor(15);
	printf("━━━┳━━━┳━━━┓");

    cout<<"\t\t\ta -- 输入指定位置的值";
    cout<<endl;
    for(int i=1;i<=9;i++)
    {
        cout<<" "<<i;
        for(int j=1;j<=9;j++)
        {
        	if(a[i][j]==0)
			{
				if(j==4||j==7) SetColor(9);
					cout<<"┃   ";
				SetColor(15);
				if (j==9)  cout<<"┃";
			}else
			{
				if(j==4||j==7) SetColor(9);
				cout<<"┃ ";
				SetColor(15);
				if(b[i][j]==0) SetColor(4);
				cout<<a[i][j]<<" ";
				SetColor(15);
				if (j==9) cout<<"┃";
			}
		}
        cout<<endl;
        if(i==3||i==6)
		{
			SetColor(9);
			cout<<"  ┣━━━╋━━━╋━━━";
        	cout<<"╋";
			cout<<"━━━╋━━━╋━━━";
			cout<<"╋" ;
			cout<<"━━━╋━━━╋━━━┫";
			SetColor(15);
			if(i==6){
                cout<<"\t\t\td -- 再来一局";
			}
			SetColor(9);
			cout<<endl;
			continue;
		}
        if(i!=9)
        {
        	cout<<"  ┣━━━╋━━━╋━━━";
        	SetColor(9);
        	cout<<"╋";
        	SetColor(15);
			cout<<"━━━╋━━━╋━━━";
			SetColor(9);
			cout<<"╋" ;
			SetColor(15);
			cout<<"━━━╋━━━╋━━━┫";
			if(i==2){
                cout<<"\t\t\tb -- 撤回上一个值";
			}
			if(i==4){
                cout<<"\t\t\tc -- 查看答案";
			}
			if(i==8){
                cout<<"\t\t\te -- 退出游戏";
			}
			cout<<endl;
		}

        else
        {
   			SetColor(15);
			printf("  ┗━━━┻━━━┻━━━");
			SetColor(9);
			printf("┻");
			SetColor(15);
			printf("━━━┻━━━┻━━━");
			SetColor(9);
			printf("┻");
			SetColor(15);
			printf("━━━┻━━━┻━━━┛\n");
		}
        SetColor(15);
    }
}

int print_y(){
	SetColor(15);
    cout<<"\n    ";
	for(int i=1;i<=9;i++){
        cout<<i<<"   ";
	}
    cout<<endl;
	printf("  ㄘ━━━┳━━━┳━━━");
	SetColor(9);
	printf("┳");
	SetColor(15);
	printf("━━━┳━━━┳━━━");
	SetColor(9);
	printf("┳");
	SetColor(15);
	printf("━━━┳━━━┳━━━┓");

    cout<<"\t\t\ta -- 输入指定位置的值";
    cout<<endl;
    for(int i=1;i<=9;i++)
    {
        cout<<" "<<i;
        for(int j=1;j<=9;j++)
        {
        	if(ans[i][j]==0)
			{
				if(j==4||j==7) SetColor(9);
					cout<<"┃   ";
				SetColor(15);
				if (j==9)  cout<<"┃";
			}else
			{
				if(j==4||j==7) SetColor(9);
				cout<<"┃ ";
				SetColor(15);
				if(b[i][j]==0) SetColor(4);
				cout<<ans[i][j]<<" ";
				SetColor(15);
				if (j==9) cout<<"┃";
			}
		}
        cout<<endl;
        if(i==3||i==6)
		{
			SetColor(9);
			cout<<"  ┣━━━╋━━━╋━━━";
        	cout<<"╋";
			cout<<"━━━╋━━━╋━━━";
			cout<<"╋" ;
			cout<<"━━━╋━━━╋━━━┫";
			SetColor(15);
			if(i==6){
                cout<<"\t\t\td -- 再来一局";
			}
			SetColor(9);
			cout<<endl;
			continue;
		}
        if(i!=9)
        {
        	cout<<"  ┣━━━╋━━━╋━━━";
        	SetColor(9);
        	cout<<"╋";
        	SetColor(15);
			cout<<"━━━╋━━━╋━━━";
			SetColor(9);
			cout<<"╋" ;
			SetColor(15);
			cout<<"━━━╋━━━╋━━━┫";
			if(i==2){
                cout<<"\t\t\tb -- 撤回上一个值";
			}
			if(i==4){
                cout<<"\t\t\tc -- 查看答案";
			}
			if(i==8){
                cout<<"\t\t\te -- 退出游戏";
			}
			cout<<endl;
		}

        else
        {
   			SetColor(15);
			printf("  ┗━━━┻━━━┻━━━");
			SetColor(9);
			printf("┻");
			SetColor(15);
			printf("━━━┻━━━┻━━━");
			SetColor(9);
			printf("┻");
			SetColor(15);
			printf("━━━┻━━━┻━━━┛\n");
		}
        SetColor(15);
    }
}
int dfs(int x,int y)
{
    if(!check) return 0;
    if(x==0&&y==9)
    {
     //   print();
        check=false;
        return 0;
    }
    if(a[x][y]==0)
    for(int j=1;j<=9;j++)
    {
    	int i=c[j];
        if(square[ge(x,y)][i]&&lie[y][i]&&hang[x][i])
        {
            square[ge(x,y)][i]=false;
            lie[y][i]=false;
            hang[x][i]=false;
            ans[x][y]=i;

            if(y==1) dfs(x-1,9);else dfs(x,y-1);

            square[ge(x,y)][i]=true;
            lie[y][i]=true;
            hang[x][i]=true;
            if(!check) return 0;
        }
    }
    if(!check) return 0;
    if(a[x][y]!=0) if(y==1) dfs(x-1,9);else dfs(x,y-1);
}

int work(int x){
	if(x==10)
	{
		return 0;
	}
	int i=1;
	int y=rand()%9+1;
	while(!f[y]) y=rand()%9+1;
	f[y]=false;
	c[x]=y;
	work(x+1);
}
void init(){
	srand(time(NULL));
    memset(a,0,sizeof(a));
    memset(lie,true,sizeof(lie));
    memset(hang,true,sizeof(hang));
    memset(square,true,sizeof(square));
    memset(f,true,sizeof(f));
    check=true;
    work(1);
    memset(a,sizeof(a),0);
    check=true;
    dfs(9,9);
    memcpy(a,ans,sizeof(ans));
//    print();
    cout<<endl<<endl<<endl<<endl;
    SetColor(15);
    cout<<"\t\t\t\t****************游戏难度选择***************"<<endl;
    SetColor(15);
    cout<<"\t\t\t\t<<                                       >>"<<endl;
    SetColor(15);
    cout<<"\t\t\t\t<<              0 -- 返回                >>"<<endl;
    SetColor(2);
    cout<<"\t\t\t\t<<              1 -- 简单                >>"<<endl;
    SetColor(9);
    cout<<"\t\t\t\t<<              2 -- 中等                >>"<<endl;
    SetColor(13);
    cout<<"\t\t\t\t<<              3 -- 困难                >>"<<endl;
    SetColor(15);
    cout<<"\t\t\t\t<<                                       >>"<<endl;
    SetColor(15);
    cout<<"\t\t\t\t*******************************************"<<endl;
    printf("\t\t\t\t输入难度等级:");
    difficult=0;
    while(difficult>3||difficult<1) cin>>difficult;
}

void rule(){
    SetColor(3);
    cout<<endl<<endl<<endl<<endl<<endl<<endl;
    cout<<"\t\t\t***********************************数独游戏规则**********************************\n";
    SetColor(3);
    cout<<"\t\t\t<<                                                                             >>\n";
    SetColor(3);
    cout<<"\t\t\t<<              数独游戏在9×9的方格内进行,分为3×3的小方格被称为区。         >>\n";
    SetColor(3);
    cout<<"\t\t\t<<              数独游戏首先从已经填入数字的格子开始,                         >>\n";
    SetColor(3);
    cout<<"\t\t\t<<              用1至9之间的数字填满空格,一个格子只能填入一个数字             >>\n";
    SetColor(3);
    cout<<"\t\t\t<<                 每个数字在每一行只能出现一次;                              >>\n";
    SetColor(3);
    cout<<"\t\t\t<<                 每个数字在每一列只能出现一次;                              >>\n";
    SetColor(3);
    cout<<"\t\t\t<<                 每个数字在每一区只能出现一次;                              >>\n";
    SetColor(3);
    cout<<"\t\t\t<<              总结这些规则,即每个数字在每一行,每一列和每一区只能出现一次   >>\n";
    SetColor(3);
    cout<<"\t\t\t<<                                                                             >>\n";
    SetColor(3);
    cout<<"\t\t\t*********************************************************************************\n";
    SetColor(3);
    cout<<"\t\t\t\t\t";

}

void button(){
    SetColor(3);
    cout<<endl<<endl<<endl<<endl<<endl<<endl;
    cout<<"\t\t\t************************数独游戏按键说明*****************************\n";
    SetColor(3);
    cout<<"\t\t\t<<                                                                 >>\n";
    SetColor(3);
    cout<<"\t\t\t<<        进入游戏后要输入3个数,所在行、所在列、所在值。          >>\n";
    SetColor(3);
    cout<<"\t\t\t<<            3个数分别用空格隔开                                  >>\n";
    SetColor(3);
    cout<<"\t\t\t<<            输完后用回车键进行确定                               >>\n";
    SetColor(3);
    cout<<"\t\t\t*********************************************************************\n";
    SetColor(3);
    cout<<"\t\t\t\t\t";

}

void welcome(){
    SetColor(3);
    cout<<endl<<endl<<endl<<endl<<endl<<endl;
    cout<<"\t\t\t\t*************欢迎进入数独游戏*************\n";
    SetColor(3);
    cout<<"\t\t\t\t<<                                      >>\n";
    SetColor(3);
    cout<<"\t\t\t\t<<           a-进入数独游戏             >>\n";
    SetColor(3);
    cout<<"\t\t\t\t<<           b-游戏规则说明             >>\n";
    SetColor(3);
    cout<<"\t\t\t\t<<           c-按键说明                 >>\n";
    SetColor(3);
    cout<<"\t\t\t\t<<           d-退出游戏                 >>\n";
    SetColor(3);
    cout<<"\t\t\t\t<<                                      >>\n";
    SetColor(3);
    cout<<"\t\t\t\t******************************************\n";
    SetColor(3);
    cout<<"\t\t\t\t\t请输入:";
    char a;
    cin>>a;
    switch(a){
        case'a':system("cls");break;
        case'b':system("cls");rule();break;
        case'c':system("cls");button();break;
        case'd':init();
    }
}


void run(){
	int sum=0;
	switch(difficult){
		case 1:sum=20;
				break;
		case 2:sum=40;
				break;
		case 3:sum=60;
				break;

	}
	int i=1;
	while(i<=sum)
	{
		int x,y;
		x=rand()%9+1;
		y=rand()%9+1;
		while(a[x][y]==0)
		{
			x=rand()%9+1;
			y=rand()%9+1;
		}
		a[x][y]=0;
		i++;
	}
}

void success(){
    cout<<endl<<endl<<endl<<endl<<endl<<endl;
    cout<<"\t\t\t************************庆祝****************************\n";
    SetColor(15);
    cout<<"\t\t\t<<                                                    >>\n";
    SetColor(13);
    cout<<"\t\t\t<<                   恭喜你答对了                     >>\n";
    SetColor(15);
    cout<<"\t\t\t<<                   总计时为:                       >>\n";
    SetColor(3);
    cout<<"\t\t\t<<                   12分钟13秒                       >>\n";
    SetColor(15);
    cout<<"\t\t\t<<                                                    >>\n";
    cout<<"\t\t\t********************************************************\n";
    SetColor(15);
    cout<<"\t\t\t\t\t";
}

int main()
{
	success();
	system("pause");
	welcome();
	init();
	run();
	system("cls");
	memcpy(b,a,sizeof(a));
	print();
	int xx,yy,zz;
	int exitf=0;
	char flag;
	cout<<" 请选择:";
	while(cin>>flag)
	{

		switch(flag){
        case 'a':{
            cout<<" 输入坐标(先纵后横)键入值,格式为 x y value\n\n";
            cin>>xx>>yy>>zz;
            if(xx==0&&yy==0&&zz==0)
            {
                system("cls");
                print_y();
                break;
            }
            if(b[xx][yy]==0) a[xx][yy]=zz;
            system("cls");
            print();
            if(b[xx][yy]!=0)
            {
                SetColor(4);
                cout<<"此处已经被填写.\n";
                SetColor(15);
            }
            break;
        }
        case 'b':{
            zz=0;
            if(xx==0&&yy==0&&zz==0)
            {
                system("cls");
                print_y();
                break;
            }
            if(b[xx][yy]==0) a[xx][yy]=zz;
            system("cls");
            print();
            if(b[xx][yy]!=0)
            {
                SetColor(4);
                cout<<"此处已经被填写.\n";
                SetColor(15);
            }
            break;

        }
        case 'c':{
            xx=0;
            yy=0;
            zz=0;
            if(xx==0&&yy==0&&zz==0)
            {
                system("cls");
                print_y();
                break;
            }
            if(b[xx][yy]==0) a[xx][yy]=zz;
            system("cls");
            print();
            if(b[xx][yy]!=0)
            {
                SetColor(4);
                cout<<"此处已经被填写.\n";
                SetColor(15);
            }
            break;
        }
        case 'd':{
            system("cls");
            welcome();
            init();
            run();
            system("cls");
            memcpy(b,a,sizeof(a));
            print();
        }
        case 'e':{
            exitf = 1;
            break;
        }
		}
		if(exitf==1){
            break;
		}
		cout<<" 请选择:";
	}
	    system("pause");
}

效果

登入游戏界面

你会看到有四个选项:a、b、c、e;

如果你按“b”:

如果你按“c”:

如果你按“e”,则退出游戏;

如果你按“a”,则出现游戏难度选择界面:

游戏难度选择

对于上图,如果你按“0”,则返回上一级目录 ;

如果你按1~3,则进入游戏主界面。按“1”时,数独有20个空格,按“2”时,数独有40个空格,按“3”时,数独有60个空格。

进入游戏主界面

如果按“a”,这开始输入要填数字的横纵坐标和其值,。 输入后的值用红色标注,区分刚开始自动生成的字符;如果输入的位置原题中就有数字则会有“此处已经被填写”的提示。

如果获胜则出现图3.9并且生成总答题时间。

如果按“c”,则根据DFS算法输出数独答案:

注明:人机交互实验1

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特性及功能
  • 代码
  • 效果
    • 登入游戏界面
      • 游戏难度选择
        • 进入游戏主界面
        相关产品与服务
        腾讯云小微
        腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档