C语言实现简单的贪吃蛇游戏

 更新时间:2021年07月27日 15:44:28   作者:he海ng  
这篇文章主要为大家详细介绍了C语言实现简单的贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下

用指针数组来表示蛇,p[0]表示蛇头

控制方向:w,s,a,d-->上下左右

 j,k-->加速、减速

键盘控制需要用到线程

编译时需要在后面加     -lpthread

代码:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
 
#define X 20
#define Y 40
 
char head='@';//蛇头的形状
char body='O';//蛇身的形状
 
char a[X][Y]={'O','O','O','@'};
char *p[X*Y]={&a[0][3],&a[0][2],&a[0][1],&a[0][0]};//p[0]表示蛇头
 
int n=3; //蛇身的长度(不带蛇头)
int i,j;
int f=1; //标志位:1.右;2.上;3.左;4.下;-1.退出
int us=200000;//用于usleep,延时0.2秒
 
void right()
{
 *p[n]=0;
 for(i=n;i>0;i--)
 {
  p[i]=p[i-1];
 }
 *p[0]=body;
 p[0]=p[0]+1;//蛇头向右移
 *p[0]=head;
}
void left()
{
 *p[n]=0;
 for(i=n;i>0;i--)
 {
  p[i]=p[i-1];
 }
 *p[0]=body;
 p[0]=p[0]-1;
 *p[0]=head;
}
void down()
{
 *p[n]=0;
 for(i=n;i>0;i--)
 {
  p[i]=p[i-1];
 }
 *p[0]=body;
 p[0]=p[0]+Y;
 *p[0]=head;
}
void up()
{
 *p[n]=0;
 for(i=n;i>0;i--)
 {
  p[i]=p[i-1];
 }
 *p[0]=body;
 p[0]=p[0]-Y;
 *p[0]=head;
}
 
 
void show()
{
 system("clear");
 for(i=0;i<Y;i++)
  printf("-");
 printf("\n");
 for(i=0;i<X;i++)
 {
  for(j=0;j<Y;j++)
  {
   if(a[i][j]==0)
    printf(" ");
   else
    printf("%c",a[i][j]);
  }
  printf("\n");
 }
 for(i=0;i<Y;i++)
  printf("-");
 printf("\nw,s,a,d->上下左右;j,k->加减速;ESC退出\n");
}
 
 
int ran()//随机数生成*
{
 srand(time(NULL));
lb:
 i=rand()%X;
 j=rand()%Y;
 //随机位置的值为0,则产生*;否则继续找随机位置
 if(a[i][j]==0)
  a[i][j]='*';
 else
  goto lb;
}
 
void eat()
{
 if(f==1)//右
 {
  if(*(p[0]+1)=='*')
  {
   n++;//长度增加
   p[n]=p[n-1];
   ran();//随机数生成*
  }  
 }
 if(f==2)//上
 {
  if(*(p[0]-Y)=='*')
  {
   n++;//长度增加
   p[n]=p[n-1];
   ran();//随机数生成*
  }  
 }
 if(f==3)//左
 {
  if(*(p[0]-1)=='*')
  {
   n++;//长度增加
   p[n]=p[n-1];
   ran();//随机数生成*
  }  
 }
 if(f==4)//下
 {
  if(*(p[0]+Y)=='*')
  {
   n++;//长度增加
   p[n]=p[n-1];
   ran();//随机数生成*
  }  
 }
}
 
void fail()
{
 if(p[0]<&a[0][0]||p[0]>&a[X-1][Y-1])//蛇头不在矩阵内
 {
  printf("fail!\n");
  f=-1;
 }
 if(f==1)//右
 {
  for(i=n;i>0;i--)
  {
   if((p[0]+1)==p[i])//右边是自己的身体
   {
    printf("fail!\n");
    f=-1;
   }
  } 
 }
 if(f==2)//上
 {
  for(i=n;i>0;i--)
  {
   if((p[0]-Y)==p[i])//上边是自己的身体
   {
    printf("fail!\n");
    f=-1;
   }
  } 
 }
 if(f==3)//左
 {
  for(i=n;i>0;i--)
  {
   if((p[0]-1)==p[i])//左边是自己的身体
   {
    printf("fail!\n");
    f=-1;
   }
  } 
 }
 if(f==4)//下
 {
  for(i=n;i>0;i--)
  {
   if((p[0]+Y)==p[i])//下边是自己的身体
   {
    printf("fail!\n");
    f=-1;
   }
  } 
 }
}
 
