欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)飛機大戰(zhàn)小游戲

 更新時間:2022年06月08日 09:51:32   作者:JysinWee  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)飛機大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

技術原型

1、void gotoxy(int x, int y) 函數(shù),該函數(shù)可以使光標去到(x,y)的位置進行打??;
2、鏈表,用于存儲狀態(tài);
3、windows.h中有非阻塞輸入,_kbhit();
4、隨機生成數(shù);
5、視覺暫留;
6、碰撞檢測;
7、清屏函數(shù);
8、設置邊界;

技術路線

1、設置一個邊界;
2、維護一個子彈的列表;
3、維護一個敵機的列表;
4、初始化飛機的位置;
5、每隔一秒鐘生成一架敵機,生成位置x坐標隨機,坐標為0;
6、設置點擊空格生成子彈;
7、設置while(1)循環(huán),在其中每次進行清屏和更新;
8、每次更新遍歷子彈鏈表,使所有子彈的位置向上移動1;
9、每次更新遍歷敵機鏈表,使所有敵機的位置向下移動1;
10、碰撞檢測,遍歷子彈和敵機列表,發(fā)現(xiàn)碰撞則從各自的鏈表中移除碰撞的節(jié)點;
11、當有敵機碰撞到本機游戲結束;
12、當子彈或者敵機碰撞到邊界,則從鏈表中移除;
13、每次檢測到碰撞加一分。

實現(xiàn)效果

花費時間

約6小時30分鐘

代碼

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


struct node {
?? ?int ?? ??? ??? ?x;
?? ?int?? ??? ??? ??? ?y;
?? ?struct node* ? ?next;
};

typedef struct node ?node_t;
typedef struct node* nodeptr_t;

void gotoxy(int x, int y); //光標定位函數(shù)
void print_plane(int x, int y); //打印飛機
nodeptr_t generate_bullet(nodeptr_t listnode, int x, int y); //生成子彈
void print_bullet(nodeptr_t listnode); //打印子彈
nodeptr_t update_bullet(nodeptr_t listnode); //更新子彈位置
nodeptr_t generate_target(nodeptr_t listnode, int x); //生成敵機
void print_target(nodeptr_t listnode); //打印敵機
nodeptr_t update_target(nodeptr_t listnode); //更新敵機位置
int collision_detection(nodeptr_t bulletlist, nodeptr_t targetlist); //碰撞檢測
bool is_gameover(int x,int y, nodeptr_t targetlist); // 游戲結束
void clear(nodeptr_t bulletlist, nodeptr_t targetlist);


