如何用C++实现一个qt 控制台输出到界面界面的扫雷

播放媒体文件
1 #include&windows.h&
2 #program &mmsystem.h&
3 #pragma comment(lib,"winmm.lib")
4 mcisendstring(&open music.wav&,NULL,0,0);
5 mcisendstring(&play music.wav&,NULL,0,0);
这个指令在少数电脑上可能无法通过
Windows.h中的系统函数原型
srand(unsigned int(&&))
参数:unsigned int型的随机数种子
功能:给伪随机数生成种子,为保证随机数真的随机,常常把参数设定为系统当时时间。
System(&cls&)
功能:清除cmd窗口内所有内容
system("mode con cols=100 lines=30")
功能:将cmd窗口设定为指定大小,其中cols指定为列数,lines指定为行数。
控制台界面编程
改变控制台背景色
#include&Windows.h&
System(&color 0A&)
这是windows.h头文件中的函数之一,能够改变整个控制台窗口的颜色,0代表背景色,A代表前景色。颜色数字和setcolor相同,只不过要改成16进制。
注:我查了很久都没查到,自己实验后发现,和SetConsoleTextAttribute函数原型没有冲突,可以随意使用。
HANDLE GetStdHandle( DWORD nStdHandle );
STD_INPUT_HANDLE(标准输入设备)
STD_OUTPUT_HANDLE(标准输出设备句柄)
STD_ERROR_HANDLE(标准错误句柄)
功能:取系统标准句柄。
CONSOLE_SCREEN_BUFFER_INFO bI
功能:储存窗口信息
GetConsoleScreenBufferInfo(hout, &Info );
参数:标准输出,窗口信息地址
功能:读取窗口信息
FillConsoleOutputCharacter(hout,' ', bInfo.dwSize.X * bInfo.dwSize.Y, pos, NULL);
参数:标准输出,填充字符char,窗口信息X,窗口信息Y;
注意:需要在前方声明结构体postion。
功能:向窗口填充空格以达到清屏效果
SetConsoleTitle(&Title&);
参数:字符串title(窗口标题)
功能:改变窗口标题
CloseHandle(hout);
参数:标准输出hout
功能:关闭输出句柄hout
SetConsoleCursorPosition(hout, coord);
参数:输出句柄hout,结构体coord
功能:将光标移动到以结构体的X和Y位坐标的位置。
SetConsoleTextAttribute(hout, bg_color * 16 + fg_color);
参数:输出句柄hout,整数,整数是背景色标号*16与前景色标号的合
功能:改变文本的背景色和前景色,如果打印空格则不输出前景色
GetModuleFileName(hhandle,lpfilename,size)
取当前模块的绝对加载路径,如果hhandle参数为NULL则取exe文件的绝对路径,将其放入字符数组中,用size限定最大长度
time.h/ctime头文件内含有一系列与时间及其转换的函数
使用C语言下的time.h实现一个时钟
localtime()
time_t time(time_t * timer)
返回一个从计算机公元纪年(日00:00)到目前为止的秒数(如果t是空指针)
localtime()
struct tm * localtime ( const time_t * timer );
将time()取得的秒数转化为一个具有实际意义的时间结构体,包含了年月日星期时间等信息
char* asctime (const struct tm * timeptr).
asctime()将localtime()所得的时间结构体转化为当前所在时区的正确时间,返回一个字符串
以下是我用C语言实现的一个时钟
//This is a clock cpp programe based on c language,while I cannot totally comprehend the exact uses of cpp time function
#define _CRT_SECURE_NO_WARNINGS
#include&iostream&
#include&ctime&
#include&Windows.h&
#include&cstdlib&
using namespace
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(const int x, const int y)
SetConsoleCursorPosition(hout, coord);
int main()
struct tm *
SetConsoleTitle("c_clock");
system("color F0");
system("mode con cols=50 lines=10");
Sleep(1000);
gotoxy(12, 4);
now = time(NULL);
timeblock = localtime(&now);
cout && asctime(timeblock);
以下是程序运行效果
使用C++实现一个时钟
localtime_s()
asctime_s()
time()用法同上
localtime_s()
errno_t localtime_s(
struct tm* _tm,
const time_t *time
errno_t是一种数据类型,表示最后一次运行的错误代码,0表示没有错误
阅读(...) 评论()如何用C++实现一个控制台界面的扫雷_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
如何用C++实现一个控制台界面的扫雷
int y);/玩家输入坐标翻开方块void message(bool life);
void resetCube(bool ifhavebomb =} void setBomb(int bombNumber = BOMBNUMBER) {
void haveBomb() {
while (bombNumber--) {
int x = MAXX + 1, y = MAXY + 1;
while ((x &= MAXX || y &= MAXY) || cube[x][y].getIfHaveBomb() == true) {
x = rand() % MAXX;
y = rand() % MAXY;
cube[x][y].haveBomb();
}} void show() {
//显示地雷阵
system(&cls&);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
for (int i = 0;i & MAXY;i++) {
GoTo(STARTX, STARTY + i);
for (int j = 0;j & MAXX;j++) {
if (cube[j][i].getOpen() == true) {
if (cube[j][i].getIfHaveBomb() == false) {
if (cube[j][i].getNearBombNumber() == 0) { //挖开无雷的方块显示该方块周围多少个方块含雷,若为0则显示空格
printf(& %d&, cube[j][i].getNearBombNumber());
printf(&×&);//有雷的方块被挖开后显示×
printf(&■&);//未翻开的方块用■显示
}} void showXY() {
//显示坐标轴
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
GoTo(STARTX - 3, STARTY + MAXY / 2);
printf(&Y&);
GoTo(STARTX + MAXX, STARTY - 2);
printf(&X&);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
for (int i = 0;i & MAXY;i++) {
GoTo(STARTX - 1, STARTY + i);
printf(&%d &, i);
for (int i = 0;i & 2 * MAXX;i += 2) {
GoTo(STARTX + i + 1, STARTY - 1);
printf(&%d &, i / 2);
}} int checkAndSetNearBombNumber(int x, int y) {
//检查当前方块周围的雷数量
int num = 0;
if (cube[x][y].getIfHaveBomb() == true) {
//若该方块有地雷,则不用判断它周围有几个雷
//用两个循环当前方块周围8格扫一遍
for (int i = -1; i &= 1; i++) {
for (int j = -1; j &= 1; j++) {
int nx = x +
int ny = y +
if (!(ny == y && nx == x) && (nx &= 0 && nx &= MAXX - 1) &&
(ny &= 0 && ny &= MAXY - 1)) {
if (cube[nx][ny].getIfHaveBomb()) {
cube[x][y].setNearBombNumber(num);//设置该方块附近的地雷的数量
}} void gameStart() {
//初始化游戏
for (int i = 0;i & MAXY;i++) {
for (int j = 0;j & MAXX;j++) {
cube[j][i].resetCube();
setBomb();
for (int i = 0;i & MAXY;i++) {
for (int j = 0;j & MAXX;j++) {
checkAndSetNearBombNumber(j, i);
}} bool player(bool &life) {
//玩家输入坐标翻开方块
GoTo(STARTX - 3, STARTY + MAXY + 1);
printf(&请输入坐标(x,y),x和y用空格隔开&);
GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
scanf(&%d%d&, &x, &y);
if ((x & 0) || (x & MAXX - 1) || (y & 0) || (y & MAXY - 1)) {
//当玩家输入的坐标超出范围时
GoTo(STARTX - 3, STARTY + MAXY + 3);
printf(&该坐标不存在,请重新输入坐标&);
GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
} else if (cube[x][y].getIfHaveBomb() == true) {
//当玩家翻开的方块有地雷时
cube[x][y].setOpen();
} else if (cube[x][y].getOpen() == false) {
//当玩家翻开的方块无雷时
if (cube[x][y].getNearBombNumber() == 0) {
autoOpen(x, y);
cube[x][y].setOpen();
cube[x][y].setOpen();
} else if (cube[x][y].getOpen() == true) {
//当玩家输入已翻开方块的坐标时
GoTo(STARTX, STARTY + MAXY + 3);
printf(&该方块已被挖开,请再次输入坐标&);
GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
ifWin();} void message(bool result) {
if (result == true) {
//玩家胜利时输出的信息
showBomb();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
GoTo(STARTX - 1, STARTY + MAXY + 1);
printf(&祝贺你,你胜利了!&);
GoTo(STARTX, STARTY + MAXY + 2);
//玩家失败时输出的信息
showBomb();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
GoTo(STARTX - 1, STARTY + MAXY + 1);
printf(&××你踩中地雷了××&);
GoTo(STARTX, STARTY + MAXY + 2);
}} void autoOpen(int x, int y) {
//玩家翻开的方块为不含雷且周围无雷的方块时,自动翻开周围无雷的方块
for (int i = -1; i &= 1; i++) {
for (int j = -1; j &= 1; j++) {
int nx = x +
int ny = y +
if (!(ny == y && nx == x) && (nx &= 0 && nx &= MAXX - 1) &&
(ny &= 0 && ny &= MAXY - 1) && cube[nx][ny].getOpen() == false) {
if (cube[nx][ny].getNearBombNumber() == 0) {
cube[nx][ny].setOpen();
autoOpen(nx, ny);
cube[nx][ny].setOpen();
}} bool ifWin() {
//判断玩家是否扫雷成功达到游戏结束条件
int num = 0;
for (int i = 0;i & MAXX;i++) {
for (int j = 0;j & MAXY;j++) {
if (cube[j][i].getOpen() == false) {
if (num == BOMBNUMBER) {
}} void showBomb() {
//游戏结束后显示地雷位置
for (int i = 0;i & MAXY;i++) {
for (int j = 0;j & MAXX;j++) {
if (cube[j][i].getIfHaveBomb() == true) {
cube[j][i].setOpen();
bool life = true, win =
while (player(life) && !ifWin()) {
message(life && ifWin());
return 0.h& #define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY#define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY#define ORANGE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
const int STARTX = 30;/定位光标
COORD coord = { x,y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),自动翻开周围无雷的方块bool ifWin();给方块放置地雷
ifHaveBomb =
bool getIfHaveBomb() {
///该区块周围8格的含有炸弹的方块的数量///定位光标void setBomb(int bombNumber);/&#47, int y) {
////显示地雷阵int checkAndSetNearBombNumber(获取ifOpen的值
return ifO// void GoTo(int x, int y);/
int getNearBombNumber() {
//Cube cube[MAXX][MAXY];将Open的值改为true
bool getOpen() {
///给nearBombNumber赋值
nearBombNumber =玩家游戏结束后输出的信息void autoOpen(int x, bool ifopen = false, int nearbombnumber = 0){
//const int STARTY = 6;const int MAXX = 9, int y);获取ifHaveBomb的值
return ifHaveB} void GoTo(/生成bombNumber个炸弹并且放进随机的方块中
srand((unsigned)GetCurrentTime());////初始化成员数据
ifHaveBomb =
nearBombNumber =
}};#include&///雷区的高const int BOMBNUMBER = 10;//该方块是否含有炸弹
bool ifO判断玩家是否扫雷成功void showBomb();显示雷区坐标bool player(bool &life);获取nearBombNumber的值
return nearBombN/地雷数量 class Cube{private:
bool ifHaveB//&#47, coord);该方块有无被玩家翻开
int nearBombN/W
void setNearBombNumber(int number) {
///游戏结束后显示地雷位置 int main() {
gameStart();
show();检查当前方块周围的雷数量void gameStart();/生成bombNumber个炸弹并且放进随机的方块中void show();//初始化游戏void showXY();/玩家翻开的方块为不含雷且周围无雷的方块时#include&stdio.h&gt:
void setOpen() {
//雷区的宽const int MAXY = 9;&#47
HTML5/Android/iOS高端培训
主营:HTML5、Android、iOS高级课程培训
为您推荐:
换一换
回答问题,赢新手礼包如何用C++实现一个控制台界面的扫雷_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
如何用C++实现一个控制台界面的扫雷
我有更好的答案
光是界面部分就很复杂,控制台界面的游戏最好还是在Linux上开发,有一个非常著名的命令行界面游戏叫做NetHack(你可以百度一下),就是在Linux上发展起来的,它主要使用了ncurses这个函数库,很多复杂的控制台界面程序都使用了ncurses函数库控制台界面的扫雷?那在Windows上是没法弄的
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包相关文章推荐
白天看了一天书看累了,晚上瞅见扫雷游戏,就自己琢磨着做一个呗。想了一会,也没看别人怎么做的,大概1个多小时完成了这个简单版本的扫雷游戏,由于没怎么学过c#,界面的事情可能迟几天再做,明天要回家啦,哈哈...
无聊写了个扫雷小游戏,输入非雷坐标(x,y),清除掉非雷的区域,剩下地雷。算法很简单的,关键是空白区域的处理,即如果输入的坐标四周不存在雷,则连通的空白区域自动清除。这个模型与计算机图形学中的区域填充...
用VC++编写扫雷游戏
华中师范大学信息技术系研98(430079) 王洪亚
本文从分析Windows扫雷游戏的功能特点开始,应用面向对象的可视化编程语言Visual C++给出了个功能...
阵列中的地雷、数字、空白格与标记格设计
用一个二维矩阵代表阵列:
元素值统一初始化为-1;
随机产生10组坐标,每组坐标对应地雷元素,共10个地雷,并均赋值为9,即地雷的元素值为9;
元素值为n(...
这个星期在尝试着自己写一个扫雷游戏。功能基本和windows下的功能差不多。左键单击翻开一个格子,如果没有雷则显示其周围格子中含有雷的个数,没有周围的没有雷的话,那么就扩展空白块。
扫雷游戏的难点...
整天编学校的作业实在枯燥,不如……写点别的?
int map[12][12];
// 为避免边界的特殊处理,故将二维数组四周边界扩展1
时隔一年多,突然找到了大一暑假用c语言写的扫雷游戏,想起了那个大一的自己,额,15天写了一个扫雷也是蛮拼的,大一留下的东西,然而现在已经看不懂当时的代码代码了。就只剩当时的思路。
写这篇博客,附上代...
我知道很简单,就这样吧。。
/**********************扫雷*********************/
/***********************...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&

我要回帖

更多关于 c 控制台扫雷 的文章

 

随机推荐