C/C++培训
达内IT学院
400-996-5531
作为一种由如数据类型、命令符等人自己创造的各种规定的集合,C++像法律。用C++编程像是运用法律。学习C++语法像背法律,好像很枯燥。当学完语法开始上机后,初学者练习C++编程通常又是做各种计算题,总觉更加枯燥。为了让学习C++入门语法的过程有趣一些,在此介绍C++Dos游戏设计,希望在写游戏代码的过程中学习C++能让入门者的学习更加开心。
这次带来的项目是弹跳小球,其游戏规则是:小球在墙壁间运动,若碰到墙壁或挡板则反弹,击中砖块可得分。玩家控制一个挡板,如果小球越过挡板,游戏结束。
本文将以循序渐进的方法引导读者完成项目。先实现一个会跳的小球,关于控制挡板、计分、画墙壁等内容将在以后发布。对于所需语法知识的学习请多查阅课本。制作本项目前所需知识:集成开发环境CodeBlock的初步用法(如新建项目、调试)
1、 显示一个静止的小球
所需语法知识:标识符、变量、常量、运算符与表达式、cout、for语句的用法。
目的:在控制台的第5行第10个字符位画出小球“o”。
思路:先输出4个换行符,再输出9个空格,再输出“o”,最后输出换行符(为什么?)。
代码:自己想。。。。。。
2、 显示一个下落的小球
所需语法知识:1所需的、清屏函数
清屏函数:实现清屏功能,包含在头文件stdlib.h下,使用时写下语句system(“cls”)即可。
目的:让一个小球从控制台的第10个字符位,从第1行掉到第9行。
思路:先清屏后重画,在每次重画前让小球出现行数加1。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int y,x = 5;
int high = 20;
int i,j;
for(y=1;y<10;y++)//从第1行掉到第9行
{
system("cls");
for(i=0;i<y;i++)
cout<<endl;//输出到球那一行之前的行
for(j=0;j<x-1;j++)
cout<<' ';//输出空格
cout<<'o'<<endl; //输出一颗球
while(i<10000000) //减慢速度
i++;
}
return 0;
}
3、 显示一个上下弹跳的小球
所需语法知识:2所需的
目的:让一个小球在控制台的第10个字符位的第1行到第9行间来回移动。
思路:先清屏后重画。在每次重画前,计算小球位置。若小球下落,在每次重画前让小球出现行数加1;若小球上升,在每次重画前让小球出现行数减1。
4、 显示一个斜着弹跳的小球
所需语法知识:2所需的
目的:让一个小球在一定的区域内来回移动,当小球到达一个矩形边界后反弹。
思路:先清屏后重画。在每次重画前,计算小球位置。将斜向运动分解为横向运动和纵向运动,由3可类比出计算原理。
以上便在控制台实现一个会跳的小球。3、4及完整版的代码可以在百度网盘上下载:https://pan.baidu.com/s/1dE7OKal
5、用函数重构程序
所需语法知识:函数
目的:用函数进行逻辑模块化
思路:将main函数改为
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
现在正式开始介绍游戏算法。描述算法的方式是程序框图和伪代码。程序框图高中已经学习,因此先介绍伪代码。
伪代码
伪代码是程序框图与实际代码的中间体,它有类似代码的格式,但为了方便不会按如C++的具体语言的语法来组织。如上篇的2就可以写成下列的伪代码。
x=10,y=1
for y from 1 to y
清屏 //用缩进表示循环体
for I from 1 to y
cout<<endl
for j from 1 to x
cout<<‘ ‘
cout<< ‘o’<<endl
wait for a minute
伪代码的作用是描述算法,不考虑实现所有细节,只考虑部分细节,所以出现了“wait for a minute”“清屏”等语句。同时因为大家在学C++,所以用了些C++中的语句来表意,如输出换行用“cout<<endl”而不用C语言里的“printf("\n")”
一言蔽之,伪代码写得别人看得懂,能表述自己的算法就行了。
弹跳小球算法
我们的任务是在控制台的某个位置输出已决定的字符,然后从整体上看起来是个游戏的画图及决定输出字符的位置,使画的图能按照游戏规则与玩家交互。
程序的流程图如下:
程序开始先定义些参数,如游戏区域、球、砖头、挡板的位置、球的速度、分数、击球数。然后便进入画图和更新的循环,如果满足游戏失败条件则结束程序。我们的游戏计算机并不理解,它只是一个能进行逻辑运算和四则运算的计算器而已。要在计算机上实现游戏程序,必然是把游戏转换成计算题去实现。
下面介绍定位及更新的原理。定位用的是坐标法思想,即通过数对确定球、挡板、砖头等各个对象的位置等参数。
程序开始后的初始化过程如果用伪代码来表示,即是:
Startup()
ballX=5,ballY=10 球的初始位置
ballvx=1,ballvy=1 速度,分运动思想
high=20,width=25 游戏区域
score=0 分数
ballNumber=0 击球数
blockX=10,blockY=1 砖块的位置
positionX=width/2,positionY=high
ridus=5
left=positionX-ridus
right=positionX+ridus 挡板
画图的原理如下,其方法是一行一行扫描。
Show()
清屏
for I from 1 to high+1
for j from 1 to width
If(i=ballX&&j=ballY)
cout<<’o’
else if(I=width)
cout<<’|’
else if(j=high+1)
cout<<’_’
else if(i=positionY&&
j>=left&&
j<=right)
cout<<’*’
else if(i=blockY&&
j=blockX)
cout<<'B'
else cout<<' '
更新的流程图如下:
更新可分为与玩家输入无关的更新及与玩家输入有关的更新,若用伪代码表示,即是:
updateWithoutInput()
if(ballY=high-1)
if (ballX>=left&&ballX<=right)
ballNumber++ //击中挡板
else cout<<”GameOver”
<<endl
按一下键
exit
if(ballX=blockX&&ballY=blockY)
score++ //击中砖块
blockX=0~width-1的随机数
ballX +=ballvx //球移动
ballY+=ballvy
if(ballX =0||ballX=width-1)
ballvx = -ballvx 球反弹
if(ballY=0||ballY=high-1)
ballvy=-ballvy
wait for a minute 降低难度
下面介绍有输入的更新
updateWithInput()
if(按键)
input=按键
if (input=”a”)
positionX-- 向左移动挡板
left=positionX-ridus
right=positionX+ridus
if(input=’d’) 向右移动挡板
positionX++
left=positionX-ridus
right=positionX+ridus
至此项目结束,可能对于初学者来说这个项目有点难。但是这包括了程序设计的大部分:先是设计算法,即用流程图初步表示算法,然后用伪代码描述算法细节。后是实现算法,即用具体的编程语言来实现算法。后续的项目还有飞机大战、flappy bird、贪吃蛇。做完这些项目,再写写计算题,这么水的C++课想不考好,依我看,有点难。
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved