马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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++;[/color]
- }
- }
- // 来吧!这里开始挖雷
- // 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;
- }
复制代码
奶奶的~ 循环次数是执行够了的~死活都给一个雷~ 求大佬解惑~
- #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;
- }
复制代码
|