void *key(void *arg)//控制方向:w,s,a,d-->上下左右
{
 char k;
 while(1)
 {
  k=getchar();
  if(k=='w')//上
   f=2;
  if(k=='s')//下
   f=4;
  if(k=='a')//左
   f=3;
  if(k=='d')//右
   f=1;
  if(k=='j')//加速
   us=us*4/5;
  if(k=='k')//减速
   us=us*5/4;
  if(k==27)//ESC
  {
   printf("退出!\n");
   f=-1;
  }
  usleep(100);
 }
}
 
int main()
{
 system("stty -icanon");//关闭缓冲区,输入字符无需回车直接接受
 pthread_t  pid;
    pthread_create(&pid , NULL , key , NULL);//创建线程,键盘控制
 ran();
 while(1)
 {
  show();  //显示
  usleep(us);
  fail();  //判断是否会咬到自己
  eat();  //判断是否能吃到*
  if(f==1)//右
   right();
  if(f==2)//上
   up();
  if(f==3)//左
   left();
  if(f==4)//下
   down();
  if(f==-1)//退出
  {
   pthread_cancel(pid);//关闭线程
   return -1;
  }
 }
 
 
 return 0;
}

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

相关文章

  • CMake自动管理C/C++项目的实现

    CMake自动管理C/C++项目的实现

    CMake是一个强大的构建系统,用于跨平台管理C/C++项目的编译过程,本文主要介绍了CMake自动管理C/C++项目的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • C语言基础之C语言格式化输出函数printf详解

    C语言基础之C语言格式化输出函数printf详解

    这篇文章主要介绍了C语言格式化输出函数printf详解,printf函数中用到的格式字符与printf函数中用到的格式修饰符,感兴趣的小伙伴可以借鉴一下
    2023-03-03
  • C++实现大数乘法算法代码

    C++实现大数乘法算法代码

    这篇文章主要介绍了C++实现大数乘法算法代码的相关资料,需要的朋友可以参考下
    2015-03-03
  • C++ qsort函数排序与冒泡模拟实现流程详解

    C++ qsort函数排序与冒泡模拟实现流程详解

    qsort是一个库函数,基于快速排序算法实现的一个排序的函数,下面这篇文章主要给大家介绍了关于C语言qsort()函数使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • C语言实现魔方阵算法(幻方阵 奇魔方 单偶魔方实现)

    C语言实现魔方阵算法(幻方阵 奇魔方 单偶魔方实现)

    魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。魔方阵也称为幻方阵,看下面的实现方法吧
    2013-11-11
  • C语言数组与地址、数组名到底是什么详解

    C语言数组与地址、数组名到底是什么详解

    在写代码的时候,我们经常用到数组,那么有没有想过数组名是什么呢?这篇文章主要给大家介绍了关于C语言数组与地址、数组名到底是什么的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • C++20 特性 协程 Coroutines(1)

    C++20 特性 协程 Coroutines(1)

    这篇文章主要给大家分享得是C++20 得特性 协程 Coroutines,下面文章内容我们将来具体介绍什么是协程,协程得好处等知识点,需要的朋友可以参考一下
    2021-10-10
  • C语言实现YUV文件转JPEG格式

    C语言实现YUV文件转JPEG格式

    这篇文章主要为大家详细介绍了如何利用C语言实现将YUV文件转为JPEG格式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Ubuntu 环境下的 C/C++ 编译与调试配置方法

    Ubuntu 环境下的 C/C++ 编译与调试配置方法

    本文档详细介绍了如何在Ubuntu环境中使用VSCode进行C/C++的编译与调试配置,通过配置`tasks.json`和`launch.json`,实现了统一管理输出文件、优化调试流程以及跨平台兼容性,配置了`g++`编译器和`gdb`调试器,并使用C/C++插件来提高开发效率,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • C/C++中使用局部/全局变量初始值或默认值问题

    C/C++中使用局部/全局变量初始值或默认值问题

    这篇文章主要介绍了C/C++中使用局部/全局变量初始值或默认值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论