一個C語言寫的小遊戲(flappy bird)
阿新 • • 發佈:2019-02-13
最近在看知乎是發現了一個這一個專欄
https://zhuanlan.zhihu.com/c2game
從中獲取的許多知識,本文中的遊戲也是從裡面學到的,不過本人又自己加了一些功能。
這是類似於手機上曾經熱門的一個手機遊戲,本人能力有限這兩天還沒搞出影象庫的檔案,下次爭取做一個圖形互動的小遊戲。
這個遊戲主要運用了一些簡單的C語言不過有一個清屏函式和一個去除游標的函式(看不懂沒關係,直接拿來用就可以了,就當一個輪子來使用,其實這兩個函式我也看不懂,但知道他們的功效就行了,但也要注意他們帶來的其他左右,不然可能就會有bug)
遊戲的圖片如下
這裡面的柱子也可以根據自己的需求來加大加粗,不過我這兩天忙著準備比賽,也就沒閒心再搞這些了,
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#define MAX 100
int high,width;//地圖高度與寬度
int bird_x,bird_y;//小鳥的位置
int through,wall;//通道的x座標和牆的起始座標y
int map[MAX][MAX];//記錄頁面的顯示
/*0代表空白,1代表小鳥的位置,2代表牆
3代表上下圍牆,4代表左右圍牆*/
bool book[MAX][MAX];//代表改點有圍牆
int score;//記錄得分
bool result = 0;//遊戲結果1代表失敗,0代表勝利,不過永遠贏不了~~
void startup()
{
score = 0;
high = 20;
width = 50;
bird_x = high/2;
bird_y = width/4;
through = high/2;
wall = width/4*3;
}
void startMap()
{
int i,j;
for(i=1;i<=high-1;i++)
{
map [i][1] = 4;
for(j=2;j<=width-1;j++)
map[i][j] = 0;
map[i][width] = 4;
}
//下方圍牆的初始化
i = high;
for(j=1;j<=width;j++)
map[i][j] = 3;
//小鳥位置的初始化
map[bird_x][bird_y] = 1;
//牆的初始化
for(i=1;i<=high-1;i++)
{
map[i][wall] = 2;
book[i][wall] = 1;
}
//通道的初始化
for(i=through-2;i<=through+2;i++)//通道的大小可以自定義.
{
map[i][wall] = 0;
book[i][wall] = 0;
}
}
void HideCursor()//隱藏游標
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x,int y)//清理一部分螢幕
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
void UPdatewithOutinput()//與輸入無關的更新
{
bird_x++;
wall--;
if(book[bird_x][bird_y] == 1 || bird_x > high)//當小鳥死亡時
{
result = 1;
}
if(wall == bird_y-1)//當小鳥走過牆時得一分
score++;
if(wall < 1)
{
srand(time(NULL));
through = rand() % high;
while(through <= 3 || through >= high-2)
{
through = rand() % high;
}
}
if(wall < 1)
{
wall = width/4*3;
}
memset(book,0,sizeof(book));
Sleep(100);
}
void UPdatewithinput()
{
char input;
if(kbhit())//判斷是否有鍵盤輸入
{
input = getch();
if(input == ' ')
bird_x -= 2;//小鳥向上蹦兩格
}
}
void show()
{
gotoxy(0,0);
int i,j;
for(i=1;i<=high;i++)
{
for(j=1;j<=width;j++)
{
switch(map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("@");
break;
case 2:
printf("*");
break;
case 3:
printf("~");
break;
case 4:
printf("|");
break;
}
}
printf("\n");
}
printf("你的分數是:%d\n\n",score);
printf("操作說明:空格鍵向上移動\n");
}
int main(void)
{
startup();
while(1)
{
HideCursor();
startMap();
show();
UPdatewithOutinput();
if(result == 1)
break;
UPdatewithinput();
}
system("cls");
printf("你輸了");
getchar();
getchar();
return 0;
}