躲避方块的球——C语言游戏

本例是我参考学习童晶老师的《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;
}

输出效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

New_Teen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值