最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)打飛機(jī)小游戲

 更新時間:2020年02月25日 07:46:11   作者:白家名  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單的打飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)打飛機(jī)小游戲的具體代碼,供大家參考,具體內(nèi)容如下

編譯環(huán)境:vs2019

需求:

在同一個平面內(nèi),控制大炮發(fā)射的三個方向,空格發(fā)射炮彈,敵軍和友軍飛機(jī)會一直隨機(jī)在天上飛過,擊中天上飛行的敵軍飛機(jī)加一分,擊中友軍飛機(jī)減一分

思路:

先初始化程序,再畫出說明和地圖,接著進(jìn)入無限循環(huán),循環(huán)中分別實(shí)現(xiàn)飛機(jī)不停地在天上飛、通過awd空格鍵控制游戲內(nèi)容、符合游戲條件時加分三個主要步驟。

做法:

首先要實(shí)現(xiàn)飛機(jī)的動畫效果,本質(zhì)是要在控制臺上輸出三條x軸上輸出一個字符串,并要讓這三個字符串看起來在同時移動。這里我借助了寫賭馬大賽的經(jīng)驗(yàn):在第一次無限循環(huán)內(nèi)分別循環(huán)輸出第1、2、3條的字符串表示走出第一步,然后再自增三個字符串x軸坐標(biāo)數(shù)值,第二次無限循環(huán)清除上一次字符串移動痕跡,并再分別輸出三條字符串,表示走出第二步。由于內(nèi)層for循環(huán)沒有休眠函數(shù),這樣看起來就是三個字符串同時移動的效果。這樣就可以通過無限循環(huán)表示三架飛機(jī)不停地移動了。
接下來是通過getch函數(shù)改變大炮炮口指向方向(一個字符),在炮口指向切換的同時,炮彈初始化的位置也同樣會改變,當(dāng)按下空格時,炮彈(一個字符)會從他的初始化位置沿設(shè)定好的路線不停移動,當(dāng)橫縱軸坐標(biāo)與飛機(jī)坐標(biāo)相匹配時判斷是否為敵軍飛機(jī)|—0>,是則得分加一,否則得分減一。
此外程序里還有很多細(xì)節(jié),這里不一一贅述。

難點(diǎn):

看起來讓三個字符串同時移動。這是一種算法,學(xué)會了就應(yīng)該應(yīng)該像記住基礎(chǔ)知識一樣牢牢記住他。明白了原理之后,比較容易掌握。

說明:

這是一個簡單的小程序,實(shí)現(xiàn)該程序中相同的效果有著很多種方法,而我則大量地使用了數(shù)組來存放、統(tǒng)計(jì)和使用各種不同的數(shù)據(jù),其實(shí)類似效果還可以通過單鏈表來實(shí)現(xiàn)。在我目前的認(rèn)知中使用數(shù)組和直接輸出字符串的寫法有著簡潔明了的優(yōu)點(diǎn)。但同時也導(dǎo)致出一個顯示效果上比較致命的缺陷。

注意:

由于編譯器原因程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會出現(xiàn)錯誤,解決辦法是去掉函數(shù)前面的 “_”。

運(yùn)行效果:

代碼實(shí)現(xiàn):

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>


void HideCursor();  //隱藏光標(biāo)
void gotoxy(int x, int y); //光標(biāo)定位

#define R 26  //飛機(jī)每次隨機(jī)尾x坐標(biāo)最大值
#define N 20  //通關(guān)分?jǐn)?shù)

int ax[3] = { 0 };  //三個飛機(jī)尾坐標(biāo),全局
int y[3] = { 3,7,11 }; //三個y軸,全局,查表法確定飛機(jī)的y軸位置 
    //因?yàn)榕趶椀娘w行距離是一次加兩個格子,為了奇偶對應(yīng)這里的y軸必須都是偶數(shù)
int i;   //循環(huán)用變量
int fd[3];   //控制飛機(jī)種類

