1. 程式人生 > >經典掃雷 性感再上線

經典掃雷 性感再上線

mine_clearance.c

#include"game.h"
 
void menu()
{
	printf("********************\n");
	printf("*****  1.play  *****\n");
	printf("*****  0.exit  *****\n");
	printf("********************\n");
}
 
void game()
{
	int x = 0;
	int y = 0;
	int count = MINE_NUM;
	char mineboard[ROWS][COLS] = { 0 };//放雷的雷盤
	char findboard[ROWS][COLS] = { 0 };//排雷的雷盤
 
	char textboard[ROWS][COLS] = { 0 };//測試是否展開的雷盤
	InitBoard(textboard, ROWS, COLS, '0');
 
 
	InitBoard(mineboard, ROWS, COLS, '0');
	InitBoard(findboard, ROWS, COLS, '*');
	SetMine(mineboard, ROWS, COLS, count);
	FindMine(mineboard, findboard,textboard, x, y);
 
}
 
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出遊戲!\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇!\n");
			break;
		}
 
	} while (input);
 
	system("pause");
	return 0;
}

game.c

#include"game.h"
 
 
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch)
{
	memset(&board[0][0], ch, rows*cols * sizeof(board[0][0]));
}
 
 
void ShowBoard(char findboard[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
 
	printf("   ");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n\n");
 
	for (i = 1; i <= row; i++)
	{
		printf("%d  ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", findboard[i][j]);
		}
		printf("\n");
	}
}
 
 
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count)
{
	int i = 0;
	int j = 0;
	while (count != 0)
	{
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (mineboard[i][j] == '0')
		{
			mineboard[i][j] = '1';
			count--;
		}
	}
}
 
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y)
{
	findboard[x][y] = mineboard[x - 1][y]
		+ mineboard[x - 1][y - 1]
		+ mineboard[x][y - 1]
		+ mineboard[x + 1][y - 1]
		+ mineboard[x + 1][y]
		+ mineboard[x + 1][y + 1]
		+ mineboard[x][y + 1]
		+ mineboard[x - 1][y + 1]
		- 7 * '0';
	
}
 
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
	textboard[x][y] = '1';
	if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
	{
		Compute(findboard, mineboard, x, y);
		if (findboard[x][y] == '0')
		{			
				Compute(findboard, mineboard, x - 1, y);
				Compute(findboard, mineboard, x - 1, y - 1);
				Compute(findboard, mineboard,  x, y - 1);
				Compute(findboard, mineboard,  x + 1, y - 1);
				Compute(findboard, mineboard, x + 1, y);
				Compute(findboard, mineboard,  x + 1, y + 1);
				Compute(findboard, mineboard, x, y + 1);
				Compute(findboard, mineboard,  x - 1, y + 1);
				if (findboard[x - 1][y] == '0')
				{	
					if (textboard[x - 1][y] == '0')
					{
						Open(findboard, mineboard, textboard, x - 1, y);
					}	
				}
 
				if (findboard[x][y - 1] == '0')
				{			
					if (textboard[x][y - 1] == '0')
					{
						Open(findboard, mineboard, textboard, x, y - 1);
					}
				}
 
				if (findboard[x + 1][y] == '0')
				{				
					if (textboard[x + 1][y] == '0')
					{
						Open(findboard, mineboard, textboard, x + 1, y);
					}
				}
 
				if (findboard[x][y + 1] == '0')
				{		
					if (textboard[x][y + 1] == '0')
					{
						Open(findboard, mineboard, textboard, x, y + 1);
					}
				}
 
		}
	}
}
 
 
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
	ShowBoard(mineboard, ROW, COL);
 
	int ret = ROW * COL - MINE_NUM;
	int count = 0;
	while (1)
	{
		int time0 = 0;
		int time1 = 0;
		int time2 = 0;
		
		ShowBoard(findboard, ROW, COL);
		time1 =(unsigned int) time(NULL);
		printf("請輸入你要排雷的座標:>");
		scanf("%d%d", &x, &y);
		if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
		{
			count++;
			if (mineboard[x][y] == '1')
			{
				if (count == 1)
				{
					SetMine(mineboard, ROWS, COLS, count);
					mineboard[x][y] = '0';
					Open(findboard, mineboard,textboard, x, y);
				}
				else
				{
					time2 = (unsigned int)time(NULL);
					time0 = time2 - time1;
					printf("很遺憾,你被炸死了!  所用時間:%ds\n", time0);
					ShowBoard(mineboard, ROW, COL);
					break;
				}
 
			}
			else
			{
				ret--;
				Open(findboard, mineboard, textboard, x, y);
			}
		}
		else
		{
			printf("輸入座標有誤,請重新輸入!\n");
		}
		if (ret == 0)
		{
			time2 = (unsigned int)time(NULL);
			time0 = time2 - time1;
			printf("恭喜你,遊戲通關!  所用時間:%ds\n",time0);
			ShowBoard(mineboard, ROW, COL);
			break;
		}
	}
}

game.h

#ifndef __GAME_H__
#define __GAME_H__
 
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
 
#include <stdio.h>


#define  __GAME_H__
 
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
 
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUM 10//遊戲中的雷數
 
//初始化雷盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch);
//展示雷盤
void ShowBoard(char findboard[ROWS][COLS], int row, int col);
//埋雷
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count);
//計算雷數
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y);
//展開雷陣
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y);
//排雷
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS],char textboard[ROWS][COLS], int x, int y);
 
 
#endif //__GAME_H__