扫雷-添加输出边框效果(2013-08-24)

// Miner_Console.cpp : 定义控制台应用程序的入口点。   
//   
  
#include "stdafx.h"   
#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();  
    int *m_MineLoc();  
    int *m_PlateSet(int *Loc1D);  
    void TextOutFull(int *PlateStateP);  
    void TextOut(int *PlateStateP);  
  
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;  
    m_Col=b;  
    m_MineNum=c;  
    m_Area=m_Row*m_Col;  
}  
  
//Miner::m_FiledGen()   
  
int *Miner::m_MineLoc()  
{  
  
    int *(m_LocArray)=new int [m_MineNum*sizeof(int)];  
  
    srand(time(NULL));  
    for(int q=0;q<m_MineNum;q++)      
    {     
        //      1D location of the mines    ->   
        *(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    
    }  
    return m_LocArray;  
}  
  
int *Miner::m_PlateSet(int *m_LocArray)  
{  
    int *m_PlateStateP=new int [(m_Row+2)*(m_Col+2)*sizeof(int)];  
    for (int OriPSi=0;OriPSi<(m_Row+2)*(m_Col+2);OriPSi++)       // 初始化 is necessary,   
    {                                               // for room 分配ed by 动态 will holds value !=0.   
        *(m_PlateStateP+OriPSi)=0;  
    }  
    //坐标转化,加一圈边   
    for(int q=0;q<m_MineNum;q++)   
    {  
  
        m_IndexRow=(*(m_LocArray+q))/m_Col;      
        m_IndexCol=(*(m_LocArray+q))%m_Col;  
        (*(m_LocArray+q))=(m_IndexRow+1)*(m_Col+2)+(m_IndexCol+1);  
  
  
  
        // Set "Mine Point" .   
        *(m_PlateStateP+(*(m_LocArray+q)))=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_LocArray+q))-1)<9)  // left   
        {++(*(m_PlateStateP+(*(m_LocArray+q))-1));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))+1)<9)  // right   
        {++(*(m_PlateStateP+(*(m_LocArray+q))+1));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-2)<9)  // up   
        {++(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-2));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+2)<9)  // down   
        {++(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+2));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-3)<9)  // leftup   
        {++(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-3));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-1)<9)  // rightup   
        {++(*(m_PlateStateP+(*(m_LocArray+q))-m_Col-1));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+1)<9)  // leftdown   
        {++(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+1));}  
  
        if(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+3)<9)  // rightdown   
        {++(*(m_PlateStateP+(*(m_LocArray+q))+m_Col+3));}  
  
  
  
    }   
  
  
  
    return m_PlateStateP;  
  
}  
  
  
void Miner::TextOutFull(int *m_PlateStateP)
{



	//2013-08-23 添加边框效果
	printf("   ");											//上边框.两个空格是为了好看,要跟下面左边框一致。
	for(int zi=m_Col+2;zi>0;zi--) printf("----- ");			//上边框
	printf("\n");

	for(int z=0;z<(m_Row+2)*(m_Col+2);z++)
	{	
		


		printf("  |  %d",*(m_PlateStateP+z));					//左边框。两个空格是为了好看,要跟上面上边框一致。
		if(0==(z+1)%(m_Col+2))
		{
			printf("  |");										//右边框
			printf("\n");

			printf("   ");										//下边框.
			for(int zi=m_Col+2;zi>0;zi--) printf("----- ");	
			
			printf("\n");										//下边框
		}

	}


}
  
void Miner::TextOut(int *m_PlateStateP)  
{  
    for(int z=m_Col+2;z<(m_Row+2)*(m_Col+2)-m_Col-2;z++)  
    {  
  
        if(0==z%(m_Col+2)) {z++;}  
        if(0==(z+1)%(m_Col+2))      {z++;printf("\n\n\n");}  
        else {printf("%d   ",*(m_PlateStateP+z));}  
    }  
}  
  
