C语言坐标打飞机,C语言控制台实现打飞机小游戏

本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下

初学C语言总觉得不能做些什么好玩的,这个小游戏只需 “一点点” (千真万确)C语言知识就能完成!

总计不到200行的非空白代码(没有强行压缩行数)

88e0112d051c1f48a7afca432106dc93.gif

操作说明:

1.W、S、A、D 控制 上 、下、左、右 方向,空格 攻击

2.每击中一架敌机增加1分,界面下方显示实时分数

3.撞到敌机后显示 game over!2.5秒(时间可更改)

子弹连发

移动的同时发射子弹

飞机撞上敌机结束游戏

可通过更改相关变量的值来调节敌机飞行速度、敌机密度、敌机刷新速度等

相比与上一个极度简陋版,功能基本完善

所需C语言知识真的不多,感兴趣的C程序员朋友来复刻吧!

以下是详细注释的源代码:

#include

#include

#include

#include

#define high 25 //画布高

#define width 60 //画布宽

#define border -1 //边界

#define blank 0 //空白

#define plane 1 //飞机

#define bullet 2 //子弹

#define enemy 3 //敌机

#define destroy 4 //摧毁标记

int canvas[high+2][width+2]; //游戏场景的高和宽

int pos_h, pos_w; //飞机位置

int enemynum; //敌机数量

int interval; //同个计次来模拟时间间隔

int itv_move; //敌机移动的时间间隔

int itv_new; //敌机刷新的时间间隔

int score; //分数

int IsOver; //判断游戏是否结束

void Startup(); //游戏数值初始化

void Show(); //游戏界面输出

void UpdateInput(); //与输入无关的游戏状态更新

void UpdateNormal(); //因输入导致的游戏状态更新

int main(){

Startup(); //初始化

while(IsOver){ //游戏循环

UpdateInput();

UpdateNormal();

Show();

}

printf("\t\tgame over!\n");

Sleep(2500); //暂停游戏结束界面(毫秒)

system("pause");

return 0;

}

void Startup(){ //游戏数值初始化

IsOver=1;

score=0; //初始化分数

for(int i=0;i

for(int j=0;j

if(i==0 || i==high+1 ||

j==0 || j==width+1){

canvas[i][j]=border;

}

else canvas[i][j]=blank;

}

}

pos_h=high/2; //初始化飞机竖直坐标

pos_w=width/2; //初始化飞机水平坐标

canvas[pos_h][pos_w]=plane; //初始化飞机位置

enemynum=3; //敌机数量

srand(time(NULL));

interval=4; //初始化时间间隔计数

itv_move=5; //初始化敌机移动时间间隔

itv_new =40; //初始化敌机刷新时间间隔

}

void Show(){ //游戏界面输出

HideCursor(); //隐藏光标

gotoxy(1,1); //回调光标、刷新画面

for(int i=0;i

for(int j=0;j

if( canvas[i][j] == plane ){ //当前位置为飞机位置

printf("*");

}

else if( canvas[i][j] == bullet ){ //当前位置为子弹位置

printf("|");

}

else if( canvas[i][j] == enemy ){ //当前位置为敌机位置

printf("@");

}

else if( canvas[i][j] == border ){ //当前位置为边界

printf("#");

}

else if( canvas[i][j] == blank ){ //当前位置无物,且在边界内

printf(" ");

}

else if( canvas[i][j] == destroy ){ //当前位置无物,且在边界内

printf("x");

}

}

printf("\n");

}

printf("\n得分:%d",score);

}

