2 qq 30137777 qq_30137777 于 2016.05.08 22:30 提问

C程序写了一个简化的控制台的扫雷,想问下,怎么才能在每次运行时,动态随机埋雷?

```// Duplicate.cpp : Defines the entry point for the console application.
//

#include
#include

const int START_X = 27;
const int START_Y = 13;
const int MAX_X = 9;
const int MAX_Y = 9;

class Cube;
void setBomb();
void checkAndSetNearBomb(int, int);
void show();
void showXY();
void cursorGoTo(int, int);
void gameStart();
void autoOpen(int , int);
int player();
int ifWin();

int main()
{
//initialize
gameStart();
//display graphics
show();
//play
while (player()){}
return 0;
}

class Cube{
private:
int nearHaveBombNumber;
bool ifOpen;
bool ifHaveBomb;
public :
void setNearHaveBombNumber(int number){
this->nearHaveBombNumber = number;
}
int getNearHaveBombNumber(){
return this->nearHaveBombNumber;
}
void setOpen(){
this->ifOpen = true;
}
bool getIfOpen(){
return ifOpen;
}
void setHaveBomb(){
this->ifHaveBomb = true;
}
bool getIfHaveBomb(){
return this->ifHaveBomb;
}
void resetCube(){
this->ifOpen = false;
this->ifHaveBomb = false;
this->nearHaveBombNumber = 0;
}
};
Cube cube[MAX_X][MAX_Y];

//initialize game
void gameStart(){
//initialize cube object
for (int i = 0; i < MAX_X; i++){
for (int j = 0; j < MAX_Y; j++){
cube[j][i].resetCube();
}
}
//set random bomb of cube
setBomb();
//set near bomb number
for (int i = 0; i < MAX_X; i++){
for (int j = 0; j < MAX_Y; j++){
checkAndSetNearBomb(i ,j);
}
}
}
void setBomb(){
int counter = 0;
srand((unsigned)GetCurrentTime());
while (!(counter == 10)){
int nx = rand() % MAX_X;
int ny = rand() % MAX_Y;
if ((nx >= 0 && nx <= 8) && ((ny >= 0 && ny <= 8))){
cube[nx][ny].setHaveBomb();
counter ++;
}
}

}
void checkAndSetNearBomb(int x, int y){
int counter = 0;
if (cube[x][y].getIfHaveBomb() == true){
return;
}
for (int i = -1; i < 2; i++){
for (int j = -1; j < 2; j++){
if (!(i == 0 && j == 0) && cube[x + i][y + j].getIfHaveBomb() == true){
counter++;
}
}
}
cube[x][y].setNearHaveBombNumber(counter);
}

//display graphics
void show(){
//clear console
system("cls");
//display coordinate
showXY();
//display lid
for (int i = 0; i < MAX_X; i++){
cursorGoTo(START_X, START_Y-i);
for (int j = 0; j < MAX_Y; j++){
if (cube[i][j].getIfOpen() == true){
if (cube[i][j].getIfHaveBomb() == false){
if (cube[i][j].getNearHaveBombNumber() == 0){
printf(" ");
}
else{
printf("%d ", cube[i][j].getNearHaveBombNumber());
}
}
else{
printf("* ");
}
}
else{
printf("■");//the cube is not open display '鈻?
}
}
}
}
void showXY(){
//display coordinate
cursorGoTo(START_X, START_Y+2);
printf("X");
cursorGoTo(START_X-3, START_Y);
printf("Y");
//output X
for (int i = 0; i < 2*MAX_X; i+=2){
cursorGoTo(START_X+i, START_Y+1);
printf("%d", i/2);
}
//output Y
for (int i = 0; i < MAX_Y; i++){
cursorGoTo(START_X-1, START_Y-i);
printf("%d", i);
}
}
void cursorGoTo(int x, int y){
//obtain console cursor
COORD coord = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int player(){
cursorGoTo(0 , 0);
printf("Please enter (x,y), and the coordinate betweent 0 and 8, separate with whitespace");
int x, y, flag = 1, over = 0;
do{
cursorGoTo(START_X+3, START_Y+4);
scanf("%d%d", &y, &x, 2);
if (!((x >= 0 && x <= 8) && (y >= 0 && y <= 8)) && cube[x][y].getIfOpen()){
printf("Please enter again!");
}
else{
flag = 0;
}
} while (flag);
cube[x][y].setOpen();
show();
if (cube[x][y].getIfHaveBomb() == true){
printf("Unfortunately! you are losed!");
for(int i=0; i<MAX_X; i++){
for(int j=0; j<MAX_Y; j++){
cube[i][j].setOpen();
}
}
show();
return 0;
}
if (cube[x][y].getNearHaveBombNumber() == 0){
autoOpen(x, y);
show();
}
over = ifWin();
if (over){
return 0;
}
return 1;
}
void autoOpen(int x, int y){
for (int i = -1; i < MAX_X; i++){
for (int j = -1; j < MAX_Y; j++){
if ((!(i == 0 && j == 0)) && cube[x + i][y + j].getNearHaveBombNumber() == 0){
cube[x + i][y + j].setOpen();
autoOpen(x + i, y + j);
}
}
}
}
int ifWin(){
int counter = 0;
for (int i = 0; i < MAX_X; i++){
for (int j = 0; j < MAX_Y; j++){
if (cube[i][j].getIfOpen() == true && cube[i][j].getIfHaveBomb() == true){
counter++;
}
}
}
if (counter == 10){
printf("Conguratulation!you are wine!");
return 1;
}
return 0;
}

这个程序里,编译运行后,每次运行埋雷的位置都一样,怎么解决呢?使每次运行都重新计算埋雷的位置。

2个回答

devmiao
devmiao   Ds   Rxr 2016.05.08 23:49
havedream_one
havedream_one   2016.05.09 08:34

在程序一开始的地址加一个方法,这个方法实现随机计算埋雷的位置

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
微信红包扫雷埋雷代码源
微信红包代码源·数量有限·值得借鉴·.......................................................................................
控制台的扫雷程序(C语言)
// 扫雷程序 C-Free编译通过 // by: 瑞 2012-9-20 // 文件名: mine.cpp #include #include #include #include #define OUTPUT_STR(str) printf(str) #define INPUT_STR(str) gets(str) #define CLRSCREEN system("cls")
用c语言写一个简单的扫雷
用c语言写一个简单的扫雷 目录 用c语言写一个简单的扫雷 目录 1.所需要的知识 2.总体思路 3.详细实现 菜单函数 执行菜单 游戏主体函数 打印面板函数 埋雷函数 扫雷函数 空白算法函数 4.程序运行效果 1.所需要的知识 c语言的基本语法,简单的二维数组,一点简单的递归知识。 2.总体思路 扫雷游戏主要由3个部分组成,埋雷子,扫雷,判断输赢。 ...
控制台扫雷的简单实现
package com.hui.扫雷;import java.util.Scanner;public class 扫雷 { public static void main(String[] args) { 扫雷 user = new 扫雷(); int map[][] = new int[15][15]; Scanner input = new
微信抢红包软件吊炸天埋雷扫雷辅助软件
微信抢红包软件吊炸天埋雷扫雷辅助软件 非常好用 百度下载地址:链接:http://pan.baidu.com/s/1bE7k8e 密码:t3x0
JAVA自动扫雷(非作弊)
以此文纪念我的初恋。                                        --Nicholas Lin         呵呵,前GF特喜欢扫雷,我扫她不过,就想写个和windows自带的扫雷一样的程序来骗她。结果就是前面的《JAVA扫雷完整仿制》了。后来心情郁闷,就想写个自动扫雷的算法。算法在去年十二月底完成,代码在一月初完成。一直在思考完善的可能性,不过今天
c++ 控制台版 扫雷游戏
白天看了一天书看累了,晚上瞅见扫雷游戏,就自己琢磨着做一个呗。想了一会,也没看别人怎么做的,大概1个多小时完成了这个简单版本的扫雷游戏,由于没怎么学过c#,界面的事情可能迟几天再做,明天要回家啦,哈哈! 先说思路,其实挺简单的。 (1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段。 (2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里
C#控制台版扫雷游戏
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 {     class Program     {         static void Main(string[] args)
有没有挂可以控制微信红包埋雷尾数规律
【微/信:app36678】微信红包尾数软件控制器,扫雷埋雷排雷设置尾数软件。红包控制尾数软件作弊器 可以装挂        加 微信 ----->         app36678        加 微信 ----->         app36678     控制尾数挂 只需要装一个红包控制尾数扫雷辅助软件进你手机
c语言扫雷程序
用c语言实现一个扫雷程序,有挑战性的主要有两部分内容:游戏的逻辑,空白区域的炸开算法  1.游戏核心逻辑 观察Windwos的扫雷游戏,可以知道,一个格子有两种类型的状态需要描述,一种类型是这个格子是否有雷,另外一种状态是格子的绘制状态,这个类型就多了,格子上可能显示未知,数字,空白,旗帜,疑问,雷,一共是6种类型。 2.空白区域炸开算法 关于空白区域的炸开,至于炸到什么程度为止,通过观察