int main() {
?? ?int plane_x = 0, plane_y = 19; //飛機位置
?? ?char control; //輸入
?? ?bool isfire = 0; //是否開火

?? ?nodeptr_t target = nullptr; //敵機鏈表
?? ?target = (nodeptr_t)malloc(sizeof(node_t));
?? ?target->next = nullptr;
?? ?target->x = 0;
?? ?target->y = 0;

?? ?nodeptr_t bullet = nullptr; //子彈鏈表
?? ?bullet = (nodeptr_t)malloc(sizeof(node_t));
?? ?bullet->next = nullptr;
?? ?bullet->x = 0;
?? ?bullet->y = 0;

?? ?int subtime = 0;
?? ?time_t starttime;
?? ?starttime = time(NULL);
?? ?int grade = 0; //分數(shù)
?? ?int targetspeed = 0;
?? ?int bulletspeed = 0;

?? ?while(1)
?? ?{
?? ??? ?system("cls");
?? ??? ?time_t currenttime;
?? ??? ?currenttime = time(NULL);
?? ??? ?//每隔一秒生成一架敵機
?? ??? ?if (currenttime - starttime - subtime > 0)
?? ??? ?{
?? ??? ??? ?srand((unsigned)time(NULL));
?? ??? ??? ?unsigned int target_y = rand() % 14 + 3;
?? ??? ??? ?target = generate_target(target, target_y);
?? ??? ?}
?? ??? ?subtime = currenttime - starttime;
?? ??? ?//開火則生成子彈
?? ??? ?if (isfire)
?? ??? ?{
?? ??? ??? ?bullet = generate_bullet(bullet, plane_x, plane_y - 1);
?? ??? ??? ?isfire = 0;
?? ??? ?}
?? ??? ?//打印敵機
?? ??? ?print_target(target);
?? ??? ?targetspeed++;
?? ??? ?if(targetspeed % 2 == 0)
?? ??? ??? ?target = update_target(target);
?? ??? ?//打印子彈
?? ??? ?print_bullet(bullet);
?? ??? ?bulletspeed++;
?? ??? ?if (bulletspeed % 2 == 0)
?? ??? ??? ?bullet = update_bullet(bullet);
?? ??? ?//碰撞檢測
?? ??? ?grade = grade + collision_detection(bullet, target);
?? ??? ?gotoxy(0, 25);
?? ??? ?printf("SCORE: %d", grade);
?? ??? ?//打印飛機
?? ??? ?print_plane(plane_x, plane_y);
?? ??? ?//敵機本機是否相撞
?? ??? ?bool isgameover = is_gameover(plane_x, plane_y, target);
?? ??? ?//Sleep(100);
?? ??? ?//非阻塞鍵盤輸入
?? ??? ?if (isgameover)
?? ??? ?{
?? ??? ??? ?clear(target, bullet);
?? ??? ??? ?plane_x = 0;
?? ??? ??? ?plane_y = 19;
?? ??? ??? ?isfire = 0;
?? ??? ??? ?system("cls");
?? ??? ??? ?gotoxy(8, 8);
?? ??? ??? ?printf("SCORE: %d", grade);
?? ??? ??? ?gotoxy(8, 9);
?? ??? ??? ?printf("GAME OVER");
?? ??? ??? ?grade = 0;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?if (_kbhit())
?? ??? ?{
?? ??? ??? ?control = _getch();
?? ??? ??? ?if (control == ' ')
?? ??? ??? ??? ?isfire = 1;
?? ??? ??? ?else
?? ??? ??? ??? ?isfire = 0;
?? ??? ??? ?if (control == 'w' && plane_y > 0)
?? ??? ??? ??? ?plane_y--;
?? ??? ??? ?if (control == 's' && plane_y < 20)
?? ??? ??? ??? ?plane_y++;
?? ??? ??? ?if (control == 'a' && plane_x > 0)
?? ??? ??? ??? ?plane_x--;
?? ??? ??? ?if (control == 'd' && plane_x < 20)
?? ??? ??? ??? ?plane_x++;
?? ??? ?}


?? ?}
?? ?return 0;
}

void gotoxy(int x, int y)//光標定位函數(shù)
{
?? ?COORD p;//定義結構體變量p
?? ?HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//獲取當前函數(shù)句柄
?? ?p.X = x;
?? ?p.Y = y;//將光標的目標移動位置傳遞給結構體
?? ?SetConsoleCursorPosition(handle, p);//移動光標
?? ?return;
}

void print_plane(int x, int y) //打印飛機
{
?? ?if (x == 0)
?? ?{
?? ??? ?gotoxy(x, y);
?? ??? ?printf("*");
?? ??? ?gotoxy(x, y + 1);
?? ??? ?printf("***");
?? ??? ?gotoxy(x, y + 2);
?? ??? ?printf(" *");
?? ?}
?? ?else if (x == 1)
?? ?{
?? ??? ?gotoxy(x, y);
?? ??? ?printf("*");
?? ??? ?gotoxy(x-1, y + 1);
?? ??? ?printf("****");
?? ??? ?gotoxy(x-1, y + 2);
?? ??? ?printf("* *");
?? ?}
?? ?else if (x == 20)
?? ?{
?? ??? ?gotoxy(x, y);
?? ??? ?printf("*");
?? ??? ?gotoxy(x - 2, y + 1);
?? ??? ?printf("***");
?? ??? ?gotoxy(x - 1, y + 2);
?? ??? ?printf("* ");
?? ?}
?? ?else if (x == 19)
?? ?{
?? ??? ?gotoxy(x, y);
?? ??? ?printf("*");
?? ??? ?gotoxy(x - 2, y + 1);
?? ??? ?printf("****");
?? ??? ?gotoxy(x - 1, y + 2);
?? ??? ?printf("* *");
?? ?}
?? ?else
?? ?{
?? ??? ?gotoxy(x, y);
?? ??? ?printf("*");
?? ??? ?gotoxy(x - 2, y + 1);
?? ??? ?printf("*****");
?? ??? ?gotoxy(x - 1, y + 2);
?? ??? ?printf("* *");
?? ?}
?? ?return;
}

nodeptr_t generate_bullet(nodeptr_t listnode, int x, int y)
{
?? ?nodeptr_t newbullet = nullptr; //子彈鏈表
?? ?newbullet = (nodeptr_t)malloc(sizeof(node_t));
?? ?newbullet->next = listnode->next;
?? ?newbullet->x = x;
?? ?newbullet->y = y;
?? ?listnode->next = newbullet;
?? ?return listnode;
}

void print_bullet(nodeptr_t listnode)
{
?? ?nodeptr_t templist = listnode;
?? ?while (templist->next != nullptr)
?? ?{
?? ??? ?gotoxy((templist->next->x), templist->next->y);
?? ??? ?printf("|");
?? ??? ?templist = templist->next;
?? ?}
?? ?return;
}

nodeptr_t update_bullet(nodeptr_t listnode)
{
?? ?nodeptr_t templist = listnode;
?? ?while (templist->next != nullptr)
?? ?{
?? ??? ?if (templist->next->y > 0)
?? ??? ??? ?(templist->next->y)--;
?? ??? ?else
?? ??? ?{
?? ??? ??? ?nodeptr_t tempnode = templist->next;
?? ??? ??? ?templist->next = tempnode->next;
?? ??? ??? ?tempnode->next = nullptr;
?? ??? ??? ?free(tempnode);
?? ??? ?}
?? ??? ?if (templist->next != nullptr)
?? ??? ??? ?templist = templist->next;
?? ??? ?else
?? ??? ??? ?break;
?? ?}
?? ?return listnode;
}

nodeptr_t generate_target(nodeptr_t listnode, int x)
{
?? ?nodeptr_t newtarget = nullptr; //子彈鏈表
?? ?newtarget = (nodeptr_t)malloc(sizeof(node_t));
?? ?newtarget->next = listnode->next;
?? ?newtarget->x = x;
?? ?newtarget->y = 0;
?? ?listnode->next = newtarget;
?? ?return listnode;
}

void print_target(nodeptr_t listnode)
{
?? ?nodeptr_t templist = listnode;
?? ?while(templist->next != nullptr)
?? ?{
?? ??? ?gotoxy(templist->next->x, templist->next->y);
?? ??? ?printf("+");
?? ??? ?templist = templist->next;
?? ?}
?? ?return;
}

nodeptr_t update_target(nodeptr_t listnode)
{
?? ?nodeptr_t templist = listnode;
?? ?while (templist->next != nullptr)
?? ?{
?? ??? ?if (templist->next->y < 21)
?? ??? ??? ?(templist->next->y)++;
?? ??? ?else
?? ??? ?{
?? ??? ??? ?nodeptr_t tempnode = templist->next;
?? ??? ??? ?templist->next = tempnode->next;
?? ??? ??? ?tempnode->next = nullptr;
?? ??? ??? ?free(tempnode);
?? ??? ?}
?? ??? ?if (templist->next != nullptr)
?? ??? ??? ?templist = templist->next;
?? ??? ?else
?? ??? ??? ?break;
?? ?}
?? ?return listnode;
}

int collision_detection(nodeptr_t bulletlist, nodeptr_t targetlist)
{
?? ?int grade = 0;
?? ?nodeptr_t tempbulletlist = bulletlist;
??? ?while(tempbulletlist->next != nullptr)
??? ?{
?? ??? ?nodeptr_t temptargetlist = targetlist;
??? ??? ?while(temptargetlist->next != nullptr) ?
??? ??? ?{
?? ??? ??? ?
??? ??? ??? ?if(temptargetlist->next->x == (tempbulletlist->next->x) && temptargetlist->next->y > tempbulletlist->next->y)
??? ??? ??? ?{
? ? ??? ??? ??? ?nodeptr_t tempnode = temptargetlist->next;
?? ??? ??? ??? ?temptargetlist->next = tempnode->next;
?? ??? ??? ??? ?tempnode->next = nullptr;
?? ??? ??? ??? ?free(tempnode);

?? ??? ??? ??? ?tempnode = tempbulletlist->next;
?? ??? ??? ??? ?tempbulletlist->next = tempnode->next;
?? ??? ??? ??? ?tempnode->next = nullptr;

??? ??? ??? ??? ?free(tempnode);
?? ??? ??? ??? ?grade++;
?? ??? ??? ??? ?break;

??? ??? ??? ?}
?? ??? ??? ?if (temptargetlist->next != nullptr)
?? ??? ??? ??? ?temptargetlist = temptargetlist->next;
?? ??? ??? ?else
?? ??? ??? ??? ?break;
??? ??? ?}
?? ??? ?if (tempbulletlist->next != nullptr)
?? ??? ??? ?tempbulletlist = tempbulletlist->next;
?? ??? ?else
?? ??? ??? ?break;
??? ?}
?? ?return grade;
}

?bool is_gameover(int x, int y, nodeptr_t targetlist)
?{
?? ? nodeptr_t temptargetlist = targetlist;
?? ? while (temptargetlist->next != nullptr)
?? ? {
?? ??? ? int tempsub = abs((temptargetlist->next->x) - x);
?? ??? ? if (tempsub == 0 && temptargetlist->next->y > y)
?? ??? ? {
?? ??? ??? ? return 1;
?? ??? ? }
?? ??? ? else if(tempsub == 1 && temptargetlist->next->y > y + 1)
?? ??? ? {
?? ??? ??? ? return 1;
?? ??? ? }
?? ??? ? else if (tempsub == 2 && temptargetlist->next->y > y + 1)
?? ??? ? {
?? ??? ??? ? return 1;
?? ??? ? }
?? ??? ? temptargetlist = temptargetlist->next;
?? ? }
?? ? return 0;
?}

?void clear(nodeptr_t bulletlist, nodeptr_t targetlist)
?{
?? ? while (bulletlist->next != nullptr)
?? ? {
?? ??? ? nodeptr_t temp = bulletlist->next;
?? ??? ? bulletlist->next = temp->next;
?? ??? ? //temp->next = nullptr;
?? ??? ? free(temp);
?? ? }
?? ? while (targetlist->next != nullptr)
?? ? {
?? ??? ? nodeptr_t temp = targetlist->next;
?? ??? ? targetlist->next = temp->next;
?? ??? ? //temp->next = nullptr;
?? ??? ? free(temp);
?? ? }
?? ? return;
?}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C語言執(zhí)行時,程序控制臺輸出窗口 一閃而過問題及解決

    C語言執(zhí)行時,程序控制臺輸出窗口 一閃而過問題及解決

    這篇文章主要介紹了C語言執(zhí)行時,程序控制臺輸出窗口 一閃而過問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Visual Studio Code (VSCode) 配置搭建 C/C++ 開發(fā)編譯環(huán)境的流程

    Visual Studio Code (VSCode) 配置搭建 C/C++ 開發(fā)編譯環(huán)境的流程

    記得N年前剛開始接觸編程時,使用的是Visual C++6.0,下面這個可愛的圖標很多人一定很熟悉。不過今天想嘗鮮新的工具 Visual Studio Code 來搭建C/C++開發(fā)環(huán)境,感興趣的朋友一起看看吧
    2021-09-09
  • c++ vector造成的內存泄漏問題

    c++ vector造成的內存泄漏問題

    這篇文章主要介紹了c++ vector造成的內存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解C語言內核字符串拷貝與比較

    詳解C語言內核字符串拷貝與比較

    本文將探索一下字符串的拷貝與比較,與應用層不同內核字符串拷貝與比較也需要使用內核專用的API函數(shù),字符串的拷貝往往伴隨有內核內存分配,我們將首先簡單介紹內核如何分配堆空間,然后再以此為契機簡介字符串的拷貝與比較
    2022-09-09
  • 一波二叉樹遍歷問題的C++解答實例分享

    一波二叉樹遍歷問題的C++解答實例分享

    這篇文章主要介紹了一波二叉樹遍歷問題的C++解答實例分享,包括節(jié)點打印和轉換為鏡像等問題的解答,需要的朋友可以參考下
    2016-02-02
  • 詳解C++ bitset用法

    詳解C++ bitset用法

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 基于C語言實現(xiàn)泛型編程詳解

    基于C語言實現(xiàn)泛型編程詳解

    對于C而言,想實現(xiàn)泛型編程并非易事,甚至可以說非常繁瑣,一大堆坑。最主要也沒有現(xiàn)成的輪子可用。本文就來詳細為大家講講C語言如何實現(xiàn)泛型編程詳解,需要的可以參考一下
    2022-07-07
  • Linux環(huán)境下段錯誤的產生原因及調試方法小結

    Linux環(huán)境下段錯誤的產生原因及調試方法小結

    借此機會系統(tǒng)學習了一下,這里對Linux環(huán)境下的段錯誤做個小結,方便以后同類問題的排查與解決
    2011-11-11
  • C語言實現(xiàn)CRC校驗算法的示例詳解

    C語言實現(xiàn)CRC校驗算法的示例詳解

    CRC(Cyclic Redundancy Check,循環(huán)冗余校驗)是一種常用的錯誤檢測技術,用于驗證數(shù)據(jù)在傳輸或存儲過程中是否發(fā)生了錯誤,本文主要介紹了C語言如何實現(xiàn)CRC校驗算法,需要的可以參考一下
    2023-08-08
  • C++鏈式二叉樹深入分析

    C++鏈式二叉樹深入分析

    二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。通常的方法是鏈表中每個結點由三個域組成,數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址
    2022-06-06

最新評論