小編給大家分享一下C語言怎么實現(xiàn)打飛機(jī)小游戲,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計,平陽網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:平陽等地區(qū)。平陽做網(wǎng)站價格咨詢:13518219792
編譯環(huán)境:vs2019
需求:
在同一個平面內(nèi),控制大炮發(fā)射的三個方向,空格發(fā)射炮彈,敵軍和友軍飛機(jī)會一直隨機(jī)在天上飛過,擊中天上飛行的敵軍飛機(jī)加一分,擊中友軍飛機(jī)減一分
思路:
先初始化程序,再畫出說明和地圖,接著進(jìn)入無限循環(huán),循環(huán)中分別實現(xiàn)飛機(jī)不停地在天上飛、通過awd空格鍵控制游戲內(nèi)容、符合游戲條件時加分三個主要步驟。
做法:
首先要實現(xiàn)飛機(jī)的動畫效果,本質(zhì)是要在控制臺上輸出三條x軸上輸出一個字符串,并要讓這三個字符串看起來在同時移動。這里我借助了寫賭馬大賽的經(jīng)驗:在第一次無限循環(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é),這里不一一贅述。
難點:
看起來讓三個字符串同時移動。這是一種算法,學(xué)會了就應(yīng)該應(yīng)該像記住基礎(chǔ)知識一樣牢牢記住他。明白了原理之后,比較容易掌握。
說明:
這是一個簡單的小程序,實現(xiàn)該程序中相同的效果有著很多種方法,而我則大量地使用了數(shù)組來存放、統(tǒng)計和使用各種不同的數(shù)據(jù),其實類似效果還可以通過單鏈表來實現(xiàn)。在我目前的認(rèn)知中使用數(shù)組和直接輸出字符串的寫法有著簡潔明了的優(yōu)點。但同時也導(dǎo)致出一個顯示效果上比較致命的缺陷。
注意:
由于編譯器原因程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會出現(xià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ī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("累計得分 %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)計信息
{
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)計信息
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ī)的板子,以此來實現(xiàn)類似的效果。
由于該程序出了創(chuàng)意之外,全是由本人靠自己寫的,由于我能力有限,在寫這個程序的同時隱約感覺到我的程序存在著大量代碼復(fù)用性、結(jié)構(gòu)嚴(yán)謹(jǐn)性、運行效率低下上的問題,同時很多函數(shù)和變量標(biāo)識符我采用了瞎寫、中文拼音組成的做法。
作為一名c語言新手,我對未知的知識始終抱有學(xué)習(xí)和謙卑的態(tài)度,如有貴人能夠?qū)ξ业某绦蛱岢鰪?fù)用性、嚴(yán)謹(jǐn)性、運行效率上的建議,我將不勝感激。
以上是“C語言怎么實現(xiàn)打飛機(jī)小游戲”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁名稱:C語言怎么實現(xiàn)打飛機(jī)小游戲
標(biāo)題URL:http://chinadenli.net/article36/gospsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、外貿(mào)建站、App開發(fā)、自適應(yīng)網(wǎng)站、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)