#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#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();       //与输入无关的游戏状态更新
void HideCursor();         //隐藏光标
void gotoxy(int x, int y); //回调光标
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 < high + 2; i++){ //初始化画布for (int j = 0; j < width + 2; j++){if (i == 0 || i == high + 1 ||j == 0 || j == width + 1){canvas[i][j] = border;}elsecanvas[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 < high + 2; i++){for (int j = 0; j < width + 2; 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()){ //当有键按下时  //vc++6.0以上版本为 _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;}elsecanvas[--pos_h][pos_w] = plane;}}if (key_S < 0){ //当按下 S 键,下移if (pos_h < high){canvas[pos_h][pos_w] = blank;if (canvas[pos_h + 1][pos_w] == enemy){ //下个位置是敌机,撞毁canvas[pos_h + 1][pos_w] = destroy;IsOver = 0;}elsecanvas[++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;}elsecanvas[pos_h][--pos_w] = plane;}}if (key_D < 0){ //当按下 D 键,右移if (pos_w < width){canvas[pos_h][pos_w] = blank;if (canvas[pos_h][pos_w + 1] == enemy){ //下个位置是敌机,撞毁canvas[pos_h][pos_w + 1] = destroy;IsOver = 0;}elsecanvas[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 < high){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 < enemynum; 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);
}

打飞机小游戏c++窗口实现版相关推荐

  1. java打飞机小游戏(跟着网上视频写到)

    package 飞机小游戏; //如果觉得好的话,给一点积分哦,太痛苦了,平时下一点资料都得需要 import java.awt.Color; import java.awt.Font; import ...

  2. Java版打飞机小游戏

    放假写的一个Java端打飞机小游戏. 复习到的知识点有:java图形界面,多线程,集合框架等. 主要的收获是知道了处理图层的方式,即JLayeredPane层次面板,主要思路 如下: 1.       ...

  3. 用JAVA写个飞机小游戏玩玩吧

    闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...

  4. C语言射击类打飞机小游戏

    使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,击中敌机可获得积分,被敌机撞中死亡一次,每次游戏有3次机会. 在网上查询资料并且和同学讨论之后,对原来的代码有了一些改进, 改进:增加了颜色函数 ...

  5. Java飞机小游戏制作简单实现详细小结

    567881@ftJava小游戏开发 Java飞机小游戏制作简单实现小结 本人原来是个技术小白,寒假我跟着高淇老师的Java300集开始自学Java,跟着做了一个飞机大战小游戏,已经实现了飞机的自由移 ...

  6. 编程语言用 Java 开发一个打飞机小游戏(附完整源码)

    编程语言用 Java 开发一个打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过 ...

  7. 视频教程-JavaScript打飞机小游戏视频教程-JavaScript

    JavaScript打飞机小游戏视频教程 拥有6年web前端和后端开发经验,4年授课经验,还曾在百度专业培训过网络营销课程,曾就职于联想集团和当当网,不仅有丰富的项目实战经验还有营销经验,综合实力较强 ...

  8. Android 打飞机 小游戏 的实现 - 画面移动 对象封装 碰撞效果

    打飞机小游戏 *1.画背景  *2.画飞机  *3.画小怪  *4.画子弹  *--背景,飞机.小怪.子弹各有draw和move方法 public class MainActivity extends ...

  9. 微信打飞机小游戏的尝试

    微信打飞机小游戏的尝试 问题:微信打飞机游戏出现不断跳出的问题 原因:未加return. ​

  10. c语言射击类打飞机小游戏感悟

    c语言:简单飞机射击小游戏 使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,操作方法是"a""d""w"或者"←" ...

最新文章

  1. 一文读懂深度学习中的各种卷积
  2. 三大深度学习生成模型:VAE、GAN及其变种
  3. c++ 解析从浏览器端传过来的图像base64编码,并转换成opencv识别的格式
  4. MySQL Cluster 配置详细介绍
  5. [Bug]The maximum array length quota (16384) has been exceeded while reading XML data.
  6. ASP.NET Core 沉思录 - 结构化日志
  7. oracle导数卡死,oracle-审计导数
  8. linux8安装ftp服务,CentOS8.0 安装配置ftp服务器的实现方法
  9. TabBar与下拉列表访问数据与刷新
  10. 浏览器兼容:改写window.showModalDialog
  11. 转载:性能计数器分析
  12. windows 任务管理中各个内存项的含义
  13. 自带公网IP上阿里云 | 凌云时刻
  14. 北京地铁和广州地铁之感想
  15. Excel工作表丨使用Excel表格直接添加条码/二维码
  16. 3-19日 游戏工坊博客
  17. 程序员期望月薪那些事儿
  18. 一元二次方程abc决定什么_二次函数中的a,b,c各决定什么?
  19. 名帖84 米芾 小楷《九歌》
  20. WebRTC 报错:Failed to set remote offer sdp: Called with SDP without DTLS fingerprint

热门文章

  1. 光纤跳线接口_如何为10G SFP+光模块搭配对应的光纤跳线类型?
  2. element ui Descriptions 组件无法显示样式 未渲染
  3. python#魔兽游戏#英雄联盟lol#地图
  4. 什么叫断章取义,什么叫曲解——你被骗了多少年?
  5. Http Status 500
  6. 打字教程新手篇-指法练习的重要性和注意事项
  7. 百度主送推送是什么?
  8. 软件项目管理考试指南—By XJTUSE【YJQ】
  9. 概率论 —— 泊松分布和指数分布
  10. chia/xch rpc形式充提生成地址