鱼C论坛

 找回密码
 立即注册
查看: 3510|回复: 20

[已解决]扫雷小游戏求助~

[复制链接]
发表于 2018-2-7 16:42:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风过无痕丶 于 2018-2-7 16:48 编辑
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#include <cstdlib>

using namespace std;

const int MAX_BOOM_A = 15;
const int MAX_BOOM_B = 28;

int x,y; // 横纵坐标
int sum_mine; // 雷的个数


// 暂定 1为未知区域, 2为现行选中位置, 3为雷
char juzhen[16][16]{

        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

};

char juzhen_tnt[16][16]{

        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
        {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

};


class saolei_a{

        public:
                char mine; // 雷
                char Unknown_region;// 未知区域
                char Choice_region; // 选中区域

                // 先把图画出来!
                void huatu_saolei(void){

                                cout << "还剩下" << sum_mine << "个雷" ;
                                cout << '\n' << '\n';
                                cout << '\t' << '\t' << '\t';
                                cout << "    欢迎来到扫雷小游戏!" << endl;
                                cout << '\t' << '\t' << '\t';
                                cout << "按下字母 w a s d  移动光标!";
                                cout << '\n' << '\n' << '\n' << '\n';
                                for (int i = 0; i < 16; i++){
                                        // 奶奶的!三个TAB又多了,只有加几个空格了!
                                        cout << '\t' << '\t' << "     ";
                                        for (int j = 0; j < 16; j++){

                                                if (juzhen[i][j] == 1){
                                                        cout << "■";  // 如果数组内容为1 就画 方块
                                                        }
                                                else if (juzhen[i][j] == 2){
                                                        cout << "□"; // 如果数组内容为2 就画 空方块
                                                        }
                                                else if (juzhen[i][j] == 8){
                                                        cout << "★";  // 如果数组内容为8 画五角星
                                                        }
                                                }
                                                cout << '\n';

                                        }
                                }


                        // 再搞个定位的函数算了,不然不知道怎么移动了~
                        // 头绪不是很清晰,就用迭代来找吧~
                        void gps_saolei(int *x, int *y){

                                for (int i = 0; i < 16; i++){
                                        for (int j = 0; j < 16; j++){
                                                if (juzhen[i][j] == 2){ // 2为现行选中项的标识符
                                                        *x = i;
                                                        *y = j;
                                                }
                                        }
                                }

                        }

                        // 移动现行选中项
                         void Choice_saolei(void){
                                Choice_region = getch();
                                        switch(Choice_region){

                                                case 'w' :
                                                        gps_saolei(&x,&y); //获取到现行选中项在什么位置!
                                                        juzhen[x-1][y] = 2; // 把现在的位置变成 选中
                                                        juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
                                                        break;

                                                case 'a':
                                                        gps_saolei(&x,&y);
                                                        juzhen[x][y-1] = 2;
                                                        juzhen[x][y] = 1;
                                                        break;
                                                case 's':
                                                        gps_saolei(&x,&y);
                                                        juzhen[x+1][y] = 2;
                                                        juzhen[x][y] = 1;
                                                        break;
                                                case 'd' :
                                                        gps_saolei(&x,&y);
                                                        juzhen[x][y+1] = 2;
                                                        juzhen[x][y] = 1;
                                                        break;
                                                case 'g':
                                                        gps_saolei(&x,&y);
                                                        if (prove_tnt(x,y)){
                                                                cout << "游戏结束!";
                                                                exit(-1);
                                                        }
                                                        else{
                                                                cout << "那就继续来吧!" << endl;
                                                        }
                                                        break;
                    }
                        }

                        // 来吧! 我要开始造雷了!
                        // 我的思路是,选择挖的时候调用一次这个函数,
                        // 反馈回去,这是不是雷区


                        // 雷的位置!
                        void mine_arr(int *x, int *y){

                                srand((unsigned)time(NULL));
                                *x = rand()% MAX_BOOM_A;
                                *y = rand()% MAX_BOOM_A;
                        }

                        // 雷的个数
                        int num_mine_arr(void){
                                int sum;
                                srand((unsigned)time(NULL));
                                sum = rand()% MAX_BOOM_B;

                                return sum;
                        }

                        // 这里开始造雷
                        void tnt_arr(void){

                                int tnt_x,tnt_y;
                                int sum = num_mine_arr();
                        // 不知道为什么~次数执行够了的~雷只造一个出来!!!
                                for (int i = 0; i <= sum; i++){
                                        mine_arr(&tnt_x,&tnt_y);
                                        juzhen_tnt[tnt_x][tnt_y] = 8;
                                        sum_mine++;
                                }

                        }

                        // 来吧!这里开始挖雷
                        // emmmm... 怎么挖呢。。。
                        // 搞两个数组!一个来操作!,一个来验证!
                        bool prove_tnt(int x, int y){

                                if (juzhen_tnt[x][y] == 8){
                                        // 有雷
                                        return true;
                                }
                                else {
                                        return false;
                                }

                        }

};


int main(){

        saolei_a add;
        do {
                system("cls");
                if (sum_mine == 0){
                        add.tnt_arr(); // 没雷! 造!
                }
                else {
                        ; // 有了就不造了
                }
                add.huatu_saolei();
                add.Choice_saolei();


        }while(1);

        return 0;
}


奶奶的~ 循环次数是执行够了的~死活都给一个雷~ 求大佬解惑~
最佳答案
2018-2-7 20:23:40
风过无痕丶 发表于 2018-2-7 19:48
我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小 ...
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#include <cstdlib>

using namespace std;

const int MAX_BOOM_A = 15;
const int MAX_BOOM_B = 28;

int x, y;        // 横纵坐标
int sum_mine;        // 雷的个数


// 暂定 1为未知区域, 2为现行选中位置, 3为雷
char juzhen[16][16] = 
{
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

};

char juzhen_tnt[16][16] =
{

        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

};

class saolei_a {

public:
        char mine;                // 雷
        char Unknown_region;        // 未知区域
        char Choice_region;        // 选中区域

        // 先把图画出来!
        void huatu_saolei(void) {

                cout << "还剩下" << sum_mine << "个雷";
                cout << '\n' << '\n';
                cout << '\t' << '\t' << '\t';
                cout << "    欢迎来到扫雷小游戏!" << endl;
                cout << '\t' << '\t' << '\t';
                cout << "按下字母 w a s d  移动光标!";
                cout << '\n' << '\n' << '\n' << '\n';
                for(int i = 0; i < 16; i++)
                {
                        // 奶奶的!三个TAB又多了,只有加几个空格了!
                        cout << '\t' << '\t' << "     ";
                        for(int j = 0; j < 16; j++) {

                                if(juzhen[i][j] == 1) {
                                        cout << "■";  // 如果数组内容为1 就画 方块
                                }
                                else if(juzhen[i][j] == 2) {
                                        cout << "□"; // 如果数组内容为2 就画 空方块
                                }
                                else if(juzhen[i][j] == 8) {
                                        cout << "★";  // 如果数组内容为8 画五角星
                                }
                        }
                        cout << '\n';

                }
        }

        // 再搞个定位的函数算了,不然不知道怎么移动了~
        // 头绪不是很清晰,就用迭代来找吧~
        void gps_saolei(int *x, int *y) {

                for(int i = 0; i < 16; i++) {
                        for(int j = 0; j < 16; j++) {
                                if(juzhen[i][j] == 2) { // 2为现行选中项的标识符
                                        *x = i;
                                        *y = j;
                                }
                        }
                }

        }

        // 移动现行选中项
        void Choice_saolei(void) {
                Choice_region = getch();
                switch(Choice_region) {

                case 'w':
                        gps_saolei(&x, &y); //获取到现行选中项在什么位置!
                        juzhen[x - 1][y] = 2; // 把现在的位置变成 选中
                        juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
                        break;

                case 'a':
                        gps_saolei(&x, &y);
                        juzhen[x][y - 1] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 's':
                        gps_saolei(&x, &y);
                        juzhen[x + 1][y] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 'd':
                        gps_saolei(&x, &y);
                        juzhen[x][y + 1] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 'g':
                        gps_saolei(&x, &y);
                        if(prove_tnt(x, y)) {
                                cout << "游戏结束!";
                                exit(-1);
                        }
                        else {
                                cout << "那就继续来吧!" << endl;
                        }
                        break;
                }
        }

        // 来吧! 我要开始造雷了!
        // 我的思路是,选择挖的时候调用一次这个函数,
        // 反馈回去,这是不是雷区


        // 雷的位置!
        void mine_arr(int *x, int *y) {

                //srand((unsigned)time(NULL));        // 问题在这里
                *x = rand() % MAX_BOOM_A;
                *y = rand() % MAX_BOOM_A;
        }

        // 雷的个数
        int num_mine_arr(void) {
                int sum;
                //srand((unsigned)time(NULL));        // 问题在这里
                sum = rand() % MAX_BOOM_B;

                return sum;
        }

        // 这里开始造雷
        void tnt_arr(void)
        {
                int tnt_x, tnt_y;
                int sum = num_mine_arr();

                for(int i = 0; i < sum; i++)
                {
                        mine_arr(&tnt_x, &tnt_y);
                        
                        printf("x: %.2d,y: %.2d\n", tnt_x, tnt_y);                // debug
                        
                        
                        juzhen_tnt[tnt_x][tnt_y] = 8;
                        
                        juzhen[tnt_x][tnt_y] = 8;        // 在huatu_saolei函数中只看juzhen
                        
                                                        //for(int j = 0; j < 16; j++) {

                                                        //        if(juzhen[i][j] == 1) {
                                                        //                cout << "■";  // 如果数组内容为1 就画 方块
                                                        //        }
                                                        //        else if(juzhen[i][j] == 2) {
                                                        //                cout << "□"; // 如果数组内容为2 就画 空方块
                                                        //        }
                                                        //        else if(juzhen[i][j] == 8) {
                                                        //                cout << "★";  // 如果数组内容为8 画五角星
                                                        //        }
                                                        //}


                        sum_mine++;
                }

                getchar();                // debug
        }

        // 来吧!这里开始挖雷
        // emmmm... 怎么挖呢。。。
        // 搞两个数组!一个来操作!,一个来验证!
        bool prove_tnt(int x, int y) {

                if(juzhen_tnt[x][y] == 8) {
                        // 有雷
                        return true;
                }
                else {
                        return false;
                }

        }

};

int main(void)
{
        srand((unsigned)time(NULL));

        saolei_a add;
        do {
                system("cls");
                if(sum_mine == 0) {
                        add.tnt_arr(); // 没雷! 造!
                }
                else {
                        ; // 有了就不造了
                }
                add.huatu_saolei();
                add.Choice_saolei();


        }
        while(1);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-7 17:22:02 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 17:27:55 | 显示全部楼层

我的天呐! 我不是在分享啊! 我在请教问题啊!!!! 写了半上午啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 17:30:40 | 显示全部楼层
debug跑了半天也没看出什么毛病~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 18:30:44 | 显示全部楼层
什么情况?代码不完整?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 18:31:33 | 显示全部楼层
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:04:20 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-2-7 18:31

不是  后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:06:20 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:04
不是  后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~

不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:16:05 From FishC Mobile | 显示全部楼层
人造人 发表于 2018-2-7 19:06
不明白

sum_mine++ 后面的哪个方括号可以删了~  是贴到论坛里面来 加进去的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:17:48 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:16
sum_mine++ 后面的哪个方括号可以删了~  是贴到论坛里面来 加进去的~

哦,我算是明白了
发代码时不能加颜色
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:28:44 | 显示全部楼层
人造人 发表于 2018-2-7 19:17
哦,我算是明白了
发代码时不能加颜色

您费心帮我看看这代码什么毛病~
按照我的理解~
tnt_arr 成员函数里面的循环  循环次数是对的 也确实执行了那么多次
也就是说每执行一次 就会调用一次mine_arr函数
传的是地址 也应该改变对应的值多少次。
但是只有一个值~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 19:37:49 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 19:28
您费心帮我看看这代码什么毛病~
按照我的理解~
tnt_arr 成员函数里面的循环  循环次数是对的 也确 ...

添加雷的时候使用 数组juzhen_tnt
画雷的时候使用    数组juzhen
huatu_saolei 函数
for(int i = 0; i < 16; i++)
{
        cout << '\t' << '\t' << "     ";
        for(int j = 0; j < 16; j++)
        {

                if(juzhen[i][j] == 1) {
                        cout << "■";  // 如果数组内容为1 就画 方块
                }
                else if(juzhen[i][j] == 2) {
                        cout << "□"; // 如果数组内容为2 就画 空方块
                }
                else if(juzhen[i][j] == 8) {
                        cout << "★";  // 如果数组内容为8 画五角星
                }
        }
        cout << '\n';

}


// 这里开始造雷
        void tnt_arr(void)
        {
                int tnt_x, tnt_y;
                int sum = num_mine_arr();

                for(int i = 0; i < sum; i++)
                {
                        mine_arr(&tnt_x, &tnt_y);
                        juzhen_tnt[tnt_x][tnt_y] = 8;
                        sum_mine++;
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 19:48:17 | 显示全部楼层
人造人 发表于 2018-2-7 19:37
添加雷的时候使用 数组juzhen_tnt
画雷的时候使用    数组juzhen

我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小的数组,用junzhen_tnt 来做验证~juzhen数组的现行选中位置,和juzhen_tnt 数组相同的坐标来做判断。  如果juzhen_tnt 对应的位置是雷,就反馈回去~ 但是只有一个雷 就很难受了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 20:23:40 | 显示全部楼层    本楼为最佳答案   
风过无痕丶 发表于 2018-2-7 19:48
我就是这样做的啊~ juzhen_tnt  里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,  两个相同大小 ...
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#include <cstdlib>

using namespace std;

const int MAX_BOOM_A = 15;
const int MAX_BOOM_B = 28;

int x, y;        // 横纵坐标
int sum_mine;        // 雷的个数


// 暂定 1为未知区域, 2为现行选中位置, 3为雷
char juzhen[16][16] = 
{
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

};

char juzhen_tnt[16][16] =
{

        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},

};

class saolei_a {

public:
        char mine;                // 雷
        char Unknown_region;        // 未知区域
        char Choice_region;        // 选中区域

        // 先把图画出来!
        void huatu_saolei(void) {

                cout << "还剩下" << sum_mine << "个雷";
                cout << '\n' << '\n';
                cout << '\t' << '\t' << '\t';
                cout << "    欢迎来到扫雷小游戏!" << endl;
                cout << '\t' << '\t' << '\t';
                cout << "按下字母 w a s d  移动光标!";
                cout << '\n' << '\n' << '\n' << '\n';
                for(int i = 0; i < 16; i++)
                {
                        // 奶奶的!三个TAB又多了,只有加几个空格了!
                        cout << '\t' << '\t' << "     ";
                        for(int j = 0; j < 16; j++) {

                                if(juzhen[i][j] == 1) {
                                        cout << "■";  // 如果数组内容为1 就画 方块
                                }
                                else if(juzhen[i][j] == 2) {
                                        cout << "□"; // 如果数组内容为2 就画 空方块
                                }
                                else if(juzhen[i][j] == 8) {
                                        cout << "★";  // 如果数组内容为8 画五角星
                                }
                        }
                        cout << '\n';

                }
        }

        // 再搞个定位的函数算了,不然不知道怎么移动了~
        // 头绪不是很清晰,就用迭代来找吧~
        void gps_saolei(int *x, int *y) {

                for(int i = 0; i < 16; i++) {
                        for(int j = 0; j < 16; j++) {
                                if(juzhen[i][j] == 2) { // 2为现行选中项的标识符
                                        *x = i;
                                        *y = j;
                                }
                        }
                }

        }

        // 移动现行选中项
        void Choice_saolei(void) {
                Choice_region = getch();
                switch(Choice_region) {

                case 'w':
                        gps_saolei(&x, &y); //获取到现行选中项在什么位置!
                        juzhen[x - 1][y] = 2; // 把现在的位置变成 选中
                        juzhen[x][y] = 1;   // 把刚才的位置变成 未选中
                        break;

                case 'a':
                        gps_saolei(&x, &y);
                        juzhen[x][y - 1] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 's':
                        gps_saolei(&x, &y);
                        juzhen[x + 1][y] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 'd':
                        gps_saolei(&x, &y);
                        juzhen[x][y + 1] = 2;
                        juzhen[x][y] = 1;
                        break;
                case 'g':
                        gps_saolei(&x, &y);
                        if(prove_tnt(x, y)) {
                                cout << "游戏结束!";
                                exit(-1);
                        }
                        else {
                                cout << "那就继续来吧!" << endl;
                        }
                        break;
                }
        }

        // 来吧! 我要开始造雷了!
        // 我的思路是,选择挖的时候调用一次这个函数,
        // 反馈回去,这是不是雷区


        // 雷的位置!
        void mine_arr(int *x, int *y) {

                //srand((unsigned)time(NULL));        // 问题在这里
                *x = rand() % MAX_BOOM_A;
                *y = rand() % MAX_BOOM_A;
        }

        // 雷的个数
        int num_mine_arr(void) {
                int sum;
                //srand((unsigned)time(NULL));        // 问题在这里
                sum = rand() % MAX_BOOM_B;

                return sum;
        }

        // 这里开始造雷
        void tnt_arr(void)
        {
                int tnt_x, tnt_y;
                int sum = num_mine_arr();

                for(int i = 0; i < sum; i++)
                {
                        mine_arr(&tnt_x, &tnt_y);
                        
                        printf("x: %.2d,y: %.2d\n", tnt_x, tnt_y);                // debug
                        
                        
                        juzhen_tnt[tnt_x][tnt_y] = 8;
                        
                        juzhen[tnt_x][tnt_y] = 8;        // 在huatu_saolei函数中只看juzhen
                        
                                                        //for(int j = 0; j < 16; j++) {

                                                        //        if(juzhen[i][j] == 1) {
                                                        //                cout << "■";  // 如果数组内容为1 就画 方块
                                                        //        }
                                                        //        else if(juzhen[i][j] == 2) {
                                                        //                cout << "□"; // 如果数组内容为2 就画 空方块
                                                        //        }
                                                        //        else if(juzhen[i][j] == 8) {
                                                        //                cout << "★";  // 如果数组内容为8 画五角星
                                                        //        }
                                                        //}


                        sum_mine++;
                }

                getchar();                // debug
        }

        // 来吧!这里开始挖雷
        // emmmm... 怎么挖呢。。。
        // 搞两个数组!一个来操作!,一个来验证!
        bool prove_tnt(int x, int y) {

                if(juzhen_tnt[x][y] == 8) {
                        // 有雷
                        return true;
                }
                else {
                        return false;
                }

        }

};

int main(void)
{
        srand((unsigned)time(NULL));

        saolei_a add;
        do {
                system("cls");
                if(sum_mine == 0) {
                        add.tnt_arr(); // 没雷! 造!
                }
                else {
                        ; // 有了就不造了
                }
                add.huatu_saolei();
                add.Choice_saolei();


        }
        while(1);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:47:56 | 显示全部楼层

如果说在画图函数里面只看juzhen 数组,是没问题,
但是,雷的位置就显示出来了啊~ 这个小游戏就没意义了啊~
矩阵数组是显示出来的数组, 按照我的理解, 雷是不能显示出来的,
也就是说 juzhen数组里面不能有8这个值, 不然也没必要弄两个数组了啊
另外,Choice_saolei函数 会改变 juzhen数组的值, 如果说,现行选中项的位置就是雷。
如有雷放到juzhen数组里面  那么这个雷是不是就被变成了另外的值了。也就是说 这个雷也没效果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:53:47 | 显示全部楼层

不过只有一个雷的情况确实解决了!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 20:56:36 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 20:47
如果说在画图函数里面只看juzhen 数组,是没问题,
但是,雷的位置就显示出来了啊~ 这个小游戏就没意义 ...

你的程序问题是

函数mine_arr和num_mine_arr
// 雷的位置!
        void mine_arr(int *x, int *y) {

                //srand((unsigned)time(NULL));        // 问题在这里
                *x = rand() % MAX_BOOM_A;
                *y = rand() % MAX_BOOM_A;
        }

        // 雷的个数
        int num_mine_arr(void) {
                int sum;
                //srand((unsigned)time(NULL));        // 问题在这里
                sum = rand() % MAX_BOOM_B;

                return sum;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-7 20:57:14 | 显示全部楼层
人造人 发表于 2018-2-7 20:56
你的程序问题是

函数mine_arr和num_mine_arr

难道不要随机数种子吗~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 21:01:09 | 显示全部楼层
风过无痕丶 发表于 2018-2-7 20:57
难道不要随机数种子吗~

是啊
但是...
#include <iostream>
#include <time.h>

int GetRand(void)
{
        int sum;
        srand((unsigned)time(NULL));
        sum = rand() % 16;

        return sum;
}

int main(void)
{
        for(int i = 0; i < 10; ++i)
                std::cout << GetRand() << std::endl;

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-7 21:01:44 | 显示全部楼层
10
10
10
10
10
10
10
10
10
10
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 10:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表