您的位置:首页 > 编程语言 > C语言/C++

C语言扫雷

2015-11-21 18:11 393 查看
1.linux下完成成

2.通过打印不同背景,实现光标功能

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define TTY_PATH "/dev/tty"
#define STTY_ON "stty raw -echo -F"
#define STTY_OFF "stty -raw echo -F"

int map[12][12];
int eight[8][2] = {{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};
int four[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

typedef struct thunder
{
int x;
int y;
}Thunder;
Thunder th[100];

typedef struct cursor
{
int x;
int y;
}Cursor;
Cursor cu;

void init(int n)//初始化地图
{
int i, j, z;
for(i=0; i<12; i++)
for(j=0; j<12; j++)
{
if(i==0 || i==11 || j==0 || j==11)
map[i][j] = 999;
else
map[i][j] = 0;
}
int x,y;
int num[100];
for(i=0; i<n; i++)//随机生成n个地雷,同时地雷避免重复
{
x = rand()%10 + 1;
y = rand()%10 + 1;
num[i] = x*10 + y;
for(j=0; j<i; j++)
{
if(num[j] == num[i])
{
x = rand()%10 + 1;
y = rand()%10 + 1;
num[i] = x*10 + y;
j = 0;
}
}
th[i].x = x;
th[i].y = y;
}
for(i=1; i<11; i++)
for(j=0; j<11; j++)
for(z=0; z<n; z++)
if(i==th[z].x && j==th[z].y)
map[i][j] = 100;

for(i=1; i<11; i++)//空白地根据周围的地雷得到标识值,每个雷加一
for(j=1; j<11; j++)
{
if(map[i][j]==100)
continue;
for(z=0; z<8; z++)
if(map[i+eight[z][0]][j+eight[z][1]]==100)
map[i][j]++;
}
}

void init_cursor()//初始化光标位置
{
cu.x = 1;
cu.y = 1;
}
void move_cursor(char ch)//移动光标
{
switch(ch)
{
case 'a':
if(cu.y > 1)
cu.y--;
break;
case 'd':
if(cu.y < 10)
cu.y++;
break;
case 's':
if(cu.x < 10)
cu.x++;
break;
case 'w':
if(cu.x > 1)
cu.x--;
break;
}
}
void show()//打印地图,通过背景色改变的形式,表示为光标
{
int i,j,z;
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
{
if(i == cu.x && j == cu.y)
{
printf("\033[41m");
}
if(map[i][j]<10||map[i][j]==100)
{
printf(" # ",map[i][j]);
}else{
printf(" %d ",map[i][j]-10);
}
if(i == cu.x && j == cu.y)
{
printf("\033[0m");
}
}
printf("\n");
}
}
void showthunder()//点到地雷,打印全部地雷位置
{

int i,j,z;
system("clear");
for(i=1; i<11; i++)
{
for(j=1; j<11; j++)
if(map[i][j] == 100)
{
printf("\033[31;31m * \033[0m",map[i][j]);
}else if(map[i][j] < 10)
{
printf(" # ",map[i][j]);
}else{
printf(" %d ",map[i][j]-10);
}
printf("\n");
}
}

void tofind(int x, int y)//单击,发现位置,如没,进行蔓延,周围八格有雷打印器可能为雷的个数
{
int z;
for(z=0; z<4; z++)
if(map[x+four[z][0]][y+four[z][1]] >= 1 && map[x+four[z][0]][y+four[z][1]] <= 8)
{
map[x+four[z][0]][y+four[z][1]] += 10;
}else if(map[x+four[z][0]][y+four[z][1]] == 0)//进行蔓延
{
map[x+four[z][0]][y+four[z][1]] = 10;
tofind(x+four[z][0],y+four[z][1]);
}
}
void input(int x, int y)//单击地图,触发事件
{
int z;
int k;
if(map[x][y] == 100)//为雷时
{
showthunder();
printf("game over\n");
exit(0);
}
if(map[x][y] == 0)//空白地
{
map[x][y] = 10;
for(z=0; z<4; z++)
if(map[x+four[z][0]][y+four[z][1]] >= 1 && map[x+four[z][0]][y+four[z][1]] <= 8)
{
map[x+four[z][0]][y+four[z][1]] += 10;
}else if(map[x+four[z][0]][y+four[z][1]] == 0)
{
map[x+four[z][0]][y+four[z][1]] = 10;
tofind(x+four[z][0],y+four[z][1]);
}
}
if(map[x][y] >= 1 && map[x][y] <=8)//周围八个可可能为雷域
{
map[x][y] += 10;
}
}
char in_direct()//实现非堵塞键盘输入
{
fd_set fd;
struct timeval tv;
char ch;
FD_ZERO(&fd);
FD_SET(0, &fd);
tv.tv_sec = 0;
tv.tv_usec = 10;
if(select(1, &fd ,NULL, NULL, &tv) > 0)
{
ch = getchar();
}
return ch;
}

int main()//q 推出游戏,w,a,s,d控制光标方向,j 显示该地点
{
srand(time(NULL));
init(10);
init_cursor();
show();
char ch;
while(1)//‘q'退出游戏
{
system(STTY_ON TTY_PATH);//取消回车建输入
ch = in_direct();
system(STTY_OFF TTY_PATH);//回复原设置
if(ch=='a'||ch=='s'||ch=='d'||ch=='w')
{
move_cursor(ch);
system("clear");
}else if(ch=='j')
{
input(cu.x, cu.y);
system("clear");
}
else if(ch == 'q')
{
system("clear");
printf("game over!!!!!!!!!!!!!\n");
exit(0);
}
else
{
continue;
}
show();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息