c语言飞机借位,使用c语言实现飞机游戏
在这里,我主要使用scanf函数和printf函数来实现一个简单的飞机游戏,并且通过函数的形式实现。
整体思路:main函数
在这里,主要是使用一个简易的游戏框架,来减小开发游戏时的难度int main(){
startup();//初始化
while (1) //游戏循环进行
{
show();//显示画面
updateWitoutIput();//与用户输入无关的更新
updateWithInput(); //与用户输入有关的更新
}
system('pause');
return 0;
}
全局变量的定义
为了方便之后代码的书写,在这里,我们使用宏定义代替部分全局变量//全局变量的定义
#define HIGH 20 //游戏界面高度
#define WIDTH 30 // 游戏界面宽度
#define NUM 20 //敌机下落速度
int position_x, position_y; //飞机位置
int bullet_x, bullet_y; //子弹位置
int enemy_x, enemy_y; //敌机位置
int score; //得分
全局变量的初始化void startup()//数据的初始化{
//初始化飞机
position_x = HIGH / 2; //高度
position_y = WIDTH / 2; //宽度
//初始化子弹
bullet_x = -1; //使子弹出现在屏幕外
bullet_y = position_y;
//初始化敌机
enemy_x = 0;
enemy_y = position_y;
//初始化得分
score = 0;
}
显示函数show()
输出飞机、敌机、子弹等
使用循环语句,在满足飞机、敌机、子弹位置条件时输出对应的图案(飞机: * 敌机: @ 子弹: | ),其余位置输出‘ ’或‘\n’//输出每一行每一列
for (i = 0; i
{
for (j = 0; j
{
if (i == position_x && j == position_y)//输出飞机
{
printf('*');
}
else if (i == bullet_x && j == bullet_y)//输出子弹
{
printf('|');
}
else if (i == enemy_x && j == enemy_y)//输出敌机
{
printf('@');
}
else
{
printf(' ');
}
}
printf('\n');
}
输出得分printf('得分:%d', score);
清屏
在输出输出飞机等图标时,需要使用清屏函数使得光标回到 (0,0) 处,方便下一次输入
清屏函数#include
system('cls');
使光标回到 (0,0)gotoxy(0, 0);
void gotoxy(int x, int y) //将光标调整到(x,y)的位置{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
隐藏光标显示
为了防止光标闪烁的过于频繁,我们使用隐藏光标显示函数隐藏光标oid HideCursor()//隐藏光标显示函数{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//该函数只需调用一次即可
与用户输入无关的部分
子弹上落if (bullet_x > -1) //让子弹向上落
{
bullet_x--;
}
敌机下落,到达底部后,生成新的敌机//创建一个静态变量,当静态变量满足一定条件时,敌机下落一次,这样可以控制敌机下降的速度同时不影响飞机移动的速度
static int speed = 0; //控制敌机下落速度
if (speed
{
speed++;
}
else
{
enemy_x++; //敌机下落一次
speed = 0;
}
if (enemy_x > HIGH) //敌机一直下落到底部
{
enemy_x = -1; //生成新的飞机
enemy_y = rand() % WIDTH;
}
命中敌机,得分+1,同时生成新的敌机if (bullet_x == enemy_x && bullet_y == enemy_y) //命中
{
score++; //得分+1
enemy_x = -1; //生成新的飞机
enemy_y = rand() % WIDTH;
bullet_x = -1; //让子弹直接出现屏幕外,直到下一次发射子弹
}
与用户输入有关的部分
在这里,我们可以使用scanf函数或者getch函数实现在用户输入 ‘w’ ‘s’ ‘a’ ‘d’ 时对上下左右的控制
scanf函数scanf('%c', &input);
if (input == 'w')
position_x--;
if (input == 's')
position_x++;
if (input == 'a')
position_y--;
if (input == 'd')
position_y++;
if (input == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
getch函数if (_kbhit()) //kbhit()函数:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0,头文件
{
input = _getch(); //getch()是一个不回显函数,当用户按下某个字符时,函数自动读取,但是不会显示在屏幕上,无需按回车,
if (input == 'w')
position_x--;
if (input == 's')
position_x++;
if (input == 'a')
position_y--;
if (input == 'd')
position_y++;
if (input == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
}
在这里,我们选择使用getch()函数,从而使得程序更加方便(减少用户回车的输入及屏幕上的显示)
注意事项
在实现代码时需要注意在使用各个函数时对头文件的调用尽量减少对全局变量的创建
完整代码#include
#include
#include
#include
#include
//全局变量的定义
#define HIGH 20 //游戏界面高度
#define WIDTH 30 // 游戏界面宽度
#define NUM 10 //敌机下落速度
int position_x, position_y; //飞机位置
int bullet_x, bullet_y; //子弹位置
int enemy_x, enemy_y; //敌机位置
int score; //得分
void gotoxy(int x, int y) //将光标调整到(x,y)的位置{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor() //隐藏光标显示{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup()//数据的初始化{
//初始化飞机
position_x = HIGH / 2; //高度
position_y = WIDTH / 2; //宽度
//初始化子弹
bullet_x = -1;
bullet_y = position_y;
//初始化敌机
enemy_x = 0;
enemy_y = position_y;
//初始化得分
score = 0;
}
void show()//显示画面{
//system('cls'); //清屏函数
gotoxy(0, 0); //使光标回到0,0
int i, j;
for (i = 0; i
{
for (j = 0; j
{
if (i == position_x && j == position_y)//输出飞机
{
printf('*');
}
else if (i == bullet_x && j == bullet_y)//输出子弹
{
printf('|');
}
else if (i == enemy_x && j == enemy_y)//输出敌机
{
printf('@');
}
else
{
printf(' ');
}
}
printf('\n');
}
printf('得分:%d', score);
}
void updateWitoutIput()//与用户输入无关的更新{
if (bullet_x > -1) //让子弹向上落
{
bullet_x--;
}
if (bullet_x == enemy_x && bullet_y == enemy_y) //命中敌机
{
score++; //得分+1
enemy_x = -1; //生成新的飞机
enemy_y = rand() % WIDTH;
bullet_x = -1; //让子弹直接出现屏幕外,直到下一次发射子弹
}
static int speed = 0; //控制敌机下落速度
if (speed
{
speed++;
}
else
{
enemy_x++;
speed = 0;
}
if (enemy_x > HIGH) //敌机一直下落到底部
{
enemy_x = -1;
enemy_y = rand() % WIDTH;
}
}
void updateWithInput()//与用户输入有关的更新{
//用户输入
char input;
if (_kbhit())
{
input = _getch();
if (input == 'w')
position_x--;
if (input == 's')
position_x++;
if (input == 'a')
position_y--;
if (input == 'd')
position_y++;
if (input == ' ')
{
bullet_x = position_x - 1;
bullet_y = position_y;
}
}
}
int main(){
startup();//初始化
HideCursor();
srand((unsigned)time(NULL));
while (1)
{
show();//显示画面
updateWitoutIput();//与用户输入无关的更新 //更新数据
updateWithInput(); //与用户输入有关的更新 //输入分析
}
system('pause');
return 0;
}
程序效果
总结
虽然完成了一个简单的飞机游戏,但是很多的功能都未能实现,如改变飞机的形状,增加游戏的难度,飞机生命的减少等等,任需要继续的努力。
---------------------
作者:木头i
c语言飞机借位,使用c语言实现飞机游戏相关推荐
- c语言10以内位运算,C语言基础知识--位运算
1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...
- c语言左移15位,关于c语言中左移右移运算符的问题
参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...
- c语言产生32位随机数,C语言,如何产生随机数
1. 基本函数 在C语言中取随机数所需要的函数是: int rand(void); void srand (unsigned int n); rand()函数和srand()函数被声明在头文件stdl ...
- c语言除法加速,干货!C语言高效编程与代码优化
原标题:干货!C语言高效编程与代码优化 译文链接:http://www.codeceo.com/article/c-high-performance-coding.html 英文原文:https:// ...
- pic c语言 位标志,PIC单片机状态寄存器中的C(进位/借位位标志)
查阅PIC单片机芯片手册,关于进位/借位位的说明为: C:进位/借位位. 1 = 结果的最高位发生了进位 0 = 结果的最高位未发生进位 同时有一条标注:借位的极性是相反的. 通过以上说明,可以将C的 ...
- c语言数码管数字时钟程序,数码管显示模拟8位时钟C语言程序设计
原标题:数码管显示模拟8位时钟C语言程序设计 //数码时钟设计 #include // 包含寄存器定义的头文件 unsigned char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x ...
- C语言中的位运算和逻辑运算
位运算 C语言中的位运算包括与(&),或(|),亦或(^),非(~). 下面的代码包扩了这些基本运算,还有一个两个数的交换(不用第三个数). #include<stdio.h> # ...
- C语言结构联合位字段知识体系总结大学霸IT达人
C语言结构联合位字段知识体系总结大学霸IT达人 C语言的基础类型中只能去定义单一类型的变量用于指代数据,但在现实生活中我们常常要处理的数据却会包含多种类型的数据. 例如,公司员工的信息管理,每个员工的 ...
- C语言中的位运算符主要有哪些?逻辑右移与算术右移的区别?
逻辑右移与算术右移的区别? 逻辑右移就是不考虑符号位,右移一位,左边补零即可. 算术右移需要考虑符号位,右移一位,若符号位为1,就在左边补1,:否则,就补0. 所以算术右移也可以进行有符号位的除法,右 ...
最新文章
- iphone和android,iPhone 和 Android 产品经理有哪些异同?
- 在IIS中写Python的CGI脚本
- 软件工程网络15个人作业3——案例分析(201521123029 郑佳明)
- 工业级服务器销售电话,工业级服务器
- 使用Redis 实现消息队列
- 腾讯云大数据套件Hermes-MR索引插件使用总结
- Nginx下配置小绿锁https
- [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
- android glide 版本,Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法
- HNUSTOJ-1437 无题
- python 测试用例管理 生成_python自动生成接口测试用例
- 电商淘宝天猫美妆页面PSD分层模板,优秀作品促进品牌提升
- 蓝桥杯 基础练习 矩阵乘法
- spring集成Quartz时区问题造成任务晚执行八小时
- Java分布式锁的概念以及使用优点
- 武汉科技大学计算机课程设置,武汉科技大学计算机控制与接口技术课程实施方案.docx...
- SLAM学习笔记-------------(八)视觉里程计2
- python自动化实现QQ自动发说说
- 2021年12月苹果开发者证书配置
- ubuntu mysql的my.cnf_Ubuntu下面MySQL的参数文件my.cnf浅析
热门文章
- 程序员跳槽攻略,如何高效准备面试?
- 美团张川:做了8年平台,我总结了平台的5道坎
- 【IPD流程学习 四】常见问题答疑
- java-net-php-python-java生产管理系统计算机毕业设计程序
- Excel-Python对数据进行线性回归
- Jquery简单实现2048小游戏
- Matlab的学生版 价格很便宜呢,相比于商业版
- 单片机原理及应用技术课后答案(5)
- 西南大学学前教育计算机答案,西南大学学前教育科研方法作业及答案.doc
- http://club.topsage.com/thread-2203076-1-1.html