C语言 弹小球 小游戏(控制台)
C语言实现弹小球游戏
编译环境:vs2019
需求:
小球在控制台界面内不停移动,碰到边界则改变方向,控制棍子接住小球,得分加一,小球没有被接住则游戏结束。
思路:
_getch()函数接收a、d两个字符控制控制棍子移动,使棍子接住小球小球y轴则自减,碰到边界再重新弹回来,接住一次小球得分加一。
做法:
做出小球运动效果的关键就是:通过一个变量控制小球的运动方向,这个变量根据碰到的边界和他当前的值做出改变,从而向一个与飞过来的方向完全相反的方向移动。
再设置小球只有在碰到棍子所在的下边界之后才会上弹,没有碰到棍子所在的下边界则结束游戏。
难点:
小球的运动效果。
说明:
弹小球小游戏程序除了创意是我第一个自己独立写出来的小程序,相比较我写过的几个其他的程序他是最简单的,因为他的核心部分只需要用单个变量就可以写出来,不需要统计多个数据。
我看到的弹小球游戏原本的程序的游戏目标是弹中上边界所有的砖块,但是因为要实现这个效果要更复杂一些,所以我当时为了简略,直接写成了只统计分数的简易版本。
注意:
由于编译器原因程序中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的“_”。
运行效果:
代码实现:
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
void gotoxy(int x, int y); //光标定位函数
void anxfx(); //棍子移动
void yxcsh(); //游戏界面初始化
void txqhs(); //弹小球函数
void xtpdhs(); //判断小球运动方向函数
void hzxqhs(); //绘制小球函数
void function(); //功能实现**
void HideCursor(); //隐藏光标函数
void pdyxjs(); //游戏结束
int _x = 0, _y = 0; //小球的x和y坐标
int ab = 1, ab2 = 1; //用于控制开关
int xdir = 0, ydir = 0; //小球运动方向 往右
int bs;
char an = ‘0’; //接收输入的方向键
int x = 36, x2 = 0, x3 = 0; //棍子的x坐标和清除重复字符
int sdf = 1; //判断棍子是否接住球,接住为1,不可以写成0
int n = 0; //游戏得分变量
int main()
{
yxcsh(); //游戏界面和计分
function(); //功能主函数
return 0;
}
void yxcsh() //游戏界面
{
HideCursor(); //移除光标
system(“title 弹小球游戏”); //控制台标题
system(“mode con cols=80 lines=25”); //控制台界面大小
for (int i = 0; i < 80; i++) //头部边界
printf("_");
gotoxy(23, x);
printf("========"); //绘制初始棍子
}
void anxfx() //控制棍子移动
{
x2 = x + 7; //根据x的值确定需要在x2的位置输出空格,用来实现清除上一次的棍子的效果
x3 = x;
gotoxy(23, x2-1); //刚开始会有多出一个等号的漏洞,找不出问题
printf(" ");
an = _getch(); //即使接收值的函数
if (an == 'a')
{
x > 0 ? x-=2 :x; //如果棍子移动的距离小于边界的距离则停下
gotoxy(23, x2);
printf(" "); //用于清除上一次绘制的棍子
}
if (an == 'd')
{
x <= 71 ? x+=2 : x;
gotoxy(23, x3);
printf(" ");
}
gotoxy(23, x);
printf("========"); //绘制下一次按键后的棍子
}
void txqhs() //小球运动函数
{
xtpdhs(); //判断函数
if (bs == 2) //下边一面
if (_y >= 22) bs = 3;
if (bs == 1)
if (_y >= 22) bs = 4;
if (bs == 1) //右边一面
if (_x >= 79) bs = 2;
if (bs == 4)
if (_x >= 79) bs = 3;
if (bs == 3)
if (_y <= 1) bs = 2; //上边一面
if (bs == 4)
if (_y <= 1) bs = 1;
if (bs == 3)
if (_x <= 0) bs = 4; //左边一面
if (bs == 2)
if (_x <= 0) bs = 1;
hzxqhs(); //绘制小球函数
}
void xtpdhs() //变量sdf控制小球运动方向
{
if (_y>=22)
{
if (_x >= x && _x <= x2)
{
sdf = 1;
n++;
}
else
{
sdf = 0;
}
}
pdyxjs();
if (bs == 1) //0是右,下
{
_x++; _y++;
}
else if (bs == 2)
{
_x--; _y++;
}
else if (bs == 3)
{
_x--; _y--;
}
else if (bs == 4)
{
_x++; _y--;
}
}
void pdyxjs()
{
if (sdf == 0 || n >= 20) //游戏结束条件
{
gotoxy(_y + 1, _x + 1);
printf(“o”);
Sleep(500);
gotoxy(_y + 1, _x + 1);
printf(" ");
system("cls");
gotoxy(10, 34);
printf("游戏结束");
gotoxy(12, 32);
printf("最终得分:%d", n);
if (n >= 20)
{
gotoxy(14, 34);
printf("您通关了!");
}
else
{
gotoxy(14, 32);
printf("您没有弹中!");
}
gotoxy(21, 0);
exit(0);
}
}
void hzxqhs() //绘制小球函数
{
gotoxy(_y, _x);
printf(“o”);
Sleep(100);
gotoxy(_y, _x);
printf(" ");
}
void function() //总结函数
{
srand((unsigned)time(NULL)); //随机种子
_x = rand() % 79; //每次小球的初始x坐标为一个随机数
_x > 40 ? bs = 2 : bs = 1; //因为小球初始的x坐标是一个随机数
//所以这里针对他的x坐标确定他的初始运动方向
while (1)
{
gotoxy(0, 0);
printf("得分:%d ", n); //显示每次循环后分值
if (_kbhit()) //按下键盘时
{
gotoxy(23, 36);
anxfx(); //棍子的动画效果
}
txqhs(); //小球动画效果
}
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x, int y)
{
COORD pos = { y,x };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
不足之处:
因为这是我第一个单独完成的小程序,对c语言的使用还有很多不成熟的地方,比如在标识符定义、代码复用性、程序运行效率上海存在着很多问题。
作为一名c语言新手,我对未知的知识始终抱有学习和谦卑的态度,如有贵人能够对我的程序提出建议,我将不胜感激。