void cshcxhs()    //初始化函數(shù)
{
 system("title 打飛機(jī)小游戲");  //標(biāo)題
 system("mode con cols=100 lines=30"); //寬100,高30
 HideCursor();    //光標(biāo)隱藏

 gotoxy(46, 12);    //介紹游戲規(guī)則
 printf("游戲規(guī)則:");
 gotoxy(36, 14);
 printf("w a d鍵控制方向,空格鍵發(fā)射炮彈");
 gotoxy(26, 16);
 printf("擊中敵軍飛機(jī) |---0> 加一分,擊中友軍飛機(jī) >>>>>> 減一分");
 gotoxy(40, 18);
 printf("累計(jì)得分 %d 結(jié)束游戲",N);
 Sleep(2800);

 system("cls");
 
 int k;     //循環(huán)用變量
 gotoxy(40, R);    //初始化炮臺
 for (k = 0; k < 17; k++)
 printf("_");

 gotoxy(46, R);
 printf("[_O_]");
 gotoxy(48, 25);    //中間x:48
 printf("|");

 int j;
 srand((unsigned)time(NULL));  //初始化隨機(jī)種子
 for (j = 0; j < 3; j++)   //初始化飛機(jī)的初始x坐標(biāo),寫在循環(huán)之外
 {
 ax[j] = rand() % R;
 fd[j] = rand() % 2;
 }

 gotoxy(0, R);
 printf(" 得分:");   //分?jǐn)?shù)x坐標(biāo)9
}

void hcfjhs()   //畫出飛機(jī)函數(shù)
{
 gotoxy(ax[i], y[i]);  //首先在飛機(jī)尾處輸出整架飛機(jī)

 if (fd[i] == 1)  
 printf("|---0>"); 
 else    
 printf(">>>>>>"); 

 gotoxy(ax[i] - 1, y[i]); //清除飛機(jī)尾部留下的痕跡
 printf(" ");

 ax[i]++;   //然后飛機(jī)尾坐標(biāo)自增,下次自飛機(jī)尾輸出整架飛機(jī)
}

void dhpdxshs()   //畫出飛機(jī),并讓飛機(jī)在飛過x94的時候消失
{
 for (i = 0; i < 3; i++)  //每架飛機(jī)都走一步
 {
 hcfjhs();

 if (ax[i] + 6 >= 94) //判斷每架飛機(jī)頭有沒有超過94
 {
  gotoxy(94, y[i]); //滿足條件在每架飛機(jī)的94處輸出空格
  printf(" ");
  if (ax[i]+6 > 100) //每架飛機(jī)的飛機(jī)頭超過100,則重置一個隨機(jī)數(shù)
  {
  ax[i] = rand() % R; //修改為小于R的隨機(jī)數(shù)
  fd[i] = rand() % 2;
  }
 }
 }
}

int da = 2;  //da = 1為最左 默認(rèn)中間 炮臺方向,全局變量
int yip = 0;  //是否開炮,0不開,1,2,3三個方向
int rtde = 1;  //是否發(fā)射完畢,必須等待炮彈發(fā)射完成


int shells_x;  //炮彈坐標(biāo)
int shells_y;

void ckkzhs()
{
 char ch;
 ch = _getch();

 if (ch == 'd' || ch == 'D')
 {
 gotoxy(49, 25);
 printf("/");  //炮臺右轉(zhuǎn)
 gotoxy(47, 25);
 printf(" ");
 da = 3;   //最右狀態(tài)
 }
 if (ch == 'A' || ch == 'a')
 {
 gotoxy(47, 25);
 printf("\\");  //轉(zhuǎn)義轉(zhuǎn)義字符
 gotoxy(48, 25);
 printf(" ");
 da = 1;   //最左狀態(tài)
 }
 if (ch == 'W' || ch == 'w')
 {
 gotoxy(48, 25);
 printf("|");  
 gotoxy(47, 25);
 printf(" ");
 gotoxy(49, 25);
 printf(" ");
 da = 2;
 }

 if (ch == ' '&& rtde == 0) //大炮處于發(fā)射完畢狀態(tài),且按下空格
 {
 if (da == 2)  //中 炮臺朝向
  yip = 2;
 
 if (da == 1)  //左
 {
  yip = 1;
  shells_x = 45;  //初始化炮彈的坐標(biāo)
 }
 if (da == 3)  //右
 {
  yip = 3;
  shells_x = 51;
 }
 shells_y = 23;  //初始化炮彈的坐標(biāo)
 }
}

