这个跑酷小游戏不是真正意义上的那种,是一个人一直往前跑,按空格键改变方向(上/下),碰到齿轮失败,和poki里的差不多(在poki里的名字忘了)。
文件
源文件main.cpp,关卡文件level1.txt,level2.txt,…
变量,数组
const string doc = "根据你的电脑来决定"; //所有关卡文件所在的位置(比如D:\\gamefiles\\)
int x, y; //人坐标
int n, m; //地图行列
char mp[35][10005]; //地图
/*
地图:
(空格)表示没有东西
-表示路
X表示齿轮
*/
函数
- main(主函数)
- out(输出)
- getinfo(读取文件中的信息)
输出
输出:有多少行就多少行,列数=min(31, 总列数)。
为了更美观,每个字符输出两遍
小人位置用绿色空格表示
void out()
{
system("cls");
int l = max(y - 15, 1), r = min(y + 15, m); //屏幕范围
for (int i = 1; i <= n; i++)
{
for (int j = l; j <= r; j++)
{
if (i == x && j == y) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 32); //32代表前景白色,背景绿色
putchar(mp[i][j]);
putchar(mp[i][j]); //更美观
if (i == x && j == y) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); //15代表前景白色,背景黑色
}
putchar('\n');
}
}
读取文件
没啥好说的,自己百度fstream
bool getinfo(int id)
{
fstream fs(doc + "level" + to_string(id) + ".txt", ios::in);
if (!fs.is_open()) return false; //没打开成功
fs >> n >> m; //行列
memset(mp, ' ', sizeof mp); //清空
for (int i = 1; i <= n; i++)
{
mp[i][0] = ' ';
fs.get(); //换行
for (int j = 1; j <= m; j++)
{
mp[i][j] = fs.get();
if (mp[i][j] == 'S') //开始点
{
x = i;
y = j;
mp[i][j] = ' ';
}
}
}
fs.close(); //记得关闭文件
return true;
}
main函数
main函数要做的事情:
- 初始化
- 调用getinfo
- 判断是否通关所有关卡
- 循环执行i=1~m,枚举列,处理按键,x坐标和失败
- 如果没有失败,输出Win,关卡数++
总代码
#include <cmath>
#include <cstdio>
#include <string>
#include <conio.h>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <Windows.h>
using namespace std;
const string doc = "D:\\.cppProgram\\jumpjump\\jumpjump\\";
int x, y; //坐标
int n, m; //地图行列
char mp[35][10005]; //地图
/*
地图:
(空格)表示没有东西
-表示路
X表示齿轮
*/
bool getinfo(int id)
{
fstream fs(doc + "level" + to_string(id) + ".txt", ios::in);
if (!fs.is_open()) return false; //没打开成功
fs >> n >> m; //行列
memset(mp, ' ', sizeof mp); //清空
for (int i = 1; i <= n; i++)
{
mp[i][0] = ' ';
fs.get(); //换行
for (int j = 1; j <= m; j++)
{
mp[i][j] = fs.get();
if (mp[i][j] == 'S') //开始点
{
x = i;
y = j;
mp[i][j] = ' ';
}
}
}
fs.close(); //记得关闭文件
return true;
}
void out()
{
system("cls");
int l = max(y - 15, 1), r = min(y + 15, m); //屏幕范围
for (int i = 1; i <= n; i++)
{
for (int j = l; j <= r; j++)
{
if (i == x && j == y) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 32); //32代表前景白色,背景绿色
putchar(mp[i][j]);
putchar(mp[i][j]); //更美观
if (i == x && j == y) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); //15代表前景白色,背景黑色
}
putchar('\n');
}
}
int main()
{
int aat = 1;
while (true)
{
if (!getinfo(aat))
{
printf("You Win The All Level!\n"); //所有关卡打完
getch();
return 0;
}
int mv = 1;
for (int i = 1; i <= m; i++)
{
if (mp[x][y] == '-') x -= mv;
out();
Sleep(200);
if (x == 0 || x > n || mp[x][y] == 'X') //跑出屏幕或者碰到齿轮
{
printf("Lose!");
getch();
goto ed;
}
if (_kbhit() && mp[x + mv][y] == '-') //按下键盘
{
mv *= -1;
while (_kbhit()) getch(); //清空缓冲
}
x += mv;
y++;
}
printf("Win!\n");
getch();
aat++;
ed:; //为了到达循环末位所加的标记
}
return 0;
}