1. 程式人生 > >一個C語言寫的小遊戲(flappy bird)

一個C語言寫的小遊戲(flappy bird)

最近在看知乎是發現了一個這一個專欄
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; }