mintaka
发表于 2018-3-27 18:40:34
我又改了一下这样好像就可以自动打开了
#include<bits/stdc++.h>
#include<windows.h>
#include <conio.h>
using namespace std;
const int map_x = 16;
const int map_y = 16;
struct Mapelem{
bool status = false;
bool is_mine = false;
int course = 0;
}Map;
void Hidecursor()
{
CONSOLE_CURSOR_INFO cci;
cci.bVisible = FALSE;
cci.dwSize = sizeof(cci);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cci);
}
void gotoxy(int x,int y){
COORD cod;
cod.X = x * 2;
cod.Y = y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cod );
}
void print_course(int x,int y){
if(!Map.course){
printf(" ");
return;
}
printf("%d",Map.course);
}
void drawmap(){
for(int i=0; i<map_x; i++){
for(int j=0; j<map_y; j++){
gotoxy(i,j);
if(Map.status){
if(Map.is_mine)
printf("★");
else
print_course(i,j);
}
else
printf("■");
}
}
}
void UpdateCursor(POINT po)
{
drawmap();
gotoxy(po.x, po.y);
printf("□");
}
void setmine(int num){
int x,y;
for(int i=0; i<num; i++){
do{
x = rand()%map_x;
y = rand()%map_y;
}while(Map.is_mine);
Map.is_mine = true;
}
}
int GetCount(int x, int y)
{
int count = 0;
// вСио╫г -> срио╫г
for(int i = 0; i < 3; ++i)
if((x - 1 + i >= 0) && (y - 1 >= 0))
if(Map.is_mine)
++count;
// вСоб╫г -> сроб╫г
for(int i = 0; i < 3; ++i)
if((x - 1 + i >= 0) && (y + 1 < map_y))
if(Map.is_mine)
++count;
// вС╠ъ
if(x - 1 >= 0) // спвС╠ъбП?
if(Map.is_mine)
++count;
// ср╠ъ
if(x + 1 < map_x) // спср╠ъбП?
if(Map.is_mine)
++count;
return count;
}
void GenerateCount(void)
{
for(int i = 0; i < map_x; ++i)
{
for(int j = 0; j < map_y; ++j)
{
if(!Map.is_mine)
Map.course = GetCount(i, j);
}
}
}
void show_mine(POINT p ){
if (Map.status)
return;
else if (Map.course>0){
Map.status = true;
return;
}
else{//空格只需要上下左右四个方向检测
Map.status = true;
Map.status = true;
Map.status = true;
Map.status = true;
Map.status = true;
POINT k;
k.x = p.x;
if(p.y + 1 < map_y){
k.y = p.y + 1;
show_mine(k);
}
if(p.y - 1 > 0){
k.y = p.y - 1;
show_mine(k);
}
k.y = p.y;
if(p.x + 1 < map_x){
k.x = p.x + 1;
show_mine(k);
}
if(p.x - 1 > 0){
k.x = p.x - 1;
show_mine(k);
}
}
}
bool SelectTarget(POINT p){
if(Map.status)
return false;
if(Map.is_mine)
return true;
//print_course(p.x,p.y);
show_mine(p);
drawmap();
return false;
}
void showmap(){
for(int i=0; i<map_x; i++){
for(int j=0; j<map_y; j++){
if(!Map.status){
gotoxy(i,j);
if(Map.is_mine)
printf("★");
else
print_course(i,j);
}
}
}
}
int main(){
srand((unsigned int)time(0));
Hidecursor();
drawmap();
setmine(30);
GenerateCount();
POINT p = {0,0};
UpdateCursor(p);
while(1){
char c = _getch();
switch(c){
case 'q':
case 'Q':
goto EXIT;
break;
case 'a':
case 'A':
if(p.x>0){
p.x--;
UpdateCursor(p);
}break;
case 's':
case 'S':
if(p.y<15){
p.y++;
UpdateCursor(p);
}break;
case 'W':
case 'w':
if(p.y>0){
p.y--;
UpdateCursor(p);
}break;
case 'd':
case 'D':
if(p.x<15){
p.x++;
UpdateCursor(p);
}break;
case ' ':
if(SelectTarget(p))
goto EXIT;
break;
}
}
EXIT:
showmap();
return 0;
}
人造人
发表于 2018-3-27 19:02:37
mintaka 发表于 2018-3-27 18:40
我又改了一下这样好像就可以自动打开了
谢谢,我研究研究
^_^
mintaka
发表于 2018-3-27 20:15:47
人造人 发表于 2018-3-27 19:02
谢谢,我研究研究
^_^
还是不行,我想的是创建一个函数,点到空格就打开并扫描周围的方块,如果上下左右四个正方向的空格可以再次调用函数,递归。但上面的有的空格四周没打开。。。
上面的程序我忘记加限制了在边界打开会有错误。{:10_243:}
人造人
发表于 2018-3-27 20:46:35
mintaka 发表于 2018-3-27 20:15
还是不行,我想的是创建一个函数,点到空格就打开并扫描周围的方块,如果上下左右四个正方向的空格可以再 ...
我研究研究
mintaka
发表于 2018-3-29 19:41:57
void show_mine(int x,int y){
Map.status = true;
if(Map.course)
return;
for(int i = 0; i < 3; ++i)
if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y - 1 >= 0) && !Map.is_mine){
if(!Map.course && !Map.status && (i !=0 || i != 2) )
show_mine(x - 1 + i,y - 1);
else if(!Map.course && !Map.status && i != 1)
continue;
Map.status = true;
}
for(int i = 0; i < 3; ++i)
if((x - 1 + i < map_x) && (x - 1 + i >= 0) && (y + 1 < map_y) && !Map.is_mine){
if(!Map.course && !Map.status && (i !=0 || i != 2))
show_mine(x - 1 + i,y + 1);
else if(!Map.course && !Map.status && i != 1)
continue;
Map.status = true;
}
if(x - 1 >= 0 && !Map.is_mine){
if(!Map.course && !Map.status)
show_mine(x - 1,y);
Map.status = true;
}
if(x + 1 < map_x && !Map.is_mine){
if(!Map.course && !Map.status)
show_mine(x + 1,y);
Map.status = true;
}
}
把上面的同名函数改成这个就行了,emmmm,至少没有大bug,我调的雷数是30,效果还可以
人造人
发表于 2018-3-29 19:49:48
mintaka 发表于 2018-3-29 19:41
把上面的同名函数改成这个就行了,emmmm,至少没有大bug,我调的雷数是30,效果还可以
嗯,谢谢
MAX-Payen
发表于 2018-4-5 10:27:38
66
溯影
发表于 2018-4-20 20:34:44
学习一下{:10_254:}
FCrimonal
发表于 2018-4-21 14:09:24
感谢楼主分享
NILL_X
发表于 2018-4-23 16:12:04
学习一下
不辣不火锅
发表于 2018-4-24 00:11:09
神人呀
青栀
发表于 2018-5-8 11:16:55
谢谢分享
Meteor.Yu
发表于 2018-5-11 14:30:45
{:7_113:}
^^^^^^^^^
发表于 2018-11-3 20:41:18
好玩
DESTINY1
发表于 2018-11-4 14:20:54
学习一下
2377183301
发表于 2019-4-17 07:57:15
111
asdfghjkl147
发表于 2019-4-17 09:13:09
看看
养只鱼
发表于 2019-5-4 13:06:27
1
15002406463
发表于 2019-5-11 01:35:02
感谢分享
18392487927
发表于 2019-6-13 23:45:59
学习一下增长知识