程序实践:命令行之连连看

命令行之连连看

程序实践周课题,VC++6.0上可编译执行


游戏截图:




#include <cstdio>#include <cstring>
#include <iostream>
#include <windows.h> 
#include <time.h>
#include <algorithm>
using namespace std;
int dirx[4] = {1,-1,0,0};  
int diry[4] = {0,0,1,-1};  //四个方向,DFS函数中要使用
bool vis[15][15];	//标记该点是否已经被訪问,DFS中使用
char map[15][15];	//二维字符数组表示连连看矩阵
bool Hash[105];  //hash数组用来标记,去重
int num, level;		//num游戏记录人数。 level游戏等级
char choose[100];		//提取对应操作的字符
struct Players  //结构体存游戏者的帐号,得分,排名
{char name[50];int score;int rank;
};
struct Data
{int n;struct Players player[100];
}data[4];bool cmp(Players a, Players b)
{return a.score < b.score;
}void set_rank(int l)
{int tmp;if (l == 4)tmp = 0;else if (l == 6)tmp = 1;else if (l == 8)tmp = 2;else if (l == 10)tmp = 3;for(int i = 0; i < data[tmp].n; i++){data[tmp].player[i].rank = i + 1;if(data[tmp].player[i].score == data[tmp].player[i + 1].score){data[tmp].player[i + 1].rank = data[tmp].player[i].rank;i++;}}
}void menu()  //菜单
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);printf("\n\n			*********************************\n");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);printf("			*****    欢迎进入 连连看    *****\n");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);printf("			*****    C - 选择游戏等级   *****\n");printf("			*****    T - 有时间限定     *****\n");printf("			*****    N - 无时间限定     *****\n");printf("			*****    R - 玩家排名       *****\n");printf("			*****    E - 游戏结束       *****\n");printf("			*********************************\n\n");if(level == 0)printf("			*****    游戏等级 : 未选    *****\n");else if(level == 4)printf("			*****    游戏等级 : 低级    *****\n");else if(level == 6)printf("			*****    游戏等级 : 中级    *****\n");else if(level == 8)printf("			*****    游戏等级 : 高级    *****\n");else if(level == 10)printf("			*****    游戏等级 : 特高    *****\n");printf("\n输入操作 : ");scanf("%s", &choose);//printf("choose = %c\n", choose);//system("PAUSE");system("CLS"); //清屏函数//清屏后显示菜单}void ChooseMenu()
{int tmp;//设4个等级。通过选择游戏难度初始化levelprintf("\n\n			********************************\n");printf("			*****        选择等级      *****\n");printf("			*****        1 - 低级      *****\n"); // 4 * 4printf("			*****        2 - 中级      *****\n"); // 6 * 6printf("			*****        3 - 高级      *****\n"); // 8 * 8printf("			*****        4 - 特高      *****\n"); // 10 * 10printf("			********************************\n");printf("		  \n游戏等级 : ");scanf("%d", &tmp);while(tmp != 1 && tmp != 2 && tmp != 3 && tmp != 4){printf("			请选择正确的游戏等级 1 , 2 , 3 , 4\n");printf("		  \n游戏等级 : ");scanf("%d", &tmp);}if (tmp == 1)level = 4;else if (tmp == 2)level = 6;else if (tmp == 3)level = 8;else if (tmp == 4)level = 10;getchar();
}void init_map()  //初始化游戏矩阵
{int i, j;char get[105];	 //get数组用来得到随机字符memset(Hash, false, sizeof(Hash)); //初始化hash数组srand((unsigned)time(NULL));	//设置随机数种子//随机生成一半的字符。由于要保证两两配对for(i = 0; i < (level * level) / 2; i++) {get[i] = 65 + rand() % 26;   //随机生成前一半get[i + (level * level) / 2] = get[i]; //将前一半的值赋给后一半}int index;  //在get中随机产生的数组下标bool flag;	//标记是否找到一个新的字符srand((unsigned)time(NULL)); //设置随机数种子for(i = 1; i <= level; i++){for(j = 1; j <= level; j++){flag = false;   //flag每次先赋值为falsewhile(true)		//死循环{index = 0 + rand() % (level * level); //随机生成get数组中的下标if(!Hash[index])	//	假设该点没有被使用{	map[i][j] = get[index];  //将它的值赋给mapHash[index] = true;		 //将它标记为已使用flag = true;			 //找到一个字符flag设为true}if(flag)  //假设找到则退出for循环break;}}}//在连连看矩阵周围加一圈空格,用来消除边界元素for(i = 0; i <= level + 1; i++)map[0][i] = map[level + 1][i] = map[i][0] = map[i][level +1] = ' ';
}void show_map()   //显示矩阵
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);printf("\n\n\n");int i, j;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);printf("	");for(i = 1; i <= level; i++)printf("%4d", i);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);printf("	游戏选择");printf("\n\n");for(i = 1; i <= level; i++){SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);printf("	");for(j = 1; j <= level; j++)printf("%4c", map[i][j]);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);printf("%4d", i);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);if (i == 1)printf("	T - 提示\n\n");else if (i == 2)printf("	R - 洗牌\n\n");else if (i == 3)printf("	C - 继续\n\n");elseprintf("\n\n");}SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}bool IsWin()  //推断是否结束
{int i, j;for(i = 1; i <= level; i++)for(j = 1; j <= level; j++)if(map[i][j] != ' ') //假设矩阵中有一个不是空格则说明没有结束return false;return true;
}bool DFS(int x1, int y1, int x2, int y2, int turn, int dir)
{//转向次数大于2则返回false。这里大于3是由于dir初始为-1也就是第一次选方向时//就已经让turn加1了,if(turn > 3)return false;//转向两次后不能沿某一方向到终点,返回falseif(turn == 3 && (x2 != x1 && y2 != y1))return false;//到达终点,返回trueif(x1 == x2 && y1 == y2)return true;for(int i = 0; i < 4; i++) //四个方向遍历{int xx = x1 + dirx[i];int yy = y1 + diry[i];//若该点有字符且不是终点则换方向if(map[xx][yy] != ' ' && !(xx == x2 && yy == y2))continue;//推断是否出界,是否已经訪问if(xx < 0 || yy < 0 || xx > level + 1 || yy > level + 1 || vis[xx][yy])continue;   //将该点设为已訪问vis[xx][yy] = true;//若当前方向与之前方向不同,转向次数+1,继续搜索if(DFS(xx, yy, x2, y2, turn + (dir != i), i))return true;//若从该点的dfs不成功,将该点设为未訪问vis[xx][yy] = false;}return false;
}bool judge(int x1, int y1, int x2, int y2)
{memset(vis, false, sizeof(vis)); //初始化vis数组用于DFSvis[x1][y1] = true;	//将起点标记为已訪问//特判几种不能消除的情况if(x1 == x2 && y1 == y2){printf("\n	输入的两点坐标同样,请保证两点的坐标不同\n\n");return false;}if(map[x1][y1] == ' ' || map[x2][y2] == ' '){printf("\n	两点之中有没有图案的点,请保证两点都有图案\n\n");return false;}if(map[x1][y1] != map[x2][y2]){printf("\n	两点图案不同。请保证两点图案同样\n\n");return false;}if(DFS(x1, y1, x2, y2, 0, -1)){printf("\n	这两点能够消除\n\n");return true;}else{printf("这两点不能消除。请重试\n\n");return false;}
} //该函数在total_judge()中被调用。功能与judge相似
//不输出中文提示
bool judge2(int x1, int y1, int x2, int y2) 
{memset(vis, false, sizeof(vis));vis[x1][y1] = true;if(x1 == x2 && y1 == y2)return false;if(map[x1][y1] == ' ' || map[x2][y2] == ' ')return false;if(map[x1][y1] != map[x2][y2])return false;if(DFS(x1, y1, x2, y2, 0, -1))return true;return false;
}bool total_judge()  //全盘判定,用于推断是否还有可行解
{int i, j, ii, jj;bool vis2[15][15];   //标记该点是否被訪问memset(vis2, false, sizeof(vis2)); //初始化vis2int x1, y1, x2, y2;  //记录两个点的坐标for(i = 1; i <= level; i++){for(j = 1; j <= level; j++){//假设该点不是空格,而且没有被訪问if(map[i][j] != ' ' && !vis2[i][j]){vis2[i][j] = true; //将其设为已訪问//找到一个点A赋值x1 = i;		y1 = j;//printf("x1 = %d  y1 = %d\n", x1, y1);//枚举点找到与A点字符同样的一个点for(ii = 1; ii <= level; ii++){for(jj = 1; jj <= level; jj++){if(map[ii][jj] == map[x1][y1] && !vis2[ii][jj]){//假设找到一个点与A点不是同一点而且图案同样//将其标记为已訪问vis2[ii][jj] = true;//记为B点并赋值x2 = ii;y2 = jj;//printf("x2 = %d  y2 = %d\n", x2, y2);//推断A,B是否能被消除//找到一个可行解则说明游戏能够继续不用restartif(judge2(x1, y1, x2, y2))return true;}}}}}}//假设没找到可行解。则须要restartreturn false;
}bool Tip()  //全盘判定,用于推断是否还有可行解
{int i, j, ii, jj;bool vis2[15][15];   //标记该点是否被訪问memset(vis2, false, sizeof(vis2)); //初始化vis2int x1, y1, x2, y2;  //记录两个点的坐标for(i = 1; i <= level; i++){for(j = 1; j <= level; j++){//假设该点不是空格,而且没有被訪问if(map[i][j] != ' ' && !vis2[i][j]){vis2[i][j] = true; //将其设为已訪问//找到一个点A赋值x1 = i;		y1 = j;//枚举点找到与A点字符同样的一个点for(ii = 1; ii <= level; ii++){for(jj = 1; jj <= level; jj++){if(map[ii][jj] == map[x1][y1] && !vis2[ii][jj]){//假设找到一个点与A点不是同一点而且图案同样//将其标记为已訪问vis2[ii][jj] = true;//记为B点并赋值x2 = ii;y2 = jj;//推断A,B是否能被消除//找到一个可行解则说明游戏能够继续不用restartif(judge2(x1, y1, x2, y2)){//输出可行解printf("\n	提示 :\n	x1 = %d, y1 = %d\n	x2 = %d, y2 = %d\n", x1, y1, x2, y2);return true;}}}}}}}return false;
}void Restart() //洗牌函数
{int i, j;bool hash2[105], flag;char re[105];int cnt = 0, index2;memset(re, 0, sizeof(re));memset(hash2, false, sizeof(hash2));for(i = 1; i <= level; i++)for(j = 1; j <= level; j++)if(map[i][j] != ' ') re[cnt++] = map[i][j]; //提取实用字符srand((unsigned)time(NULL));for(i = 1; i <= level; i++){for(j = 1; j <= level; j++){if (map[i][j] != ' '){flag = false;while (true){index2 = 0 + rand() % cnt;if (!hash2[index2]){hash2[index2] = true;map[i][j] = re[index2];flag = true;}if (flag)break;}}}}
}void Rank()
{printf("\n\n");for (int i = 0; i < 4; i++){if (i == 0){printf("		低级:\n");printf("		排名		账号		成绩(秒)\n");for (int j = 0; j < data[i].n; j++)printf("		%d		%s		%d\n", data[i].player[j].rank, data[i].player[j].name, data[i].player[j].score / 1000);printf("\n");}if (i == 1){printf("		中级:\n");printf("		排名		账号		成绩(秒)\n");for (int j = 0; j < data[i].n; j++)printf("		%d		%s		%d\n", data[i].player[j].rank, data[i].player[j].name, data[i].player[j].score / 1000);printf("\n");}if (i == 2){printf("		高级:\n");printf("		排名		账号		成绩(秒)\n");for (int j = 0; j < data[i].n; j++)printf("		%d		%s		%d\n", data[i].player[j].rank, data[i].player[j].name, data[i].player[j].score / 1000);printf("\n");}if (i == 3){printf("		特高:\n");printf("		排名		账号		成绩(秒)\n");for (int j = 0; j < data[i].n; j++)printf("		%d		%s		%d\n", data[i].player[j].rank, data[i].player[j].name, data[i].player[j].score / 1000);printf("\n");}}system("PAUSE");
}int GameMenuChoose()
{printf("\n	输入操作 : ");char tmp;getchar();scanf("%c", &tmp);if (tmp == 'T'){Tip();return 1;}if (tmp == 'R'){system("CLS");Restart();show_map();return 1;}if (tmp == 'C')return 0;return 0;
}void play() //游戏函数
{int x1, y1, x2, y2;while (GameMenuChoose());printf("\n	请输入两点坐标\n");printf("\n	一 : ");scanf("%d %d", &x1, &y1);printf("\n	二 : ");scanf("%d %d", &x2, &y2);if (judge(x1, y1, x2, y2))  //假设能够消除,把两点的值设为空格{map[x1][y1] = ' ';map[x2][y2] = ' ';}
}void Start()
{system("CLS");init_map();  //初始化游戏界面while (!IsWin())  //假设游戏没有结束则一直play{while (!total_judge())	//若没有可行解,则一直洗牌直到有可行解{Restart();show_map();}show_map();play();system("PAUSE");system("CLS");}system("CLS");printf("Good Job!\n");system("PAUSE");system("CLS");
}void ReadInMemory(Data *u)
{FILE *fp;fp = fopen("data.txt", "rb");if (fp == NULL)return;fread(u, sizeof(struct Data), 1, fp);fclose(fp);
}void WriteToFile(Data * u)
{FILE *fp;fp = fopen("data.txt", "wb");if (fp == NULL)return;fwrite(u, sizeof(struct Data), 1, fp);fclose(fp);
}void SetData(int l,int e, int s, char *a)
{if (l == 4){data[0].n++;data[0].player[data[0].n].score = (int)e - s;strcpy(data[0].player[data[0].n].name, a);sort(data[0].player, data[0].player + data[0].n, cmp);}else if (l == 6){data[1].n++;data[1].player[data[1].n].score = (int)e - s;strcpy(data[1].player[data[1].n].name, a);sort(data[1].player, data[1].player + data[1].n, cmp);}else if (l == 8){data[2].n++;data[2].player[data[2].n].score = (int)e - s;strcpy(data[2].player[data[2].n].name, a);sort(data[2].player, data[2].player + data[2].n, cmp);}else if (l == 10){data[3].n++;data[3].player[data[3].n].score = (int)e - s;strcpy(data[3].player[data[3].n].name, a);sort(data[3].player, data[3].player + data[3].n, cmp);}
}int main()
{//system("title 连连看");level = 0;
Loop:char tmp_name[20];ReadInMemory(data);menu();if(choose[0] == 'E')return 0;if(choose[0] == 'R'){Rank();system("CLS");goto Loop;}if(choose[0] == 'C'){system("CLS");ChooseMenu();system("PAUSE");system("CLS");goto Loop;}if (level == 0 && (choose[0] == 'N' || choose[0] == 'T')){while (choose[0] != 'C'){system("CLS");printf("\n\n				请先选择游戏等级\n");ChooseMenu();system("PAUSE");if (level != 0){system("CLS");break;}}goto Loop;}if (choose[0] == 'N'){Start();goto Loop;}if (choose[0] == 'T'){printf("请输入username\n");cin >> tmp_name;clock_t st = clock();Start();clock_t ed = clock();SetData(level, st, ed, tmp_name);set_rank(level);WriteToFile(data);goto Loop;}if(strlen(choose) != 1 || choose[0] != 'E' || choose[0] != 'R' || choose[0] != 'C' || choose[0] != 'N' || choose[0] != 'T'){printf("非法输入,请看清菜单选项\n");system("PAUSE");system("CLS");goto Loop;}return 0;
}