void UpdateInput(){ //与输入无关的游戏状态更新

char key_W=GetKeyState('W'), //监测 W 键是否按下

key_S=GetKeyState('S'), //监测 S 键是否按下

key_A=GetKeyState('A'), //监测 A 键是否按下

key_D=GetKeyState('D'), //监测 D 键是否按下

key_attack=GetKeyState(' '); //监测 空格 键是否按下

if(kbhit()){ //当有键按下时

if(key_W<0){ //当按下 W 键,上移

if(pos_h>1){

canvas[pos_h][pos_w]=blank;

if(canvas[pos_h-1][pos_w] == enemy){ //下个位置是敌机,撞毁

canvas[pos_h-1][pos_w]= destroy;

IsOver=0;

}

else canvas[--pos_h][pos_w]=plane;

}

}

if(key_S<0){ //当按下 S 键,下移

if(pos_h

canvas[pos_h][pos_w]=blank;

if(canvas[pos_h+1][pos_w] == enemy){ //下个位置是敌机,撞毁

canvas[pos_h+1][pos_w]= destroy;

IsOver=0;

}

else canvas[++pos_h][pos_w]=plane;

}

}

if(key_A<0){ //当按下 A 键,左移

if(pos_w>1){

canvas[pos_h][pos_w]=blank;

if(canvas[pos_h][pos_w-1] == enemy){ //下个位置是敌机,撞毁

canvas[pos_h][pos_w-1]= destroy;

IsOver=0;

}

else canvas[pos_h][--pos_w]=plane;

}

}

if(key_D<0){ //当按下 D 键,右移

if(pos_w

canvas[pos_h][pos_w]=blank;

if(canvas[pos_h][pos_w+1] == enemy){ //下个位置是敌机,撞毁

canvas[pos_h][pos_w+1]= destroy;

IsOver=0;

}

else canvas[pos_h][++pos_w]=plane;

}

}

if(key_attack<0){ //当按下空格键,发射子弹

if(pos_h!=1)canvas[pos_h-1][pos_w]=bullet;

}

}

}

void UpdateNormal(){ //因输入导致的游戏状态更新

int temp[high+2][width+2]; //用来判断原位置的临时数组

for(int i=1;i<=high;i++){

for(int j=1;j<=width;j++){

temp[i][j]=canvas[i][j];

}

}

for(int i=1;i<=high;i++){ //遍历临时数组,修改画布

for(int j=1;j<=width;j++){

if(temp[i][j]==enemy && interval%itv_move==0){ //当前位置为敌机

canvas[i][j]=blank;

if(temp[i+1][j]==bullet){ //下面为子弹,敌机被击中

canvas[i+1][j]=blank;

score++;

printf("\a"); //击中音效

}

else if(i

canvas[i+1][j]=enemy;

}

if(i+1==pos_h&&j==pos_w){ //下面为飞机,玩家飞机被撞毁

canvas[i+1][j]=destroy;

IsOver=0;

}

}

if(temp[i][j]==bullet){ //当前位置为子弹

canvas[i][j]=blank;

if(temp[i-1][j]==enemy){ //下个位置是敌机,敌机被击毁

canvas[i-1][j]=blank;

score++;

printf("\a");

}

else if(i>1){

canvas[i-1][j]=bullet;

}

}

}

}

if(interval%itv_new==0) //刚好到时间间隔

for(int i=0;i

canvas[rand()%2+1][rand()%width+1]=enemy;

}

if(interval<=100){ //时间间隔计次

interval++;

}

else{ //时间间隔计次清零

interval=0;

}

}

void gotoxy(int x,int y){ //回调光标

COORD pos;

pos.X=x-1;

pos.Y=y-1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

}

void HideCursor(){ //隐藏光标函数

CONSOLE_CURSOR_INFO cursor;

cursor.bVisible = FALSE;

cursor.dwSize = sizeof(cursor);

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorInfo(handle, &cursor);

}

更多有趣的经典小游戏实现专题,分享给大家:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合同相似可逆等价矩阵的关系及性质_行列式的性质问题

行列式的学习一方面要掌握计算行列式的一般方法&#xff1b;对性质要理解。考点与要求&#xff1a;了解&#xff1a;行列式的概念、方阵的乘积、行列式的性质&#xff1b;掌握&#xff1a;行列式的性质&#xff1b;会用&#xff1a;行列式的性质和行列式按行(列)展开定理计算行…

c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版

