C语言扫雷

原创 2015年11月21日 18:11:57

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;
}


C语言编写扫雷

扫雷: 定义两个二维数组:mine用来布雷、show用来显示扫雷情况、mine初始化为’0’、show初始化为’*’; 开始扫雷输入坐标、如果有雷、提示你踩雷了,本轮游戏结束,如果没雷继续扫直到扫...
  • xiaobingRSQ
  • xiaobingRSQ
  • 2016年11月17日 23:43
  • 3936

扫雷游戏 C语言实现

扫雷游戏 C语言实现实现了如下功能: 鼠标控制 左键点开 右键标记 中键自动翻开(效果同windows扫雷) 首次点击不会中雷下面是几张效果图: 这是初始界面,3种难度级别,难度同经典版w...
  • c_duoduo
  • c_duoduo
  • 2015年02月20日 20:06
  • 6374

扫雷游戏(C语言实现)

扫雷游戏 自己动手写了扫雷游戏(C语言版)。 我使用了EasyX这个库(下载地址:http://www.easyx.cn EasyX 2014冬至版)。 在写扫雷游戏过程中用到了 1.二维数...
  • qq_27602093
  • qq_27602093
  • 2015年07月28日 08:50
  • 1726

C语言实现扫雷——详解

源代码下载地址:https://pan.baidu.com/s/1htJscq4 密码:8aal 扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言多文件编程实现扫雷,我的这...
  • yc1515707718
  • yc1515707718
  • 2017年12月07日 23:08
  • 542

【C语言】简易扫雷游戏——C语言实现

好玩的简易扫雷游戏——C语言实现
  • LX18792732127
  • LX18792732127
  • 2016年10月12日 09:23
  • 12550

C语言:简单的无界面化操作扫雷游戏

扫雷是生活中接触比较多的一块小游戏,那么我们该如何通过C语言来实现呢? 姐先来的代码能够实现基本的扫雷功能,只是缺少了界面化,鼠标操作等,日后有待改善,不过基本功能还是可以实现的,比如:第一步绝对不会...
  • sinat_36101354
  • sinat_36101354
  • 2016年12月10日 12:00
  • 959

扫雷游戏的C语言实现

在学习C语言初期,我们可以找一些平常玩的游戏进行简单的C语言实现。今天就和大家分享一下关于windows中扫雷游戏的实现。...
  • Monster_Girl
  • Monster_Girl
  • 2016年10月09日 18:51
  • 3241

c语言扫雷代码(详细)

#include graphics.h> #include stdlib.h> #include dos.h> #define LEFTPRESS 0xff01 #define LEFTCLICK 0...
  • u014262702
  • u014262702
  • 2014年03月21日 18:18
  • 3294

c语言编程 :模拟实现简单扫雷游戏

这里指的扫雷是简单模拟电脑中的扫雷游戏,但以我目前的水平,也就只能在黑框中实现 test.c #include #include #include #include "game2.h" voi...
  • ChaseRaod
  • ChaseRaod
  • 2017年01月11日 17:09
  • 1471

c语言扫雷程序

用c语言实现一个扫雷程序,有挑战性的主要有两部分内容:游戏的逻辑,空白区域的炸开算法  1.游戏核心逻辑 观察Windwos的扫雷游戏,可以知道,一个格子有两种类型的状态需要描述,一种类型是这个格子是...
  • zhuhuangtianzi
  • zhuhuangtianzi
  • 2017年03月15日 22:35
  • 921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言扫雷
举报原因:
原因补充:

(最多只允许输入30个字)