转载于:https://www.cnblogs.com/jhcelue/p/6930223.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 进程使用 使用当前进程启动另外进程

业务场景&#xff1a; A 进程启动B进程后退出&#xff0c; B进程干完活后启动 A进程退出 1.使用 QT &#xff1a;&#xff1a;QProcess 类的接口函数 waitForStarted() 出现 A进程退出来了 B进程一直没有起来的情况&#xff0c; 2. 解决方法: 在 waitFor Started() 后加延时1s…

interrupt()会中断线程的wait等待

public class Thread5 {public static void main(String[] args) {SubThread subThread new SubThread();subThread.start();try {//主线程睡眠2秒&#xff0c;确保子线程处于wait状态Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}subThread.i…

在ASP.Net 2.0中实现多语言界面的方法

1&#xff0e; 跟以前一样做界面&#xff0c;只是注意&#xff0c;把所有需要有多语言界面的文字都用label来做 2&#xff0e; 做完以后&#xff0c;在Solution Explorer里选中这个文件&#xff0c;选Tools-&#xff1e;Generate Local Resource3&#xff0e; 你会发现生成了一…

Qt编译报 undefined vtable问题

在类添加信号槽&#xff0c;继承 QObject 后编译&#xff0c;需要先清理项目 &#xff0c;然后执行qmake&#xff0c; 再构建就不会出错&#xff0c;需要使用来moc编译一下支持信号槽源文件

安装DNN时,数据库连接字符串的设置

最近接触到了DNN&#xff0c;觉得这是一个东西。关于DNN的安装网上有很多文章。我在安装我的第一个DNN程序时&#xff0c;虽然看了那些文章&#xff0c;但是还是无济于事&#xff0c;有的时候&#xff0c;我的系统配置和别人的就是不一样。安装DNN程序时&#xff0c;程序自带的…

Qt 使用代码编写的自定义控件类

Qt 使用代码编写的自定义控件类 首先需要完成继承QWidget 或者Qt 原生控件类的类编写实现在需要使用自定义控件类的 UI 文件中添加一个 自定义类的控件&#xff08;也就是自定义类继承的控件&#xff09;将这个控件进行提升&#xff08;promote) 为自定义类&#xff0c;记得设…

mac使用word怎么显示左侧目录树

1&#xff0c;点击”视图” 2&#xff0c;点击“导航窗口” 3&#xff0c;点击如图所示图标

[YTU]_2800( 逗逗泡泡的保密电文)

Description 某电报局的电文保密的规律是将每个英文字母变成其后的第4个字母&#xff08;很原始的那种啦&#xff09;&#xff0c;如A变成E&#xff0c;a变成e。最后四个字母(W,X,Y,Z或w,x,y,z&#xff09;又变成前4个字母(A,B,C,D或a,b,c,d&#xff09;.非字母字符不变。输入一…

java BigDecimal去掉小数点后的零

new BigDecimal(spstFil.getCnt().stripTrailingZeros().toPlainString())

Qt 多重继承时 moc 编译出错

class SZNR103Client : public QObject , public CommBase {在这里插入代码片 bash 在这里插入代码片 注意一点&#xff1a; QOBject 必须写在自己的类前面&#xff0c;否则编译会有问题

网球术语英汉对照 【丰富词汇量,喜欢网球的路过说声。。】

A ace 发球时&#xff0c;对方接球完没有碰触到球之得分球 advantage 占先&#xff0c;打到deuce后优势之一方&#xff0c;分发球占先及接球占先 advantage for receiver 接发球方占先 advantage for server 发球方占先 all 平&#xff08;比分相同&#xff09; alley 单打与双…

关于爬虫的一些工具。

网络 通用 urllib -网络库(stdlib)。requests -网络库。grab – 网络库&#xff08;基于pycurl&#xff09;。pycurl – 网络库&#xff08;绑定libcurl&#xff09;。urllib3 – Python HTTP库&#xff0c;安全连接池、支持文件post、可用性高。httplib2 – 网络库。RoboBrows…

Qt 多线程并发高阶类QtConcurrent 的使用

#include <QCoreApplication> #include <QtConcurrent> #include <QDebug> #include <iostream> #include <csignal> #include <unistd.h> using namespace std;int g_1 0;// 测试中断方式 void signalHandler(int signum) {qDebug() &l…

中毒,重装,杀毒……最近一段时间,很烦的一件事,不断重复……

之前写的&#xff0c;因为最近太多人中毒了&#xff0c;太多人问了&#xff0c;太多人找我了…… 所以&#xff0c;很烦很烦…… 自己简直成了专业杀毒软件&#xff08;麻烦还没有杀毒软件的朋友&#xff0c;用金钱或者其他办法找个杀毒软件&#xff0c;一定…

使用postman发送HttpServletRequest请求

使用postman发送HttpServletRequest请求 使用postman发送HttpServletRequest请求 Headers部分是key: Content-Type value: application/x-www-form-urlencoded 后台使用这个接收String name request.getParameter("name");

QT VS环境安装后出现生成的程序can not start, can not find Qt pligins “windos“ 问题 2021-06-13

QT VS环境安装后出现生成的程序can not start 问题原因: windows kit 没有配置到系统环境变量 解决方法&#xff1a; 添加环境变量

第一次写,python爬虫图片,操作excel。

第一次写博客&#xff0c;其实老早就注册博客园了&#xff0c;有写博客的想法&#xff0c;就是没有行动&#xff0c;总是学了忘&#xff0c;忘了丢&#xff0c;最后啥都没有&#xff0c;电脑里零零散散&#xff0c;东找找&#xff0c;西看看&#xff0c;今天认识到写博客的重要…

JavaScript 异常处理

异常处理概述在代码的运行过程中&#xff0c;错误是不可避免的&#xff0c;总的来说&#xff0c;错误发生于两种情况&#xff1a;一是程序内部的逻辑或者语法错误&#xff0c;二是运行环境或者用户输入中不可预知的数据造成的错误。对于前者&#xff0c;就称之为错误&#xff0…