本系列历史文章目录&#xff1a;ESP32概述与Arduino软件准备新冠肺炎疫情数据实时显示器B 粉计数器本期给大家带来的案例是&#xff1a;蓝牙翻页笔。先来看一下演示视频吧&#xff1a;蓝牙翻页笔 | PPT播放控制器 | 蓝牙键盘 | 用 Arduino 玩转掌控板 ESP32 / ESP8266 | 图形化…

python 程序运行在阿里云主机_阿里云主机Access key利用工具

简介&#xff08;Gamma实验室核心成员&#xff1a;一灯老和尚所写&#xff09;在日常渗透过程中我们经常遇到信息泄露出ALIYUN_ACCESSKEYID与ALIYUN_ACCESSKEYSECRET&#xff08;阿里云API key&#xff09;&#xff0c;特别是laravel框架得debug信息。APP中也会泄露这些信息&am…

一张纸厚度是多少毫米_一张纸的威力有多大?纸折103次捅破宇宙,理论荒诞却无法反驳...

【图文摘自网络&#xff0c;如有侵权请联系删除】人类达到月球需要多久时间&#xff1f;地球和月亮的距离不是一成不变的&#xff0c;它有着近地点和远地点&#xff0c;地球里月球最远的距离在363300千米&#xff0c;最远为405500千米。而当年阿波罗号由火箭发射到登陆月球表面…

oracle 两表两列数据对比_Oracle、PostgreSQL与Mysql数据写入性能对比

最近因为工作需要&#xff0c;需要对Oracle和Mysql写入性能进行对比&#xff0c;以前都是听说Mysql性能比Oracle不是一个级别&#xff0c;现在亲测后&#xff0c;不比不知道&#xff0c;一比吓一跳。。。追加PostgreSql性能测试数据测试场景本地电脑(单机)&#xff0c;通过程序…

锐驰机器人的市场_【年终盘点】2020年,锐驰的王炸新品!

点击蓝字关注我哦辛苦付出、苦熬实干&#xff0c;换来了硕果累累、丰收成片。回首2020年&#xff0c;锐驰秉承着锐意进取、快速创新的理念&#xff0c;在自动化道路上不断探索&#xff0c;推出了多款智能自动化机器&#xff0c;现在着重介绍以下3款&#xff1a;异型插件机器人、…

学生管理系统c#语言代码,基于C#语言的学生管理系统的设计(ASP.NET2.0)

摘 要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生管理系统是学校管理中不可少的一部分。而基于B/S架构的学生管理系统是方便学校管理&#xff0c;实行电子办公的必要组成部分&#xf…

异常信息_一个针对异常信息通知的springboot starter

前言作为后端开发者&#xff0c;项目上线之后难免会遇到各种问题&#xff0c;一个良好且及时的异常通知机制可以让我们在项目的维护上避免很多不必要的麻烦。本项目的开发愿景是为了给使用者在线上项目的问题排查方面能够带来帮助&#xff0c;简单配置&#xff0c;做到真正的开…

2使用教学_建水三中智能交互式液晶一体机设备投入使用

“张老师&#xff0c;一体机的使用会了吗&#xff1f;”“一体机在教学中好用吗&#xff1f;”“告别多年粉笔加黑板的教学方式&#xff0c;不用再吸入粉笔灰了。”2月25日清晨&#xff0c;建水三中的老师们议论纷纷&#xff0c;大家关注的是如何操作使用教室里安装的一体机。建…

数据结构折半查找算法C语言,数据结构C语言实现----折半查找

运行结果&#xff1a;代码如下&#xff1a;#include//数组初始化函数void Array_get(int array[],int max){printf("请输入一个数组&#xff0c;大小从低到高&#xff0c;各个数字间以空格隔开&#xff1a;");for (size_t i 0; i < max; i){scanf("%d"…

生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?

学驾照的过程不用说&#xff0c;每一个经历过的人都有着刻骨铭心的记忆。很多人认为自己流了很多汗水&#xff0c;付出了很多精力在练车场上摸爬滚打&#xff0c;这下肯定把驾驶技术给夯实了&#xff0c;以后开车上路一点问题也没有。但是事情真的是这样吗&#xff0c;驾校学的…

