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

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

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

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

技術(shù)原型

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

技術(shù)路線

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

實(shí)現(xiàn)效果

花費(fèi)時(shí)間

約6小時(shí)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); //光標(biāo)定位函數(shù)
void print_plane(int x, int y); //打印飛機(jī)
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); //生成敵機(jī)
void print_target(nodeptr_t listnode); //打印敵機(jī)
nodeptr_t update_target(nodeptr_t listnode); //更新敵機(jī)位置
int collision_detection(nodeptr_t bulletlist, nodeptr_t targetlist); //碰撞檢測
bool is_gameover(int x,int y, nodeptr_t targetlist); // 游戲結(jié)束
void clear(nodeptr_t bulletlist, nodeptr_t targetlist);


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

?? ?nodeptr_t target = nullptr; //敵機(jī)鏈表
?? ?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; //分?jǐn)?shù)
?? ?int targetspeed = 0;
?? ?int bulletspeed = 0;

?? ?while(1)
?? ?{
?? ??? ?system("cls");
?? ??? ?time_t currenttime;
?? ??? ?currenttime = time(NULL);
?? ??? ?//每隔一秒生成一架敵機(jī)
?? ??? ?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;
?? ??? ?}
?? ??? ?//打印敵機(jī)
?? ??? ?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);
?? ??? ?//打印飛機(jī)
?? ??? ?print_plane(plane_x, plane_y);
?? ??? ?//敵機(jī)本機(jī)是否相撞
?? ??? ?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)//光標(biāo)定位函數(shù)
{
?? ?COORD p;//定義結(jié)構(gòu)體變量p
?? ?HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//獲取當(dāng)前函數(shù)句柄
?? ?p.X = x;
?? ?p.Y = y;//將光標(biāo)的目標(biāo)移動位置傳遞給結(jié)構(gòu)體
?? ?SetConsoleCursorPosition(handle, p);//移動光標(biāo)
?? ?return;
}

void print_plane(int x, int y) //打印飛機(jī)
{
?? ?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;
?}

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

相關(guān)文章

最新評論