C语言简易版flappy bird小游戏

假期在家无聊,想随便码点东西,故有此简陋的小游戏诞生。觉着可能对初学C语言的小伙伴练习有点帮助,故写此博客。游戏界面如下:

首先,先画出整个小游戏实现的流程图,如下:

思路很简单,整个游戏界面是由一个大的char类型数组构成,更新数组的值然后不停的打印出来就形成了动态效果。

由上图看,大循环是保证游戏一直不断的进行下去,小循环是让小鸟的速度大于游戏界面里背景(由#构成的柱子)的速度(小鸟动四下柱子才动一下)。

下面是具体代码(水平有限大家多多见谅,但是效果还是有的!)

Bird.c文件

#include <stdio.h>
#include <windows.h>
#include "Interface.h"

int main(void)
{
 InitialInterface();
 for(;;)
 {
  newinterface();
  scoring();//过一个柱子计一次分,所以和柱子更新速度一致
  for (int i = 0; i < 4; i++)//小鸟的速度是柱子的4倍
  {
   birdmove();
   draw();
   Sleep(50);
  }
 }
 return 0;
}

Interface.h文件

#ifndef INTERFACE_H
#define INTERFACE_H

#define M 20
#define N 36

void InitialInterface(void);
void newinterface(void);
void birdmove(void);
void scoring(void);
void draw(void);

#endif

Interface.c文件

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include "interface.h"

char interf[M][N] = {{ 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },
     { 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32 },
     { 38,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },
     { 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 },
     { 32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35,32,32,32,32,32,32,32,32,32,32,35,35 }, };
//初始界面矩阵,ASCII码中“ ”是32,“&”是38表示小鸟,“#”是35用来画柱子

int num = 0;//用于计数输出并排两列黑柱子同一位置
int black;//黑方块位置
int p= M/2 ;//小鸟初始位置
int score = 0;//分数

/*初始化界面*/
void InitialInterface(void)
{
  printf("\n   作者:xhyang,博客地址:http://blog.csdn.net/weixin_39449570\n");
  printf("   按\"w\"使小鸟跳起来,别落地,顺利穿过尽可能多的柱子!\n");
  for (int i = 0; i < M; i++)
  {
   printf("   ");
   for (int j = 0; j < N; j++)
   {
    printf("%c", interf[i][j]);
   }
   printf("\n");
  }
}

/*更新界面各个柱子*/
void newinterface(void)
{

 if (interf[0][1] == 35 && num==0)//当矩阵第二列为黑色方块时,计算出下一次黑柱子上半部分的位置
 {
  black = 5 + rand() % 5;
  num = 2;//黑柱子是两列#组成,第二列与第一列位置一样,用num保证两列位置一致
 }
 for (int i = 0; i < M; i++)
 {

  for (int j = 0; j < N - 1; j++)
  {
   interf[i][j] = interf[i][j + 1];
  }
  if (interf[0][0] == 35 && (i < black || i>(black + 5)))//此时上面的第二列变成了第一列,更新下一个黑柱子,有了黑柱子上半部分位置+5即是下半部分的起始位置
  {
   interf[i][N-1] = 35;
  }
  else
  {
   interf[i][N-1] = 32;
  }
 }
 if (num > 0)
  num--;
}

/*更新小鸟位置*/
void birdmove(void)
{
 for (int a = 0; a < 3; a++)
 {
  if (a == 2 && p > 0)//减缓鸟的速度,使按键上跳速度是下落的4倍
  {
   p = p + 1;
  }
  if (_kbhit())
  {
   if (_getch() == 'w' || _getch() == 'W')
   {
    p = p - 3;
   }
  }
 }
}

/*计分*/
void scoring(void)
{
 if (p > 20 || interf[p][0] == 35)
 {
  system("cls");
  printf("\n\n   游戏结束!\n\n");
  printf("   最终得分:%d\n\n\n", score);
  system("pause");
 }

 if (interf[0][0] == 35 && interf[0][1] == 32 )
  score++;
}

/*重画界面*/
void draw(void)
{
 system("cls");
 printf("\n   作者:xhyang,博客地址:http://blog.csdn.net/weixin_39449570\n");
 printf("   按\"w\"使小鸟跳起来,别落地,顺利穿过尽可能多的柱子!\n");
 for (int i = 0; i < M; i++)
 {
  printf("   ");
  for (int j = 0; j < N; j++)
  {
   if (i == p && j == 0 && interf[p][0] != 35)
    printf("%c", 38);
   else
    printf("%c", interf[i][j]);
  }
  printf("\n");

 }
 printf("   得分:%d \n", score);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言如何在指针中隐藏数据详解

    前言 编写 C 语言代码时,指针无处不在.我们可以稍微额外利用指针,在它们内部暗中存储一些额外信息.为实现这一技巧,我们利用了数据在内存中的自然对齐特性. 内存中的数据并非保存在任意地址.处理器通常按照其字大小相同的块读取内存数据:那么考虑到效率因素,编译器会按照块大小的整数倍对内存中的实体进行地址对齐.因此在 32 位的处理器上,一个 4 字节整型数据肯定存放在内存地址能被4整除的地方. 下面,假设系统中整型数据和指针大小均为 4 字节. 现在有一个指向整型的指针.如上所述,整型数据可以存放在

  • 如何写出优美的C语言代码

    面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维护,复杂度较低的优美代码,本文将通过一个实际的例子来说明这一点. 基础知识 结构体 除了提供基本数据类型外,C 语言还提供给用户自己定制数据类型的能力,那就是结构体,在 C 语言中,你可以用结构体来表示任何实体.结构体正是面向对象语言中的类的概念的雏形,比如: typedef struct{ float x; float y; }Point; 定义了

  • C语言结构体数组同时赋值的另类用法

    说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子: #include <stdio.h> struct student { int a; int b ; int c ; }; struct student array1[1000] ; int main(void) { int i ; for(i = 0 ; i < 1000 ; i++) { array[i].a = 1 ; array[i].b = 2 ; array[i].c = 3 ; } fo

  • C语言数组栈实现模板

    本文实例为大家分享了C语言数组栈实现模板的具体代码,供大家参考,具体内容如下 SeqStack.h #pragma once #define MAX_SIZE 1024 typedef struct SEQSTACK { void* data[MAX_SIZE]; int size; }SeqStack; SeqStack* Init_SeqStack(); // 初始化栈 void Push_SeqStack(SeqStack* stack, void* data); // 入栈 void*

  • C语言实现Flappy Bird小游戏

    本文实例为大家分享了C语言实现Flappy Bird小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<Windows.h> /********函数变量声明********/ #define PR_Box printf("■") #define PR_Gold printf(

  • C语言实现2048游戏(ege图形库版)

    这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了.现在和大家分享一下,也希望能得到大神的指点. 实现的效果如图 先来讲一下我的思路吧 1.首先肯定是要一个4X4的二维数组来存放数字存放0.2.4-- 2.游戏开始与过程中需要随机出现2或者4,所以需要调用time.h这个库 3.游戏开始时,假如当获取字符为'w'则先用循环判定这个数字的下方有无和它相等的数字.如无则跳过,如有相加.然后在判定是否可以向上移动 下面是我的代码 (我本来是还要

  • C语言实现小猫钓鱼游戏

    本文实例为大家分享了C语言实现小猫钓鱼游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<time.h> #include<string.h> #include<stdlib.h> #include<windows.h> typedef struct { int data[3600]; int col[3600]; int top; } stack; typedef struct { int data[

  • C语言实现学生成绩管理系统实战教学

    趁着放假无事,开始用C语言开发一些小的项目,巩固基础知识的同时学习新的知识. 学生成绩管理系统实现的功能有:成绩录入.学生成绩查询.删除.修改.通过文件保存等. 开发这样一个系统需要具备的知识:线性表(链表).文件操作.排序(如果需要成绩排序). 开发环境为VS2015:在Linux下没有conio.h的头文件,需要修改与getch()函数相关的代码. #include <stdio.h> #include <stdlib.h> #include <string.h>

  • C语言利用模板实现简单的栈类

    本文实例为大家分享了C语言利用模板实现简单的栈类(数组和单链表),供大家参考,具体内容如下 主要的功能是实现一个后进先出的列表,有入栈.出栈.返回大小.判空等基本功能 #pragma once using namespace std; const int MAXSIZE = 0xfff; template<class type> class Class_Linkstack { int top; type* my_s; int max_size; public: Class_Linkstack(

  • C语言实现纸牌游戏之小猫钓鱼算法

    本文实例为大家分享了C语言实现小猫钓鱼算法的具体代码,供大家参考,具体内容如下 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏--"小猫钓鱼".游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌.出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾.当任意一人手中的牌全部出

随机推荐