高级软件工程第三次作业:数独游戏界面功能
此次作业基本引用了,第二次作业中使用的code。在保留第二次作业的功能基础上添加了两个文件,实现了界面游戏的功能。
完成数独游戏界面功能,代码能实现以下题目要求:
- 生成任意数量的数独题目并将数独棋局依次显示,棋盘上总空格数大于30,小于60,每3*3小棋盘中挖空不少于2个。
- 数独题目有且仅有唯一解。
- 用户可以在界面上通过编辑输入完成数独题目。
- 用户完成数独题目后可以得到正确性反馈。
- 友好的使用说明
完整的代码上传到coding :https://git.coding.net/longjiangteng/sudoti_play1.git
/**************************************************** 说明: SudoCheck.c 2018.10.14 longjt input:extern int sudo[9][9] output:对于数独中空位进行检查 简介:判断输入的数据在数独数列中是否正确 *****************************************************/ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include "SudoPrint.h" extern int sudo[9][9]; //调用main函数中的数独数列 extern int sudocheck[9][9]; void SudoCheck() { int x=17,y=8; //数独数组中的空位坐标 int i=0,j=0; //数独数组中的第0行和第0列开始进行数据判断 char inputdata; while(inputdata!='o'&&inputdata!='O') { gotoxy(x,y); scanf("%c",&inputdata); fflush(stdin); if(sudo[i][j]==(inputdata-48)) //判断输入是否正确 符合数独唯一解 { gotoxy(5,5); printf("恭喜你数据输入正确,请输入下一个数据!"); sudocheck[i][j]=(inputdata-48); //存入数独数组中 if(i==8&&j==8) //如果进行到最后一个正确情况 跳出循环 { break; } if(x==57) //如果坐标x到达57 说明奇数行应该进入下一行判断 { y++; x=22; i++; j=1; } else if(x==52)//如果坐标x到达52 说明偶数行应该进入下一行判断 { y++; i++; x=17; j=0; } else { x+=10; //如果不是57,我们正常进行下一步 j+=2; } } else { gotoxy(5,5); printf("抱歉!你的输入数据有误,请重新尝试!"); } SudoPrint(); } system("cls"); gotoxy(5,5); printf("游戏结束!"); getch(); gotoxy(5,5); printf("还想不想再来一次? 非常想(y) 不想(按任意键)"); }
/**************************************************** 说明: SudoPrint.c 2018.1014 longjt input:int temp[9][9] output:输出数独游戏界面 简介:输出数独游戏界面 输出过场动画 ,生成一个最初的游戏数独数组 *****************************************************/ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> extern int sudo[9][9]; //调用main函数中的数独数列 extern int sudocheck[9][9]; //游戏中使用部分挖空的数独数组 void gotoxy(int x, int y) { COORD pos = {x,y}; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄 SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置 } void plane(int i) //输出两架飞机 { /*左边的飞机*/ gotoxy(i,10); printf(" *"); gotoxy(i,11); printf("* **"); gotoxy(i,12); printf("* ***"); gotoxy(i,13); printf("*******"); gotoxy(i,14); printf("* ***"); gotoxy(i,15); printf("* **"); gotoxy(i,16); printf(" *"); /*右边的飞机*/ gotoxy(80-i,10); printf(" *"); gotoxy(80-i,11); printf(" ** *"); gotoxy(80-i,12); printf(" *** *"); gotoxy(80-i,13); printf("*******"); gotoxy(80-i,14); printf(" *** *"); gotoxy(80-i,15); printf(" ** *"); gotoxy(80-i,16); printf(" *"); } /*数独数列部分区域需要挖空,填0,作为游戏空 偶数行,偶数列挖空。奇数行奇数列挖空。 完成后一个宫空位4个或5个 */ void Gamearray() { int i,j; for(i=0;i<9;i++) { gotoxy(15,8+i); for(j=0;j<9;j++) { if(i%2==0) //当i为偶数时候 { if(j%2==1) //j为奇数的数据填入 { sudocheck[i][j]=sudo[i][j]; } } else { if(j%2==0) //j为偶数的数据填入 { sudocheck[i][j]=sudo[i][j]; } } } } } void Sudo_Interface() //打印游戏前的过场动画 { int i; system("COLOR 34"); // DOS2f 窗 背景绿色字白色 for(i=1;i<8;i++) { gotoxy(26,4); printf("-----欢迎进入数独游戏-----"); plane(i*10); sleep(1); system("cls"); } gotoxy(26,4); printf("-----欢迎进入数独游戏-----"); gotoxy(25,8); printf("-----请按任意键继续-----"); getch(); system("cls"); } void SudoPrint() { gotoxy(5,1); printf("**请把数字1-9填入数列中数据为0的空格中,按回车确定**"); gotoxy(5,2); printf("**要求填入数字不能在同一行、列或宫中出现多于一次**"); gotoxy(5,3); printf("**按照光标引导一次填入数据,直到完成数独数列游戏**"); int i,j; gotoxy(15,7); printf("*********************************************"); for(i=0;i<9;i++) { gotoxy(15,8+i); for(j=0;j<9;j++) { printf("| %d |",sudocheck[i][j]); } } gotoxy(15,17); printf("*********************************************"); gotoxy(5,21); printf("字母O 退出 Enter 确认输入 Backspce 删除当前输入 "); }
以上两个代码段是这次数独游戏新增加的代码段,主要是用于显示登陆界面和人机交互功能。在代码中加入了良好中文的提示,正确性反馈。代码有且只有唯一的解决办法。
/**************************************************** 说明: main.c 2018.10.14 longjt input:None output:None 简介:主函数完成数独游戏 *****************************************************/ #include <stdio.h> #include <stdlib.h> #include "SuduInput.h" #include "SuduCheck.h" #include "SuduGain.h" #include "SudoPrint.h" int sudo[9][9]={0}; int sudocheck[9][9]={0}; int main(int argc, char *argv[]) { do{ cleanup(sudocheck); //先清理干净游戏数独数组 SudoBuilde(sudo); //生成一个数独数列 Sudo_Interface(); //数独游戏过场动画 Gamearray(); //生成一个最初的数独游戏数组 SudoPrint(); //打印游戏界面 SudoCheck(); fflush(stdin); //清理干净flash }while(getch()=='y'); getch(); return 0; }
这个是main函数代码,游戏可以重复进行,按y键就可以一直玩数独游戏。实现数独游戏1<n<10000的功能。而且重复游戏,数独数组不会重复。
以下是游戏界面截图:
游戏过场动画效果。
截图光标位置可以进行输入数据,每一个小宫里面为0的空位有4-5个,一共有41个空位。当数据输入正确会有提示。完成所有的空位之后或者按下字母o可以退出游戏。
退出游戏后可以选择是否再来一次游戏:
如果输入字母小y就可以使游戏再运行一次。
程序性能分析:
程序运行过程中基本不耗费CPU性能,只有在生成数独数组时耗费计算机资源较多,其他时间基本不耗费资源。
在运行sudotiku.exe程序之后,也能够在同一目录下生成对于的sudotiku.txt文件。
心得体会:
编写此作业的时候发现,前台交互界面确实很难编程。很多时候往往达不到预期效果,比如;客户想要一艘航空母舰,我做出来一看却像一艘皮划艇。
人机交互界面确实是我编程的短板,需要着重进行突击学习。在游戏退出功能的时候,我很想使用ESC键进行退出,但是实际编程过程中发现ESC键识别
出现了一定的错误,很容易误操作。这时候只能使用替代的办法,用字母o来代替ESC键,这样就没有达到非常完美的效果。这个有点遗憾。