目录
开头
大家好,我叫这是我58。
程序
Game.cpp源文件
cpp
#include <iostream>
#include "Player.h"
using namespace std;
void printmap(const char strmap[11][11], const int icoin) {
int i = 0;
int ia = 0;
for (; i < 11; i++) {
for (ia = 0; ia < 11; ia++) {
cout << "\033[" << ('G' == strmap[i][ia] ? "32;1m" : '$' == strmap[i][ia] ? "33m" : "0m") << strmap[i][ia] << "\033[0m";
}
cout << "|" << endl;
}
cout << "-----------@" << endl << "\033[33" << (20 == icoin ? ";1" : "") << "m$ * " << icoin << "\033[0m" << endl;
}
int main() {
char str[9] = "color 0";
char strmap[11][11] = {
' ',' ',' ',' ',' ',' ',' ',' ','$','$',' ',
' ','G',' ',' ',' ','$',' ','*','*','*',' ',
' ','*','*','*',' ',' ',' ',' ',' ',' ',' ',
'$',' ',' ',' ','$',' ','$',' ',' ','$',' ',
' ',' ','$',' ','*','*','*',' ','$',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
' ','*','*','*',' ',' ','*','*','*',' ',' ',
' ',' ','$',' ','$',' ',' ',' ','$',' ',' ',
' ',' ','*','*','*',' ','$',' ','*','*','*',
' ',' ',' ',' ',' ',' ',' ',' ',' ','$','$',
'P',' ','$','$','$',' ',' ',' ',' ','$','$'
};
char* cp = &strmap[10][0];
Player p;
char ch = 0;
int icoin = 0;
int coinarr[40] = { 0,8,0,9,1,5,3,0,3,4,3,6,3,9,4,2,4,8,7,2,7,4,7,8,8,6,9,9,9,10,10,2,10,3,10,4,10,9,10,10 };
cout << "欢迎你来玩这个平台跳跃游戏,在这个游戏中,"P"是你,"*"是平台,你不能走到这,空格是\033[30;1m空气\033[0m,"w"使你跳,就像\033[31;1m马里奥\033[0m一样,"a"使你左移,"d"使你右移,而\033[32;1m"G"\033[0m是\033[32;1m终点\033[0m,走到这能让你\033[32;1m胜利\033[0m,并且,\033[33m"$"\033[0m是\033[33m金币\033[0m,得到\033[33m它\033[0m就会使你\033[33m获得\033[0m一个\033[33m金币\033[0m。这就是这游戏的规则,你听明白了吗?" << endl << endl;
system("pause");
system("cls");
while ('G' == strmap[1][1]) {
p.sgetxy(X) = (cp - &strmap[0][0]) / 11;
p.sgetxy(Y) = (cp - &strmap[0][0]) % 11;
for (ch = 0; ch < 40; ch += 2) {
p.sgetxy(X) == coinarr[ch] && p.sgetxy(Y) == coinarr[ch + 1] && (coinarr[ch] = -1, icoin++);
}
printmap(strmap, icoin);
cin >> ch;
rewind(stdin);
*cp = ' ';
switch (ch) {
case 'a':
p.left_move(&cp);
break;
case 'd':
p.right_move(&cp);
break;
case 'w':
p.jump(&cp);
break;
default:
break;
}
p.upOrDown(&cp);
*cp = 'P';
system("cls");
}
20 == icoin && (str[7] = 'E'), 20 == icoin || (str[7] = '6');
system(str);
cout << "恭喜你,你赢了,获得了金币" << icoin << "枚" << endl;
return 0;
}
Player.h头文件
cpp
#pragma once
#include <iostream>
using namespace std;
#define JUMPHIGH 3
enum XY {
X,
Y,
};
class Player {
private:
int ix;
int iy;
int ij;
public:
Player();
void jump(char** cpp);
void left_move(char** cpp);
void right_move(char** cpp);
int& sgetxy(XY xymode);
void upOrDown(char** cpp);
};
Player.cpp源文件
cpp
#include <iostream>
#include "Player.h"
using namespace std;
Player::Player(){
ij = 0;
}
void Player::jump(char** cpp) {
(10 == ix || '*' == (*cpp)[11]) && (ij = JUMPHIGH);
}
void Player::left_move(char** cpp) {
iy && '*' != *(*cpp - 1) && ((*cpp)--);
}
void Player::right_move(char** cpp) {
10 != iy && '*' != *(*cpp + 1) && ((*cpp)++);
}
int& Player::sgetxy(XY xymode) {
return xymode ? iy : ix;
}
void Player::upOrDown(char** cpp) {
if (ij > 0 && ix && '*' != (*cpp)[-11]) {
ij--, *cpp -= 11;
}
else if ('*' != (*cpp)[11] && (!ix || '*' == (*cpp)[-11])) {
ij = 0, *cpp += 11;
}
else if ('*' != (*cpp)[11] && 10 != ix) {
*cpp += 11;
}
}
程序的流程图
Game.cpp源文件 把有11行11列的二维数组strmap初始化为下面的图片 开始 导入io流 导入Player.h头文件 释放std作用域下的所有东西 定义printmap函数 把有9个字符的字符串初始化为"color 0"
Game.cpp源文件 等待玩家按下任意一个键,按下后就清屏 是 是 是 否 是 break 清屏 否 是 是 否 是 break 否 是 break 否(break) 否 否 否 结束 定义字符指针cp为二维字符数组strmap第10行第0列的元素的地址 创建一个名叫p的Player对象 定义字符ch为0 定义整型icoin为0 把有40个元素的整型数组coinarr里的元素分别初始化为0,8,0,9,1,5,3,0,3,4,3,6,3,9,4,2,4,8,7,2,7,4,7,8,8,6,9,9,9,10,10,2,10,3,10,4,10,9,10和10 输出"欢迎你来玩这个平台跳跃游戏,在这个游戏中,"P"是你,"*"是平台,你不能走到这,空格是\033[30;1m空气\033[0m,"w"使你跳,就像\033[31;1m马里奥\033[0m一样,"a"使你左移,"d"使你右移,而\033[32;1m"G"\033[0m是\033[32;1m终点\033[0m,走到这能让你\033[32;1m胜利\033[0m,并且,\033[33m"$"\033[0m是\033[33m金币\033[0m,得到\033[33m它\033[0m就会使你\033[33m获得\033[0m一个\033[33m金币\033[0m。这就是这游戏的规则,你听明白了吗?\n\n" 'G' == strmap[1][1]? 把Player对象p的方法sgetxy,参数为枚举XY的X的值的返回的引用设为cp与二维字符数组strmap第0行第0列的元素地址除以11的结果 把Player对象p的方法sgetxy,参数为枚举XY的Y的值的返回的引用设为cp与二维字符数组strmap第0行第0列的元素地址模上11的结果 设ch为0 ch < 40? p.sgetxy(X) == coinarr[ch] && p.sgetxy(Y) == coinarr[ch + 1]? 把整型数组coinarr的第ch项设为-1 icoin自增1 ch自增2 执行printmap函数,参数为二维字符数组strmap和整型icoin 把ch设为你输入的字符 清空缓冲区 把解引用的cp设为空格 'a' == ch? 执行Player对象p的方法left_move,参数为字符指针cp的地址 执行Player对象p的方法upOrDown,参数为字符指针cp的地址 把解引用的cp设为字符"P" 20 == icoin? 把字符串str的第7项的元素设为字符"E" 20 == icoin? 执行系统命令,命令为字符串str 输出"恭喜你,你赢了,获得了金币",icoin和"枚\n" 'd' == ch? 执行Player对象p的方法right_move,参数为字符指针cp的地址 'w' == ch? 执行Player对象p的方法jump,参数为字符指针cp的地址 把字符串str的第7项的元素设为字符"6"
Player.h头文件 结束 开始 不让头文件重复定义 导入io流 释放std作用域下的所有东西 定义JUMPHIGH宏为3 定义枚举XY,并设X的值为0,Y的值为1 定义Player类,私有的有成员变量ix,成员变量iy和成员变量ij,公开的有Player无参构造函数的声明,jump方法的声明,left_move方法的声明,right_move方法的声明,sgetxy方法的声明和upOrDown方法的声明
Player.cpp源文件 结束 开始 导入io流 导入Player.h头文件 释放std作用域下的所有东西 定义Player类作用域下的jump方法 定义Player类作用域下的无参构造函数 定义Player类作用域下的left_move方法 定义Player类作用域下的right_move方法 定义Player类作用域下的sgetxy方法 定义Player类作用域下的upOrDown方法 Player类作用域下的无参构造函数 结束 开始 设类Player里的ij为0 Player类作用域下的jump方法 是 否 结束 开始 (10 == ix || '*' == (*cpp)[11])? 设类Player里的ij为JUMPHIGH宏的值 Player类作用域下的left_move方法 是 否 结束 开始 iy && '*' != *(*cpp - 1)? 把解引用的cpp向左移动一位 Player类作用域下的right_move方法 是 否 结束 开始 10 != iy && '*' != *(*cpp + 1)? 把解引用的cpp向右移动一位 Player类作用域下的sgetxy方法 如果xymode不为0,那么就返回iy的引用,否则就返回ix的引用 结束 开始 Player类作用域下的upOrDown方法 是 否 是 否 是 否 结束 开始 ij > 0 && ix && '*' != (*cpp)[-11]? ij自减1 把解引用的cpp向左移动11位 '*' != (*cpp)[11] && (!ix || '*' == (*cpp)[-11])? 设ij为0 把解引用的cpp向右移动11位 '*' != (*cpp)[11] && 10 != ix? 把解引用的cpp向右移动11位
程序游玩的效果
平台跳跃游戏
下一篇博客要说的东西
C++版iwanna