funny C-(弹跳小游戏、扫雷)

弹跳小游戏

//弹跳小球小游戏:

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

int main() {
	int i, j;
	int x = 0;
	int y = 10;
	int velocity_x = 1;
	int velocity_y = 1;
        
        //定义小球的弹跳边界范围
	int left = 0;
	int right = 40;
	int up = 0;
	int down = 20;

	while (1) {
		x = x + velocity_x;
		y = y + velocity_y;
                
                //清屏函数:
		system("cls");

		//小球的首位置:
		for (i = 0; i < y; i++)
			printf("\n");
		for (j = 0; j < x; j++)
			printf(" ");

		//输出小球;
		printf("@");
		
		//控制小球不能弹出边界
		if ((x == left) || (x == right))
		{
			velocity_x = -velocity_x;
		}
		if ((y == up) || (y == down))
		{
			velocity_y = -velocity_y;
		}

		//睡眠程序,让程序走得"慢"一点儿
		Sleep(10);
	}

	system("pause");
	return 0;
}

可以通过调整x, y的初值决定小球的初始位置。 坐标的改变是每次横向或者纵向 、增加或者减少1个距离单位。

下面是初始位置为(0,10)时候的运行轨迹。

扫雷小游戏

#define _CRT_SECURE_NO_DEPRECATE
#define ROW 9 
#define COL 9
#define MINE_COUNT 10
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>		//	清屏函数、睡眠函数
#include <time.h>			//  随机种子

//  1.界面  a.show_map 玩家所看到的
//			b.mine_map 雷阵   用0表示没雷, 1表示有雷
//	2.初始化  mine_map 雷阵全部初始为无雷状态,然后随机布雷
//			  show_map 玩家所看到的初始为' '
//	3.打印地图    打印玩家所看到的地图 show_map,提示玩家输入坐标
//						校验输入坐标是否合法? 		
//				该坐标被输入后,检查该格是否为雷?
//							若是,显示失败;
//							若不是,显示一个数字,
//								非雷数加1.直到为 总格子数-雷数
//							
//	4.判断游戏是否继续?
//
int Menu() {
	printf(" ============== \n");
	printf("|  1.开始游戏  |\n");
	printf("|  0. 退出     |\n");
	printf(" ============== \n");
	int choice;
	printf("输入选择(1 or 0):");
	scanf("%d", &choice);
	return choice;
}

//每次玩家操作一次分别更新2个地图
void UpdateMap(char mine_map[ROW + 2][COL + 2], 
	char show_map[ROW + 2][COL + 2],
	int row, int col) {

	//定义一个变量,表示该格子周围的地雷数---最大为8
	int mine_count = 0;
	if (mine_map[row - 1][col - 1] == '1')
		mine_count++;
	if (mine_map[row - 1][col] == '1')
		mine_count++;
	if (mine_map[row - 1][col + 1] == '1')
		mine_count++;
	if (mine_map[row][col - 1] == '1')
		mine_count++;
	if (mine_map[row][col + 1] == '1')
		mine_count++;
	if (mine_map[row + 1][col - 1] == '1')
		mine_count++;
	if (mine_map[row + 1][col] == '1')
		mine_count++;
	if (mine_map[row + 1][col + 1] == '1')
		mine_count++;
	
	//更新玩家所输入的格子坐标上的数字
	show_map[row][col] = '0' + mine_count;
}

//每一次进入游戏,显示一个供玩家所能看到的地图show_map
void DisplayMap(char map[ROW + 2][COL + 2]) {
	//打印一个框架
	// 打印上边框
	printf("  ");
	for (int i = 1; i <= ROW; i++) {
		printf(" %d  ", i);
	}
	printf("\n");
	for (int row = 1; row <= ROW; row++) {
		printf("%d|", row);             // 打印行
		for (int col = 1; col <= COL; col++) {
			printf(" %c |", map[row][col]);      // 按行打印列
		}
		printf("\n");
	}
}

//2.初始化  mine_map 雷阵全部初始为无雷状态,然后随机布雷
//			  show_map 玩家所看到的初始为' ',
void Init(char mine_map[ROW + 2][COL + 2],
	char show_map[ROW + 2][COL + 2]) {

	// show_map 玩家所看到的地图,全为' '
	for (int i = 1; i <= ROW; i++) {
		for (int j = 1; j <= COL; j++) {
			show_map[i][j] = ' ';    //' '表示未翻开的格子
		}
	}

	// mine_map 雷阵初始全部为无雷状态,然后随机布雷
	for (int i = 1; i <= ROW; i++) {
		for (int j = 1; j <= COL; j++) {
			mine_map[i][j] = ' ';   //'0'表示无雷
		}
	}

		// 随机布雷
	int is_mine_count = MINE_COUNT;           // 地雷数
	while (is_mine_count > 0) {
			 // [1, 9]
		int row = rand() % 9 + 1;
		int col = rand() % 9 + 1;   

		//如果某一次随机生成的地雷坐标与已知坐标重合,本次循环作废
		if (mine_map[row][col] == '1') {
			is_mine_count++;
		}
		mine_map[row][col] = '1';
		is_mine_count--;   //循环控制条件
	}
}

void Game() {
	//srand((unsigned int)time(0));          //随机种子
	//定义两个二维数组,表示 雷阵 和 玩家所看到的地图
	char mine_map[ROW + 2][COL + 2];
	char show_map[ROW + 2][COL + 2];

	int not_mine_count = 0;			// 已经点开了的格子--非雷数

	//对雷阵和玩家所看到的地图分别初始化
	Init(mine_map, show_map);

	int row, col;
	while(1){

		//每次进入游戏,先显示一个供玩家所能看到的地图
		DisplayMap(show_map);
		//DisplayMap(mine_map);  此处作弊得到雷阵地图-。-
 
		printf("输入需要探测的格子坐标(3,5):");
		scanf("%d %d", &row, &col);
		
		//校验坐标是否合法
		if (row < 1 || row > ROW || col < 1 || col > COL) {
			printf("坐标输入非法!\n");
			continue;
		}

		//校验该格子的坐标是否为雷
		if (mine_map[row][col] == '1') {     // 是雷,游戏失败
			printf("很不幸,您踩雷牺牲了!\n");
			DisplayMap(mine_map);
			printf("游戏结束!!\n");
			return;
		}
		else {		// 不是地雷
												
			not_mine_count++;	//	not_mine_count自增1,直到获胜

				//  获胜条件为:not_mine_count = 格子数-地雷数
			if (not_mine_count == ROW * COL - MINE_COUNT) {
				printf("恭喜您找出了所有地雷!\n");     
				return;
			}
		}
		system("cls");
		
		//更新两个地图 mine_map 和 show_map
		UpdateMap(mine_map, show_map, row ,col);
	}

}

int main() {
	while (1) {
		int choice = Menu();		// 显示选择游戏界面

		if (choice == 0) {
			printf("游戏将在3s后关闭!\n");
			Sleep(3000);
			exit(0);		//退出游戏
		}

		if (choice == 1) {
			printf("\t游戏开始: \n");
			Game();		//进入游戏
		}
	}

	system("pause");
	return 0;
}


扫雷实现的时候,有几个循环控制变量没搞清。 老运行不对,一直单步调试 .最终解决。不过做了三四遍后,每个函数的作用,传参搞清楚

猜你喜欢

转载自blog.csdn.net/Q_feifeiyu/article/details/85067137