void main()  
{  
    Miner m1=Miner(4,3,4);  
    int *Loc=m1.m_MineLoc();  
    int *PlateSet=m1.m_PlateSet(Loc);  
    m1.TextOutFull(PlateSet);  
    m1.TextOut(PlateSet);  
    system("pause");  
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 C 语言的扫雷游戏倒计时代码,可以在 VS2013 中运行。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> #define ROW 10 #define COL 10 #define MINE_NUM 10 void drawMap(char map[ROW][COL], int row, int col); void initMap(char map[ROW][COL], int row, int col, int mineNum); int getMineCount(char map[ROW][COL], int row, int col, int x, int y); void expand(char map[ROW][COL], int row, int col, int x, int y); int checkWin(char map[ROW][COL], int row, int col, int mineNum); int main() { char map[ROW][COL]; int row = ROW; int col = COL; int mineNum = MINE_NUM; initMap(map, row, col, mineNum); int start = time(NULL); int elapsed = 0; while (1) { system("cls"); drawMap(map, row, col); if (checkWin(map, row, col, mineNum)) { printf("\nYou win!\n"); break; } if (elapsed >= 60) { printf("\nTime is up! You lose!\n"); break; } printf("\nElapsed time: %d seconds\n", elapsed); printf("Remaining mines: %d\n", mineNum); int x, y; printf("Enter the coordinates (row, col): "); scanf_s("%d %d", &x, &y); if (x < 0 || x >= row || y < 0 || y >= col) { printf("Invalid coordinates!\n"); continue; } if (map[x][y] == '*') { printf("You hit a mine! You lose!\n"); break; } if (map[x][y] >= '0' && map[x][y] <= '9') { printf("The cell has been revealed!\n"); continue; } if (getMineCount(map, ROW, COL, x, y) == 0) { expand(map, ROW, COL, x, y); } else { map[x][y] = getMineCount(map, ROW, COL, x, y) + '0'; } elapsed = time(NULL) - start; } drawMap(map, ROW, COL); printf("\nPress any key to exit..."); _getch(); return 0; } void drawMap(char map[ROW][COL], int row, int col) { printf(" "); for (int j = 0; j < col; j++) { printf("%d ", j); } printf("\n"); for (int i = 0; i < row; i++) { printf("%d ", i); for (int j = 0; j < col; j++) { printf("%c ", map[i][j]); } printf("\n"); } } void initMap(char map[ROW][COL], int row, int col, int mineNum) { srand(time(NULL)); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { map[i][j] = '-'; } } int count = 0; while (count < mineNum) { int x = rand() % row; int y = rand() % col; if (map[x][y] != '*') { map[x][y] = '*'; count++; } } } int getMineCount(char map[ROW][COL], int row, int col, int x, int y) { int count = 0; if (x > 0 && map[x - 1][y] == '*') { count++; } if (x < row - 1 && map[x + 1][y] == '*') { count++; } if (y > 0 && map[x][y - 1] == '*') { count++; } if (y < col - 1 && map[x][y + 1] == '*') { count++; } if (x > 0 && y > 0 && map[x - 1][y - 1] == '*') { count++; } if (x > 0 && y < col - 1 && map[x - 1][y + 1] == '*') { count++; } if (x < row - 1 && y > 0 && map[x + 1][y - 1] == '*') { count++; } if (x < row - 1 && y < col - 1 && map[x + 1][y + 1] == '*') { count++; } return count; } void expand(char map[ROW][COL], int row, int col, int x, int y) { if (x < 0 || x >= row || y < 0 || y >= col) { return; } if (map[x][y] != '-') { return; } int count = getMineCount(map, ROW, COL, x, y); if (count > 0) { map[x][y] = count + '0'; return; } map[x][y] = ' '; expand(map, ROW, COL, x - 1, y); expand(map, ROW, COL, x + 1, y); expand(map, ROW, COL, x, y - 1); expand(map, ROW, COL, x, y + 1); } int checkWin(char map[ROW][COL], int row, int col, int mineNum) { int count = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (map[i][j] == '-') { count++; } } } if (count == mineNum) { return 1; } return 0; } ``` 这个代码实现了一个简单的扫雷游戏,并且有倒计时功能。在游戏开始时,程序会记录当前时间,每次循环计算已经过去的时间,并在屏幕上显示出来。当时间超过 60 秒时,游戏结束,玩家失败。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值