470p 更换固态硬盘_联想G510换固态硬盘遇到的问题

唉&#xff01;更正一下吧&#xff01;电脑识别光驱位机械硬盘没有成功&#xff0c;出现了新问题&#xff0c;偶尔能识别出来&#xff0c;通常情况下不能识别出来&#xff0c;正在寻找解决办法中.........现在对于刚发表的这篇文章&#xff0c;有点惭愧&#xff01;二更&#x…

linux指针赋值原子,x86_64处理器的指针赋值是原子操作吗?

如题&#xff0c; x86_64处理器的指针赋值是原子操作吗&#xff1f;说实话我很讨厌参与讨论那些似乎不确定东西&#xff0c;倒不是说我对未知不敬畏&#xff0c;而是参与讨论的人大多数都是似懂非懂&#xff0c;对&#xff0c;我说的不确定性指的是参与讨论的人的认知的不确定&…

tecplot批量导出图片_批量导出Excel图片,用这招,半分钟干的活别人一整天完不成...

上个星期&#xff0c;我的一个同学向我求助。她是公司的HR&#xff0c;老板让她把员工信息表中的照片导出到文件夹中&#xff0c;然后打包发送给行政部的文员打印出来。她公司有5000多人&#xff0c;她复制粘贴了整整一个上午&#xff0c;才导出了200多张照片&#xff0c;而且还…

填充table_Excel Power Query | 向下填充的逆过程

上期内容给大家讲解了关于图表精品图表 | Excel绘制“带有阈值分割的条形图和棒棒图”的制作方法。本期给大家讲解一下关于Power Query的知识 。如下图&#xff0c;将下面的数据向下填充逆过程。即将左侧的数据转换至右侧的数据。如果是从右往左的话是直接向下填充即可&#xf…

# 解析bt文件_磁力链接和BT种子使用方法

目前用的最多的是磁力链接和BT种子&#xff0c;不过好多人并不太会使用&#xff0c;因此写个教程给大家说明一下。何为磁力链接&#xff1a;简单地说&#xff0c;磁力链接是一种特殊链接&#xff0c;但是它与传统基于文件的位置或名称的普通链接(如http://xxx)不一样&#xff0…

easyexcel设置下拉选项不能覆盖_Wi-Fi经常掉线 这个设置要修改

在使用Wi-Fi的时候最大的问题是什么&#xff1f;小伙伴们肯定说&#xff0c;当然是掉线啦。Wi-Fi设备过多、路由器设置等问题造成的掉线断网问题咱们之前都说过了。有些小伙伴又反映自己的电脑在使用无线网络时&#xff0c;一段时间不用就会掉线&#xff0c;手机却一直连接很好…

google开源android工具,谷歌最强Android UI工具包霸榜Github,这份上手指南了解一下...

2019年&#xff0c;谷歌在I/O大会上公开开源了一个非捆绑工具包——Jetpack Compose&#xff0c;这是一个用于构建原生Android UI的现代化工具包。仅通过少量代码就能完成布局&#xff0c;且能够直接使用Kotlin来进行编写。Jetpack Compose工具包是围绕着composable函数来构建的…

重叠面积_重叠面积——动点产生的重叠面积问题

本文开始介绍重叠面积问题。顾名思义&#xff0c;此类问题主要是求两个几何图形的重叠部分的面积。解题的关键为画出图形&#xff0c;然后再表示面积。文中的中考真题选自以下地区&#xff1a;2019•资阳、2019•鸡西、2019黄冈【题1】(2019•资阳)在矩形ABCD中&#xff0c;连结…

鸿蒙os硬件要求,华为公布鸿蒙OS 2.0硬件安装要求:只要128K内存就能跑

9月10日下午&#xff0c;华为在东莞松山湖举办了2020开发者大会&#xff0c;鸿蒙OS 2.0正式发布。会后&#xff0c;华为软件部总裁王成录博士、华为软件部副总裁杨海松等接受了专访。谈及鸿蒙OS 2.0的规划&#xff0c;杨海松表示&#xff0c;大家非常期待的手机的Beta版本会在今…