void dpfshs()   //向三個不同方向發(fā)射炮彈
{
 rtde = 1;   //循環(huán),炮彈移動時代表未開炮完畢
 if (yip == 2)
 {
 shells_x = 48;
 gotoxy(shells_x, shells_y-=2);
 printf("o");
 gotoxy(shells_x, shells_y+2);
 printf(" ");
 }
 if (yip == 1)
 {
 gotoxy(shells_x-=2, shells_y-=2);
 printf("o");
 gotoxy(shells_x+2, shells_y+2);
 printf(" ");
 }
 if (yip == 3)
 {
 gotoxy(shells_x+=2, shells_y-=2);
 printf("o");
 gotoxy(shells_x-2, shells_y+2);
 printf(" ");
 }

 if (shells_y <= 1)  //炮彈越界,消除炮彈
 {
 yip = 0;  //炮彈越界,炮彈停下
 gotoxy(48, 1);  //并消除
 printf(" ");
 gotoxy(23, 1);
 printf(" ");
 gotoxy(73, 1);
 printf(" "); 
 rtde = 0;  //炮彈越界,開炮完畢,可進(jìn)行下一輪開炮
 }
}

int score;   //得分

void pdfsjzhs()  //判斷是否擊中和統(tǒng)計(jì)信息
{
 
 for (i = 0; i < 3; i++)
 {
  if (shells_x >= ax[i] && shells_x <= ax[i] + 6 && shells_y == y[i])//擊中時
  {
  if(fd[i]==1)
   score++;   //擊中一次,得分加一
  else
  {
   score--;
   if (score <= 0)
   score = 0;
  }

  rtde = 0;   //擊中時,開炮完成

  gotoxy(ax[i]-1, y[i]);  //擊中后,在原飛機(jī)尾巴處消除飛機(jī)
  printf(" ");

  ax[i] = rand() % R;  //修改為小于10的隨機(jī)數(shù)
  fd[i] = rand() % 2;  //飛機(jī)種類發(fā)生變化

  gotoxy(shells_x, shells_y); //在擊中飛機(jī)的地方輸出空格消除炮彈尸體
  printf(" ");

  shells_x = 0, shells_y = 0; //炮彈擊中飛機(jī),炮彈越界,下一次空格將自動初始化炮彈
  }
 }
 
 gotoxy(9, R);
 printf("%d",score);

 if (score >= N)  //游戲結(jié)束判斷
 {
 system("cls"); //清屏
 gotoxy(39,15); 
 printf("您通關(guān)了,最終得分:%d !", N);
 gotoxy(0, 29);
 exit(0);
 }

}

void process()  //流程
{
 while (1)
 {
 dhpdxshs();  //飛機(jī)動畫函數(shù)

 if (_kbhit()) 
 {
  ckkzhs(); //操作函數(shù)
 }
 
 dpfshs();  //大炮效果函數(shù)
 pdfsjzhs();  //判斷是否擊中和統(tǒng)計(jì)信息

 Sleep(18);
 }
}

int main()
{
 cshcxhs(); //初始化程序

 process(); //流程

 return 0;
}

void HideCursor()
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y)
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

不足之處:

我在程序中輸出飛機(jī)時使用了在飛機(jī)尾直接輸出整架飛機(jī),飛機(jī)尾x坐標(biāo)自增的寫法,這是一種很笨但又很簡單的做法。這種做法導(dǎo)致飛機(jī)在飛過控制臺最大寬度的同時無法逐個消除飛機(jī)機(jī)身,飛機(jī)頭一旦越過控制臺最大寬度就會出現(xiàn)程序輸出錯誤,所以我為了保留“讓飛機(jī)逐節(jié)身體地飛出邊界”這個讓飛機(jī)消失時看起來比較自然的效果,只好用最后飛機(jī)所在y軸最后6個x軸格子作為遮擋飛機(jī)的板子,以此來實(shí)現(xiàn)類似的效果。

