学习打卡C语言基础----制作扫雷游戏

学完了C语言基础,做一个简易扫雷游戏,对数组等知识进行巩固。

引用要用到的头文件

#include<stdio.h>
#include<stdlib.h>//执行系统命令的函数  例如:system("cls")   cls:清空屏幕    变量=rand()生成随机数

将常用变量定义为常数

#define lei 10  //雷的个数
#define lon1 9 //棋盘显示棋子的长
#define lon2 9 //棋盘显示棋子的宽
#define lons1 lon1+2 //棋盘的长
#define lons2 lon2+2 //棋盘的宽

对自定义的函数进行声明

//开始菜单
void kai();
//初始化表格
void chu(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2);
//打印有雷表
void dayin1(char w1[lons1][lons2], int Lon1, int Lon2);
//打印无雷表
void dayin2(char w2[lons1][lons2], int Lon1, int Lon2);
//布雷
void bulei(char w1[lons1][lons2], int Lon1, int Lon2);
//排雷
int pailei(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2,int x,int y,int m);
//结构组成
void zucheng();

主函数

int main()
{
    	int a = 0;
	do {
		kai();
		scanf_s("%d", &a);
		switch(a)
		{
		case 1:
			printf("开始游戏\n");
			zucheng();//结构组成
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("出错了,请重新输入\n");
			break;
		}
	}while (a);

    return 0;
}

结构组成

void zucheng() {
	//数组储存
	char w1[lons1][lons2] = { 0 };
	char w2[lons1][lons2] = { 0 };
	//初始化
	chu(w1,w2,lon1,lon2);
	//打印
	//dayin1(w1, lon1, lon2);
	dayin2(w2, lon1, lon2);
	//布雷
	bulei(w1, lon1, lon2);
	//排雷
	int m = 0;
	while (1){
		int x = 0;
		int y = 0;
		printf("请输入你要扫点的坐标:");
		scanf_s("%d %d", &x, &y);
		int q=pailei(w1, w2, lon1, lon2,x,y,m);
		if (q == 1){
			printf("革命尚未成功,同志还需努力!\n");
			dayin2(w2, lon1, lon2);
		}
		else if (q == 2) {
			printf("恭喜你,扫雷成功!\n");
			dayin1(w1, lon1, lon2);
			break;
		}
		else {
			printf("****北鼻撞彩喽,让炸飞喽****\n");
			dayin1(w1, lon1, lon2);
			break;
		}
	}
}

开始界面(这个看个人喜好喽)

//开始菜单
void kai() {
	printf("**************************************\n");
	printf("****************1.play****************\n");
	printf("****************0.exit****************\n");
	printf("**************************************\n");
	printf("请输入:");
}

数组初始化

//初始化
void chu(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2) {
	int i = 0;
	int j = 0;
	for (i = 1; i <= Lon1; i++) {
		for (j = 1; j <= Lon2; j++) {
			w1[i][j] = '-';//这个数组是用于放雷的
			w2[i][j] = '*';//这个是用于显示的
		}
	}
}

打印两个数组

//有雷表
void dayin1(char w1[lons1][lons2], int Lon1, int Lon2) {
	for (int i = 0; i <= Lon2; i++) {
		printf("%d ", i);
	}
	printf("\n");
    for (int i = 1; i <= Lon1; i++) {
		printf("%d ", i);
		for (int j = 1; j <= Lon2; j++) {
			printf("%c ", w1[i][j]);	
		}
		printf("\n");
	}
	

}
//无雷表
void dayin2(char w2[lons1][lons2], int Lon1, int Lon2) {
	for (int i = 0; i <= Lon2; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 1; i <= Lon1; i++) {
		printf("%d ", i);
		for (int j = 1; j <= Lon2; j++) {
			printf("%c ", w2[i][j]);
		}
		printf("\n");
	}
}

给第二个数组布雷

//布雷
void bulei(char w1[lons1][lons2], int Lon1, int Lon2) {
	//雷的个数
	int l = lei;
	while (l) {
		int x = rand() % lon1 + 1;//随机取一个棋盘宽以内x坐标
		int y = rand() % lon2 + 1;//随机取一个棋盘长以内y坐标
		if (w1[x][y] == '-') {
			w1[x][y] = '+';
			l--;
		}
	}
}

算法实现排雷

