弹跳小游戏
//弹跳小球小游戏:
#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;
}
扫雷实现的时候,有几个循环控制变量没搞清。 老运行不对,一直单步调试 .最终解决。不过做了三四遍后,每个函数的作用,传参搞清楚