由于該程序出了創(chuàng)意之外,全是由本人靠自己寫的,由于我能力有限,在寫這個程序的同時隱約感覺到我的程序存在著大量代碼復(fù)用性、結(jié)構(gòu)嚴(yán)謹(jǐn)性、運(yùn)行效率低下上的問題,同時很多函數(shù)和變量標(biāo)識符我采用了瞎寫、中文拼音組成的做法。

作為一名c語言新手,我對未知的知識始終抱有學(xué)習(xí)和謙卑的態(tài)度,如有貴人能夠?qū)ξ业某绦蛱岢鰪?fù)用性、嚴(yán)謹(jǐn)性、運(yùn)行效率上的建議,我將不勝感激。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ Primer 多維數(shù)組的使用

    C++ Primer 多維數(shù)組的使用

    本文主要介紹了多維數(shù)組在C++語言中的定義、初始化、下標(biāo)引用以及使用范圍for語句處理多維數(shù)組的方法,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 深入解析Linux下\r\n的問題

    深入解析Linux下\r\n的問題

    本篇文章是對Linux下\r\n的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入了解C++異常處理

    深入了解C++異常處理

    任何東西都可以認(rèn)為是異常,錯誤只是異常的一種。本文將帶大家了解C++中異常是什么,是如何捕獲和處理的等相關(guān)知識。文中示例代碼簡潔易懂,感興趣的小伙伴可以了解一下
    2021-12-12
  • C指針原理教程之C指針基礎(chǔ)

    C指針原理教程之C指針基礎(chǔ)

    指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址。要搞清一個指針需要搞清指針的四方面的內(nèi)容:指針的類型、指針?biāo)赶虻念愋?、指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)、指針本身所占據(jù)的內(nèi)存區(qū)。
    2019-02-02
  • QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實(shí)例

    QT網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實(shí)例

    下面小編就為大家?guī)硪黄猀T網(wǎng)絡(luò)編程Tcp下C/S架構(gòu)的即時通信實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • C++強(qiáng)制類型轉(zhuǎn)換的四種方式

    C++強(qiáng)制類型轉(zhuǎn)換的四種方式

    本文主要介紹了C++強(qiáng)制類型轉(zhuǎn)換的四種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++的命名空間詳解

    C++的命名空間詳解

    這篇文章主要介紹了C++編程中的命名空間基本知識講解,包括對C++中內(nèi)聯(lián)命名空間新特性的介紹,需要的朋友可以參考下
    2021-09-09
  • C++基本用法實(shí)踐之模板詳解

    C++基本用法實(shí)踐之模板詳解

    C++的模板是泛型編程思想的一種實(shí)現(xiàn),模板不光支持函數(shù)模板,還有類模板等,本文主要來和大家聊聊C++中模板的相關(guān)用法,需要的可以參考一下
    2023-07-07
  • C++?引用與內(nèi)聯(lián)函數(shù)詳情

    C++?引用與內(nèi)聯(lián)函數(shù)詳情

    這篇文章主要介紹了C++?引用與內(nèi)聯(lián)函數(shù)詳情,主要分享一下關(guān)于引用的知識點(diǎn),這里都是一些比較基礎(chǔ)的知識,適合初學(xué)者,下文續(xù)航徐介紹需要的小伙伴可以參考一下
    2022-05-05
  • C++編程中逗號運(yùn)算符和條件運(yùn)算符的使用方法講解

    C++編程中逗號運(yùn)算符和條件運(yùn)算符的使用方法講解

    這篇文章主要介紹了C++編程中逗號運(yùn)算符和條件運(yùn)算符的使用方法講解,需要的朋友可以參考下
    2016-01-01

最新評論

嫩江县| 昌吉市| 沙坪坝区| 南安市| 哈巴河县| 墨脱县| 寻甸| 都匀市| 横峰县| 包头市| 东光县| 崇仁县| 进贤县| 昂仁县| 万源市| 邻水| 和田县| 太谷县| 丰原市| 留坝县| 宜春市| 迭部县| 叶城县| 安溪县| 新源县| 阳城县| 抚松县| 顺义区| 子洲县| 花莲市| 锡林浩特市| 东乌珠穆沁旗| 康平县| 三门峡市| 崇州市| 高陵县| 视频| 成都市| 镇赉县| 衡山县| 河东区|