本例是我参考学习童晶老师的《C/C++趣味游戏编程》书中例子改编而来。
1.安装好Visual Studio, EasyX图形库。(都可以去官网下载)
2.在VS中创建新的空项目(确保VS已经安装好C++模块)
3.在头文件中新建touch.h文件。
/*
** "别碰方块"游戏对象相关数据(游戏窗口,小球,方块,得分)
*/
#pragma once
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define WIDTH 1000 //窗口宽度
#define HEIGHT 400 //窗口高度
#define GRAVITY 0.6 //重力加速度
#define RADIUS 20 //球的半径
static int SCORE = 0; //得分
static int isBallOnFloor = 1; //判断小球是否在地面上,避免重复跳
static float BALL_VY = 0; //球的初始Y速度
static float BALL_X = WIDTH / 4; //球的初始X坐标
static float BALL_Y = HEIGHT - RADIUS; //球的初始Y坐标
static float RECT_HEIGHT = 100; //方块高度
static float RECT_WIDTH = 20; //方块宽度
static float RECT_LEFT_X = WIDTH * 3 / 4; //方块左边X坐标
static float RECT_TOP_Y = HEIGHT - RECT_HEIGHT; //方块顶部Y坐标
static float RECT_VX = -3; //方块X方向速度
4.在源文件中新建touch.cpp。
#include "touch.h"
int main() {
initgraph(WIDTH, HEIGHT); //新建游戏窗口
//一直保持循环
while (1) {
//当按键时
if (_kbhit()) {
char input = _getch(); //获得输入字符
//当按下空格键时,球在地面时才能起跳
if (input == ' ' && isBallOnFloor == 1) {
BALL_VY = -20; //给小球向上的速度
isBallOnFloor = 0; //表示小球不在地面
}
//小球左移
if (input == 'a' && isBallOnFloor == 1)
BALL_X -= 10;
//小球右移
if (input == 'd' && isBallOnFloor == 1)
BALL_X += 10;
}
if (BALL_X - RADIUS <= 0)
BALL_X = RADIUS; //控制小球不出界
BALL_VY += GRAVITY; //根据重力加速度更新小球Y方向速度
BALL_Y += BALL_VY; //更新小球Y坐标
//如果小球落到地面上
if (BALL_Y >= HEIGHT - RADIUS) {
BALL_VY = 0; //让小球停下来
BALL_Y = HEIGHT - RADIUS; //避免小球出界
isBallOnFloor = 1; //表示小球在地面上
}
RECT_LEFT_X += RECT_VX; //方块向左移
//如果方块跑到最左边
if (RECT_LEFT_X <= 0) {
RECT_LEFT_X = WIDTH; //方块重新在右边出现
SCORE += 1; //得分+1
RECT_HEIGHT = rand() % int(HEIGHT / 4) + HEIGHT / 4; //设置方块的随机高度
RECT_VX = rand() / float(RAND_MAX) * 4 - 7; //设置方块的随机速度
}
//如果小球碰到了方块
if ((BALL_X + RADIUS >= RECT_LEFT_X)
&& (BALL_X - RADIUS <= RECT_LEFT_X + RECT_WIDTH)
&& (BALL_Y + RADIUS >= HEIGHT - RECT_HEIGHT)) {
SCORE = 0; //得分清零
RECT_LEFT_X = WIDTH;
Sleep(500); //慢动作效果
}
cleardevice(); //清空画面
fillcircle(BALL_X, BALL_Y, RADIUS); //绘制小球
//绘制方块
fillrectangle(RECT_LEFT_X, HEIGHT - RECT_HEIGHT, RECT_LEFT_X + RECT_WIDTH, HEIGHT);
TCHAR s[20]; //定义字符串数组
swprintf_s(s, _T("%d"), SCORE); //将SCORE转换为字符串
settextstyle(40, 0, _T("宋体")); //设置文字大小字体
outtextxy(50, 30, s); //输出显示得分
Sleep(10); //暂停10ms
}
closegraph();
return 0;
}
输出效果: