扫雷小游戏求助~
本帖最后由 风过无痕丶 于 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{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,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 == 1){
cout << "■";// 如果数组内容为1 就画 方块
}
else if (juzhen == 2){
cout << "□"; // 如果数组内容为2 就画 空方块
}
else if (juzhen == 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 == 2){ // 2为现行选中项的标识符
*x = i;
*y = j;
}
}
}
}
// 移动现行选中项
void Choice_saolei(void){
Choice_region = getch();
switch(Choice_region){
case 'w' :
gps_saolei(&x,&y); //获取到现行选中项在什么位置!
juzhen = 2; // 把现在的位置变成 选中
juzhen = 1; // 把刚才的位置变成 未选中
break;
case 'a':
gps_saolei(&x,&y);
juzhen = 2;
juzhen = 1;
break;
case 's':
gps_saolei(&x,&y);
juzhen = 2;
juzhen = 1;
break;
case 'd' :
gps_saolei(&x,&y);
juzhen = 2;
juzhen = 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 = 8;
sum_mine++;
}
}
// 来吧!这里开始挖雷
// emmmm... 怎么挖呢。。。
// 搞两个数组!一个来操作!,一个来验证!
bool prove_tnt(int x, int y){
if (juzhen_tnt == 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 17:22
感谢分享
我的天呐! 我不是在分享啊! 我在请教问题啊!!!! 写了半上午啊! {:10_277:}debug跑了半天也没看出什么毛病~ 什么情况?代码不完整?
人造人 发表于 2018-2-7 18:31
不是后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~ 风过无痕丶 发表于 2018-2-7 19:04
不是后面的方括号里面的是放这里面才有的~ 我本来想设置一个红色 让人一眼看出问题~ 没想到没变色~
不明白 人造人 发表于 2018-2-7 19:06
不明白
sum_mine++ 后面的哪个方括号可以删了~是贴到论坛里面来 加进去的~ 风过无痕丶 发表于 2018-2-7 19:16
sum_mine++ 后面的哪个方括号可以删了~是贴到论坛里面来 加进去的~
哦,我算是明白了
发代码时不能加颜色
人造人 发表于 2018-2-7 19:17
哦,我算是明白了
发代码时不能加颜色
您费心帮我看看这代码什么毛病~
按照我的理解~
tnt_arr 成员函数里面的循环循环次数是对的 也确实执行了那么多次
也就是说每执行一次 就会调用一次mine_arr函数
传的是地址 也应该改变对应的值多少次。
但是只有一个值~ 风过无痕丶 发表于 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 == 1) {
cout << "■";// 如果数组内容为1 就画 方块
}
else if(juzhen == 2) {
cout << "□"; // 如果数组内容为2 就画 空方块
}
else if(juzhen == 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 = 8;
sum_mine++;
}
}
人造人 发表于 2018-2-7 19:37
添加雷的时候使用 数组juzhen_tnt
画雷的时候使用 数组juzhen
我就是这样做的啊~ juzhen_tnt里面存放的就是雷啊~ 操作的时候用的就是juzhen这个数组,两个相同大小的数组,用junzhen_tnt 来做验证~juzhen数组的现行选中位置,和juzhen_tnt 数组相同的坐标来做判断。如果juzhen_tnt 对应的位置是雷,就反馈回去~ 但是只有一个雷 就很难受了 风过无痕丶 发表于 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 =
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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 =
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 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 == 1) {
cout << "■";// 如果数组内容为1 就画 方块
}
else if(juzhen == 2) {
cout << "□"; // 如果数组内容为2 就画 空方块
}
else if(juzhen == 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 == 2) { // 2为现行选中项的标识符
*x = i;
*y = j;
}
}
}
}
// 移动现行选中项
void Choice_saolei(void) {
Choice_region = getch();
switch(Choice_region) {
case 'w':
gps_saolei(&x, &y); //获取到现行选中项在什么位置!
juzhen = 2; // 把现在的位置变成 选中
juzhen = 1; // 把刚才的位置变成 未选中
break;
case 'a':
gps_saolei(&x, &y);
juzhen = 2;
juzhen = 1;
break;
case 's':
gps_saolei(&x, &y);
juzhen = 2;
juzhen = 1;
break;
case 'd':
gps_saolei(&x, &y);
juzhen = 2;
juzhen = 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 = 8;
juzhen = 8; // 在huatu_saolei函数中只看juzhen
//for(int j = 0; j < 16; j++) {
// if(juzhen == 1) {
// cout << "■";// 如果数组内容为1 就画 方块
// }
// else if(juzhen == 2) {
// cout << "□"; // 如果数组内容为2 就画 空方块
// }
// else if(juzhen == 8) {
// cout << "★";// 如果数组内容为8 画五角星
// }
//}
sum_mine++;
}
getchar(); // debug
}
// 来吧!这里开始挖雷
// emmmm... 怎么挖呢。。。
// 搞两个数组!一个来操作!,一个来验证!
bool prove_tnt(int x, int y) {
if(juzhen_tnt == 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;
}
人造人 发表于 2018-2-7 20:23
如果说在画图函数里面只看juzhen 数组,是没问题,
但是,雷的位置就显示出来了啊~ 这个小游戏就没意义了啊~
矩阵数组是显示出来的数组, 按照我的理解, 雷是不能显示出来的,
也就是说 juzhen数组里面不能有8这个值, 不然也没必要弄两个数组了啊
另外,Choice_saolei函数 会改变 juzhen数组的值, 如果说,现行选中项的位置就是雷。
如有雷放到juzhen数组里面那么这个雷是不是就被变成了另外的值了。也就是说 这个雷也没效果了
人造人 发表于 2018-2-7 20:23
不过只有一个雷的情况确实解决了!谢谢! 风过无痕丶 发表于 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;
} 人造人 发表于 2018-2-7 20:56
你的程序问题是
函数mine_arr和num_mine_arr
难道不要随机数种子吗~ 风过无痕丶 发表于 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;
}
10
10
10
10
10
10
10
10
10
10
请按任意键继续. . .
页:
[1]
2