//扫雷
int pailei(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2,int x,int y,int m) {
	m++;
	for (int i = 1; i <= Lon1; i++) {
		for (int j = 1; j <= Lon2; j++) {
			if (w1[i][j] == '-') {
				int w = 0;
				if (w1[i - 1][j - 1] == '+')
					w++;
				if (w1[i - 1][j] == '+')
					w++;
				if (w1[i - 1][j + 1] == '+')
					w++;
				if (w1[i][j - 1] == '+')
					w++;
				if (w1[i][j + 1] == '+')
					w++;
				if (w1[i + 1][j - 1] == '+')
					w++;
				if (w1[i + 1][j] == '+')
					w++;
				if (w1[i + 1][j + 1] == '+')
					w++;
				w1[i][j] =w+'0';							/离谱---将整形变量赋值给字符型数组
			}
		}
	}	
	if (w1[x][y] == '+') {
		return 0;//踩到雷了,被炸死了,游戏失败。
	}
	if (m == lon1 * lon2 - lei)
		return 2;//排到只剩下雷了,游戏胜利。
	if (w1[x][y] != '+') {
		w2[x][y] = w1[x][y];
		return 1;//游戏继续。
	}
}

OK,到此为止一个简易扫雷已经完成了!

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,以下是一个简单的考勤打卡系统的C语言示例: ```c #include <stdio.h> #include <time.h> // 定义员工结构体 struct Employee { int id; char name[50]; int lateCount; int earlyCount; int absentCount; }; // 定义全局变量 struct Employee employees[10]; int employeeCount = 0; // 函数声明 void clockIn(int employeeId); void clockOut(int employeeId); void viewAttendance(); void searchAttendance(); void deleteAttendance(); void modifyAttendance(); int main() { int choice; int employeeId; char password[50]; // 主菜单 do { printf("1. 员工上班打卡\n"); printf("2. 员工下班打卡\n"); printf("3. 查看考勤情况\n"); printf("4. 查询考勤信息\n"); printf("5. 删除考勤信息\n"); printf("6. 修改考勤信息\n"); printf("7. 退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入员工ID:"); scanf("%d", &employeeId); clockIn(employeeId); break; case 2: printf("请输入员工ID:"); scanf("%d", &employeeId); clockOut(employeeId); break; case 3: viewAttendance(); break; case 4: searchAttendance(); break; case 5: deleteAttendance(); break; case 6: modifyAttendance(); break; case 7: printf("谢谢使用!\n"); break; default: printf("无效的选择,请重新输入。\n"); break; } } while (choice != 7); return 0; } // 上班打卡 void clockIn(int employeeId) { time_t now; time(&now); struct tm *local = localtime(&now); // 检查员工是否存在 int i; for (i = 0; i < employeeCount; i++) { if (employees[i].id == employeeId) { // 更新上班时间 printf("员工 %s 上班打卡成功,打卡时间:%02d:%02d:%02d\n", employees[i].name, local->tm_hour, local->tm_min, local->tm_sec); return; } } // 员工不存在 printf("员工ID %d 不存在。\n", employeeId); } // 下班打卡 void clockOut(int employeeId) { time_t now; time(&now); struct tm *local = localtime(&now); // 检查员工是否存在 int i; for (i = 0; i < employeeCount; i++) { if (employees[i].id == employeeId) { // 更新下班时间 printf("员工 %s 下班打卡成功,打卡时间:%02d:%02d:%02d\n", employees[i].name, local->tm_hour, local->tm_min, local->tm_sec); return; } } // 员工不存在 printf("员工ID %d 不存在。\n", employeeId); } // 查看考勤情况 void viewAttendance() { int i; for (i = 0; i < employeeCount; i++) { printf("员工ID:%d\n", employees[i].id); printf("员工姓名:%s\n", employees[i].name); printf("迟到次数:%d\n", employees[i].lateCount); printf("早退次数:%d\n", employees[i].earlyCount); printf("旷工天数:%d\n", employees[i].absentCount); printf("\n"); } } // 查询考勤信息 void searchAttendance() { int choice; printf("1. 按员工ID查询\n"); printf("2. 按员工姓名查询\n"); printf("请输入查询方式:"); scanf("%d", &choice); switch (choice) { case 1: // 按员工ID查询 break; case 2: // 按员工姓名查询 break; default: printf("无效的选择。\n"); break; } } // 删除考勤信息 void deleteAttendance() { // 需要密码验证 char password[50]; printf("请输入密码:"); scanf("%s", password); // 删除考勤信息 } // 修改考勤信息 void modifyAttendance() { // 需要密码验证 char password[50]; printf("请输入密码:"); scanf("%s", password); // 修改考勤信息 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值