大學生的小樂趣:C++ 掃雷遊戲的製作

#ifndef SAOLEI_H
#define SAOLEI_H

class Block
{
	friend class Saoleigame;
public:
	Block();
	bool isShown();
	void setnum(int);
	int getnum();
	bool isbomb();
protected:
	int num;
	bool flag_show;
	int x;
	int y;
};

class Saoleigame
{
	
public:
	Saoleigame();
	~Saoleigame();
	void _init_();
	void gameStart();
	void reflash();
	void check(int x, int y);
	void click(int x, int y);
	void gameOver();
private:
	Block juzheng[100];
	bool flag;
	int b[10];
	unsigned int score;
};

#endif

以上是編寫的頭文件

#include<iostream>
#include<cstdlib>
#include<ctime>
#include"Saolei.h"
using namespace std;



Saoleigame::Saoleigame()
{
	_init_();
	flag = true;
	score = 0;
}
Saoleigame::~Saoleigame()
{

}
void Saoleigame::_init_()
{
	srand(time(NULL));
	for( int i = 0; i < 10; i++ )
	{
		b[i] = -1;
	}
	for(int i = 0; i < 10; i ++ )
	{
		bool temp_flag = false;
		do
		{
			int temp = (unsigned int)rand()%100;
			
			for( int j = 0; j < i; j ++)
			{
				if(temp == b[i])
				{
					temp_flag = true;
				}
			}
			if(!temp_flag)
			{
				b[i] = temp;
			}
		}while(temp_flag);
	}
	for(int i = 0; i < 10; i++ )
	{
		juzheng[b[i]].setnum(-1);
	}
	for( int i = 0; i < 10; i ++ )
	{
		for( int j = 0;  j < 10;j++)
		{
			juzheng[i*10+j].x = i+1;
			juzheng[i*10+j].y = j+1;
		}
	}



	for(int m = 0; m < 10; m ++ )
	{
		for( int n = 0; n < 10 ; n++ )
		{
			check(m + 1, n + 1);
		}
	}

}
void Saoleigame::check(int x, int y)
{
	if(juzheng[(x - 1)*10 + (y - 1)].num == -1)return;
	int trans = (x - 1)*10 + (y - 1);
	int number = 0;
	for( int i = -1; i < 2; i ++ )
	{
		for(int j = -1; j < 2; j ++)
		{
			if(!(x + i<= 0 && x + i >= 10 || j + y <= 0 && y + j >= 10))
			{
				if(juzheng[(x + i - 1)*10 + (y + j - 1)].num == -1) number ++;
			}
		}
	}
	juzheng[(x - 1)*10 + (y - 1)].setnum(number);
}

void Saoleigame::click(int x, int y)
{

	if(juzheng[(x- 1)*10 + (y - 1)].num == 0)
	{
		for( int i = -1; i < 2; i ++ )
		{
			for(int j = -1; j < 2; j ++)
			{
				if(!((x + i<= 0 || x + i > 10 )|| (j + y <= 0 || y + j > 10)) && !(i == 0&& j ==0) && !juzheng[(x+i- 1)*10 + (y +j- 1)].flag_show){
					juzheng[(x+i- 1)*10 + (y +j- 1)].flag_show = true;
					click(x + i, y + j);
				}
			}
		}
	}
	juzheng[(x- 1)*10 + (y - 1)].flag_show = true;
	return;
}

void Saoleigame::gameStart()
{
	
	do
	{
		reflash();
		int x, y;
		cout<<"input the position: ";
		cin >> x>> y;
		if(juzheng[(x-1)*10 + (y-1)].isbomb())
		{
			gameOver();
			return;
		}
		else
		{
			click(x , y);
			
		}
	}while(flag);
}
void Saoleigame::reflash()
{
	system("cls");
	score = 0;
	cout<<"           掃雷"<<endl;
	cout<<"   1 2 3 4 5 6 7 8 9 10"<<endl;
	cout<<"   -------------------"<<endl;
	for(int i = 0; i < 100; i ++ )
	{
		if(i%10 == 0)
		{
			if(i /10 + 1 == 10)cout<<10<<"|";
			else cout<<i /10 + 1<<" |";
		}
		
		if(juzheng[i].isShown())
		{
			if(juzheng[i].isShown() && (juzheng[i].getnum())!=-1)
			{
				score ++;
			}
			if((juzheng[i].getnum())==-1)cout <<"*"<<"|";
			else cout <<juzheng[i].getnum()<<"|";
			
		}
		else
		{
			cout<<" |";
		}
		if((i+1)%10 == 0)cout<<endl;
	}
	cout<<"   -------------------"<<endl;
	cout<<"score:"<<(score*100)/95<<endl;
}
void Saoleigame::gameOver()
{
	for(int i = 0 ; i < 10 ; i++ )
	{
		juzheng[b[i]].flag_show = true;
	}
	reflash();
	cout<<"Game Over"<<endl<<endl;

	flag = false;
}


Block::Block()
{
	flag_show = false;
	num = 0;
}
bool Block::isShown()
{
	return flag_show;
}
void Block::setnum(int _num)
{
	num = _num;
}

int Block::getnum()
{
	return num;
}
bool Block::isbomb()
{
	return num == -1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章