因为临近c艹考试,以作品的形式提交。所以想用c++写个控制台小游戏
主要是小游戏可以将类和继承等C++知识点可以很好的串接起来,而且也比图书管理系统等交互性不大的项目更加有趣。好了废话少说进入正题吧
小游戏就以飞机大战为例吧
首先说一下我对游戏的理解,游戏主要就是由动画、交互两大部分组成,
而动画则是由一帧一帧的图片组成。
所以要想在控制台中实现动画,那就要实现屏幕的刷新,就是把上一帧
的图片给清除掉,清除的方法有很多,在这里就用最简单的实现方法
system(“cls”);
为了便于学习,下面没有加关于类什么和c++有关的内容。
首先实现屏幕的自动刷新
while (1)
{
Show(); //屏幕显示画面
InputWithData(); //执行与用户有关的数据
InputWithoutData(); //执行与用户无关的数据
system("cls"); //清屏函数,每次调用都将
} //上次的画面清除
将整个程序的主要函数放在一个死循环中,不停的调用结合清屏函数, 实现动画的显示
InputWithData();
InputWithoutData();
这两个函数后序再添加内容
显示画面
也即是Show()里面的内容
for (int i = 0; i < Heigh; i++) //Height 为定义的高度
{
for (int j = 0; j < Width; j++) //Width 宽度
{ //PlayerPos为玩家坐标 X、Y轴
if (i == PlayerPosY&&j == PlayerPosX)
{
cout << "*";
}
{
cout << " ";
}
}
cout << endl;
}
以空格打印一个界面,在打印空格时,当横纵坐标等于玩家坐标时则打印* (这个就暂且当做玩家吧。。。)
输出之后是这样的一个界面
然后就是和用户的交互了
1.首先是实现用户的移动
直接上代码
void InputWithData()
{
Movement();
}
void Movement(){
char input;
if (_kbhit())
{
input = _getch();
switch (input)
{
case'W':
case'w':
PlayPosY--;
break;
case'S':
case's':
PlayPosY++;
break;
case'A':
case'a':
PlayPosX--;
break;
case'D':
case'd':
PlayPosX++;
break;
default:
break;
}
}
}
通过按 WASD 键来改变玩家坐标的数值,进而实现飞机的移动。
_getch()这个函数是一个不回显函数,当用户按下某个字符时,
函数自动读取,无需按回车。
_kbhit()这个是用来检测用户是否按下键盘的函数,当有敌机移动时,
没有这个函数画面将会暂停等待你的输入了,显然这不是我们想要的
- 到这游戏的基本原理想必你应该已经了解差不多了,无非就是下帧刷新上帧,而游戏的各种玩法就是玩家自己通过代码来实现了。。。
2.接下来就是玩家发射子弹了
空格键的ASCII值是 32
还是直接贴代码
//将BulletX,BulletY初始化为-1,-1 使在屏幕不可见
//当发射子弹时再执行下列代码
case 32:
BulletX = PlayPosX;
BulletY = PlayPosY - 1;
isShoot = true;
break;
发射子弹无非就是在上面移动代码里添加个空格触发事件
for (int i = 0; i < Heigh; i++)
{
for (int j = 0; j < Width; j++)
{
if (i == PlayPosY&&j == PlayPosX)
{
cout << "*";
}
/
else if (i == BulletY && j == BulletX)
{
cout << "|";
}
///
else
{
cout << " ";
}
}
cout << endl;
}
这是Show()函数,仔细观察多了个上面标注的地方,用于子弹的显示,现在只是将子弹放在玩家前面,而没有发射移动,可以这样实现
void BulletMove()
{
if (BulletY > 0)
{
BulletY--;
}
}
将BulletMove( ) inputWithoutData()函数中,表示与用户输入无关的数据
下面是运行后的画面
这样玩家的基本功能就实现了,同样你也可以自己添加其他元素,如多发子弹、激光等高级武器
…
.
.
.
后序敌人的实现等留到明天再写吧,溜啦溜啦
持续更新中…
因为临近c艹考试,以作品的形式提交。所以想用c++写个控制台小游戏
小游戏就以飞机大战为例吧
首先说一下我对游戏的理解,游戏主要就是由动画、交互两大部分组成,
而动画则是由一帧一帧的图片组成。
所以要想在控制台中实现动画,那就要实现屏幕的刷新,就是把上一帧
的图片给清除掉,清除的方法有很多,在这里就用最简单的实现方法
system(“cls”);
为了便于学习,下面没有加关于类什么和c++有关的内容。
首先实现屏幕的自动刷新
while (1)
{
Show(); //屏幕显示画面
InputWithData(); //执行与用户有关的数据
InputWithoutData(); //执行与用户无关的数据
system("cls"); //清屏函数,每次调用都将
} //上次的画面清除
将整个程序的主要函数放在一个死循环中,不停的调用结合清屏函数, 实现动画的显示
InputWithData();
InputWithoutData();
这两个函数后序再添加内容
显示画面
也即是Show()里面的内容
for (int i = 0; i < Heigh; i++) //Height 为定义的高度
{
for (int j = 0; j < Width; j++) //Width 宽度
{ //PlayerPos为玩家坐标 X、Y轴
if (i == PlayerPosY&&j == PlayerPosX)
{
cout << "*";
}
{
cout << " ";
}
}
cout << endl;
}
以空格打印一个界面,在打印空格时,当横纵坐标等于玩家坐标时则打印* (这个就暂且当做玩家吧。。。)
输出之后是这样的一个界面
然后就是和用户的交互了
1.首先是实现用户的移动
直接上代码
void InputWithData()
{
Movement();
}
void Movement(){
char input;
if (_kbhit())
{
input = _getch();
switch (input)
{
case'W':
case'w':
PlayPosY--;
break;
case'S':
case's':
PlayPosY++;
break;
case'A':
case'a':
PlayPosX--;
break;
case'D':
case'd':
PlayPosX++;
break;
default:
break;
}
}
}
通过按 WASD 键来改变玩家坐标的数值,进而实现飞机的移动。
_getch()这个函数是一个不回显函数,当用户按下某个字符时,
函数自动读取,无需按回车。
_kbhit()这个是用来检测用户是否按下键盘的函数,当有敌机移动时,
没有这个函数画面将会暂停等待你的输入了,显然这不是我们想要的
- 到这游戏的基本原理想必你应该已经了解差不多了,无非就是下帧刷新上帧,而游戏的各种玩法就是玩家自己通过代码来实现了。。。
2.接下来就是玩家发射子弹了
空格键的ASCII值是 32
还是直接贴代码
//将BulletX,BulletY初始化为-1,-1 使在屏幕不可见
//当发射子弹时再执行下列代码
case 32:
BulletX = PlayPosX;
BulletY = PlayPosY - 1;
isShoot = true;
break;
发射子弹无非就是在上面移动代码里添加个空格触发事件
for (int i = 0; i < Heigh; i++)
{
for (int j = 0; j < Width; j++)
{
if (i == PlayPosY&&j == PlayPosX)
{
cout << "*";
}
/
else if (i == BulletY && j == BulletX)
{
cout << "|";
}
///
else
{
cout << " ";
}
}
cout << endl;
}
这是Show()函数,仔细观察多了个上面标注的地方,用于子弹的显示,现在只是将子弹放在玩家前面,而没有发射移动,可以这样实现
void BulletMove()
{
if (BulletY > 0)
{
BulletY--;
}
}
将BulletMove( ) inputWithoutData()函数中,表示与用户输入无关的数据
下面是运行后的画面
这样玩家的基本功能就实现了,同样你也可以自己添加其他元素,如多发子弹、激光等高级武器
…
.x