扫雷程序-地雷位置生成(类库版)

可执行,结果错误。

 

#include<stdio.h>      
#include<stdlib.h>      
#include<time.h>      
      
#define nMine   10          // Number of mines    
#define nRow    10    
#define nCol    8    
    
class Miner
{
public:
	Miner(int,int,int);
	Miner();
	//m_PlateSet(int,int,int);
	m_MineLoc();

	Print();

private:
	int m_Row;
	int m_Col;
	int m_Area;			
	int m_MineNum;
	int *m_LocArray;
	int *m_PlateStateP;
	int m_IndexRow,m_IndexCol;
};

//default parameters
Miner::Miner()
{
	m_Row=10;
	m_Col=10;
	m_MineNum=10;
	m_Area=m_Row*m_Col;	
	
}

// parameters set by user.
Miner::Miner(int a,int b,int c)
{
	// The length of each "square" should be added with 2, ...
	// ... e.g. , if we want a 3-rowed matrix, the "m_Row" should be defined "5". ...
	// ... for in the following "generating" part ignores the data on the 1st and last rows/columns, ...
	// ... and the "print" part will hide those.
	m_Row=a+2;
	m_Col=b+2;
	m_MineNum=c;
	m_Area=m_Row*m_Col;
}

//Miner::m_FiledGen()

Miner::m_MineLoc()
{
	srand(time(NULL)); 
	
	int *(m_LocArray)=new int [m_MineNum*sizeof(int)];
	int *m_PlateStateP=new int [m_Area*sizeof(int)];
	for (int OriPSi=0;OriPSi<m_Area;OriPSi++)		// 初始化 is necessary,
	{												// for room 分配ed by 动态 will holds value !=0.
		*(m_PlateStateP+OriPSi)=0;
	}
	
    for(int q=0;q<m_MineNum;q++)    
    {   
		//		1D location of the mines	->
        //*(m_LocArray+q)=(rand()%(m_Area));       

       	//(m_LocArray+q)=new int [sizeof(int)];
		*(m_LocArray+q)=(rand()%(m_Row*m_Col));
	
        // Avoid overlap  
        for(int t=0;t<q;t++)  
        {  
            if(*(m_LocArray+q)==*(m_LocArray+t))  
            {  
                q--;  
            }  
        }
		// <-	1D location of the mines 


		// Set "Mine Point" .
		*(m_PlateStateP+(*(m_LocArray+q)))=9;
		//MineLoc2D[tempR+1][tempC+1]=9;   
		
		//	2D location of the mines		->
		m_IndexRow=(*(m_LocArray+q))/m_Col;    
		m_IndexCol=(*(m_LocArray+q))%m_Col;
		// <-	2D location of the mines		

		// Set neighbours of 'Mine's.					->
			// 2 lines added to both Row & Col,...
			// ...to avoid an "edge" mine.    
		
          

		
                                                    // "Squares" of this vector abandon.    
                                                    // To be modificated here.    
        if(*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol-1))<9) 
			++*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol-1));
		//if(MineLoc2D[tempR][tempC]<9) ++MineLoc2D[tempR][tempC];    
        
		if(*(m_PlateStateP+(m_IndexRow)*m_Col+(m_IndexCol+1))<9) 
			++*(m_PlateStateP+(m_IndexRow)*m_Col+(m_IndexCol+1));
		//if(MineLoc2D[tempR][tempC+1]<9) ++MineLoc2D[tempR][tempC+1];    
        
		if(*(m_PlateStateP+(m_IndexRow)*m_Col+(m_IndexCol-1))<9) 
			++*(m_PlateStateP+(m_IndexRow)*m_Col+(m_IndexCol-1));
		//if(MineLoc2D[tempR][tempC+2]<9) ++MineLoc2D[tempR][tempC+2];    
        
		if(*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol))<9) 
			++*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol));
		//if(MineLoc2D[tempR+1][tempC]<9) ++MineLoc2D[tempR+1][tempC];    
        
		if(*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol-1))<9) 
			++*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol-1));
		//if(MineLoc2D[tempR+1][tempC+2]<9) ++MineLoc2D[tempR+1][tempC+2];    

        if(*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol+1))<9) 
			++*(m_PlateStateP+(m_IndexRow+1)*m_Col+(m_IndexCol+1));
		//if(MineLoc2D[tempR+2][tempC]<9) ++MineLoc2D[tempR+2][tempC];    
        
		if(*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol+1))<9) 
			++*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol+1));
		//if(MineLoc2D[tempR+2][tempC+1]<9) ++MineLoc2D[tempR+2][tempC+1];    
        
		if(*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol))<9) 
			++*(m_PlateStateP+(m_IndexRow-1)*m_Col+(m_IndexCol));
		//if(MineLoc2D[tempR+2][tempC+2]<9) ++MineLoc2D[tempR+2][tempC+2];  
		
    } 
	for(int k=0;k<m_Row;k++)    
    {    
        for(int j=0;j<m_Col;j++)    
        {    
             printf("%d   ",*(m_PlateStateP+k*m_Col+j));    
        }    
         printf("\n\n\n");    
    } 
		
}



Miner::Print()
{
	
	for(int k=1;k<m_Row-1;k++)    
    {    
        for(int j=1;j<m_Col-1;j++)    
        {    
             printf("%d   ",*(m_PlateStateP+k*m_Col+j));    
        }    
         printf("\n\n\n");    
    } 
	

}

void main()
{
	Miner m1=Miner(2,2,3);

	m1.m_MineLoc();
//	m1.Print();

	system("pause");
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值