项目:贪吃蛇

  • 一、项目描述和最终效果展示
  • 二、生成一个静态的蛇
  • 三、玩家控制小蛇移动
  • 四、增加判断失败功能
  • 五、增加吃食物 分数统计 暂停游戏 等功能

一、项目描述和最终效果展示

项目描述:   玩家通过控制小蛇来吃掉食物

最终效果展示:

二、生成一个静态的蛇

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>#define High 20
#define Width 30 //游戏画面尺寸//全局变量
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 -1为边框  1为蛇头 大于1的为蛇身//定义隐藏光标函数
void HideCursor()
{CONSOLE_CURSOR_INFO cursor;    cursor.bVisible = FALSE;    cursor.dwSize = sizeof(cursor);    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorInfo(handle, &cursor);
}void gotoxy(int x,int y)//将光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}void startup()//数据的初始化
{int i,j;//初始化边框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇头位置canvas[High/2][Width/2]=1;//初始化蛇身,画布中的元素值分别为2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;
}void show()//显示画面
{int i,j;gotoxy(0,0);//将光标移动到原点位置,以下重画清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//输出空格else if(canvas[i][j]==-1)printf("#");//输出边框else if(canvas[i][j]==1)printf("@");//输出蛇头else if(canvas[i][j]>1)printf("*");//输出蛇身}printf("\n");}
}void updateWithoutInput()//与用户输入无关的更新
{}void updateWithInput()//与用户输入有关的更新
{}int main()
{startup();//数据的初始化HideCursor();//隐藏光标while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0;
}

效果图如下:

三、玩家控制小蛇移动

小蛇移动原理图如下:

其他的以此类推

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>#define High 20
#define Width 30 //游戏画面尺寸//全局变量
int moveDirection;
//小蛇移动的方向,上 下 左 右 分别用1,2,3,4表示
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 -1为边框  1为蛇头 大于1的为蛇身//定义隐藏光标函数
void HideCursor()
{CONSOLE_CURSOR_INFO cursor;    cursor.bVisible = FALSE;    cursor.dwSize = sizeof(cursor);    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorInfo(handle, &cursor);
}void gotoxy(int x,int y)//将光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}void startup()//数据的初始化
{int i,j;//初始化边框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇头位置canvas[High/2][Width/2]=1;//初始化蛇身,画布中的元素值分别为2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移动moveDirection=4;
}void show()//显示画面
{int i,j;gotoxy(0,0);//将光标移动到原点位置,以下重画清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//输出空格else if(canvas[i][j]==-1)printf("#");//输出边框else if(canvas[i][j]==1)printf("@");//输出蛇头else if(canvas[i][j]>1)printf("*");//输出蛇身}printf("\n");}Sleep(100);
}//移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(即蛇尾巴)把其变为零
//找到等于2的元素(即蛇头),
//根据输出的上下方向把对应的另一个像素值设为1(新蛇头)
void moveSnakeByDirection()
{int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇头{oldHead_i=i;oldHead_j=j;}}}}canvas[oldTail_i][oldTail_j]=0;//将原来的蛇尾置0if(moveDirection==1)//向上移动canvas[oldHead_i-1][oldHead_j]=1;if(moveDirection==2)//向下移动canvas[oldHead_i+1][oldHead_j]=1;if(moveDirection==3)//向左移动canvas[oldHead_i][oldHead_j-1]=1;if(moveDirection==4)//向右移动canvas[oldHead_i][oldHead_j+1]=1;
}void updateWithoutInput()//与用户输入无关的更新
{moveSnakeByDirection();
}void updateWithInput()//与用户输入有关的更新
{char input;if(kbhit())//判断是否有输入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}}
}int main()
{startup();//数据的初始化HideCursor();//隐藏光标while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0;
}

效果图如下:

四、增加判断失败功能

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>#define High 20
#define Width 30 //游戏画面尺寸//全局变量
int moveDirection;
//小蛇移动的方向,上 下 左 右 分别用1,2,3,4表示
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 -1为边框  1为蛇头 大于1的为蛇身//定义隐藏光标函数
void HideCursor()
{CONSOLE_CURSOR_INFO cursor;    cursor.bVisible = FALSE;    cursor.dwSize = sizeof(cursor);    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorInfo(handle, &cursor);
}void gotoxy(int x,int y)//将光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}void startup()//数据的初始化
{int i,j;//初始化边框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇头位置canvas[High/2][Width/2]=1;//初始化蛇身,画布中的元素值分别为2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移动moveDirection=4;
}void show()//显示画面
{int i,j;gotoxy(0,0);//将光标移动到原点位置,以下重画清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//输出空格else if(canvas[i][j]==-1)printf("#");//输出边框else if(canvas[i][j]==1)printf("@");//输出蛇头else if(canvas[i][j]>1)printf("*");//输出蛇身}printf("\n");}Sleep(100);
}//移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(即蛇尾巴)把其变为零
//找到等于2的元素(即蛇头),
//根据输出的上下方向把对应的另一个像素值设为1(新蛇头)
void moveSnakeByDirection()
{int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;//旧蛇头蛇尾坐标int newHead_i,newHead_j;//新蛇头坐标int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇头{oldHead_i=i;oldHead_j=j;}}}}canvas[oldTail_i][oldTail_j]=0;//将原来的蛇尾置0if(moveDirection==1)//向上移动{newHead_i=oldHead_i-1;newHead_j=oldHead_j;}if(moveDirection==2)//向下移动{newHead_i=oldHead_i+1;newHead_j=oldHead_j;}if(moveDirection==3)//向左移动{newHead_i=oldHead_i;newHead_j=oldHead_j-1;}if(moveDirection==4)//向右移动{newHead_i=oldHead_i;newHead_j=oldHead_j+1;}//小蛇是否和自身碰撞或者和边框碰撞,游戏失败if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1){printf("游戏失败!\n");exit(0);}else{canvas[newHead_i][newHead_j]=1;}
}void updateWithoutInput()//与用户输入无关的更新
{moveSnakeByDirection();
}void updateWithInput()//与用户输入有关的更新
{char input;if(kbhit())//判断是否有输入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}}
}int main()
{startup();//数据的初始化HideCursor();//隐藏光标while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0;
}

效果图如下:

五、增加吃食物 分数统计 暂停游戏 等功能

吃食物原理图:

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>#define High 20
#define Width 30 //游戏画面尺寸//全局变量
int moveDirection;
//小蛇移动的方向,上 下 左 右 分别用1,2,3,4表示
int food_x,food_y;//食物的位置
int canvas[High][Width]={0};
//二维数组存储游戏画布中对应的元素
//0为空格 -1为边框 -2为食物 1为蛇头 大于1的为蛇身
int score=0;//分数//定义隐藏光标函数
void HideCursor()
{CONSOLE_CURSOR_INFO cursor;    cursor.bVisible = FALSE;    cursor.dwSize = sizeof(cursor);    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorInfo(handle, &cursor);
}void gotoxy(int x,int y)//将光标移动到(x,y)位置
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos);
}void startup()//数据的初始化
{int i,j;//初始化边框for(i=0;i<High;i++){canvas[i][0]=-1;canvas[i][Width-1]=-1;}for(j=0;j<Width;j++){canvas[0][j]=-1;canvas[High-1][j]=-1;}//初始化蛇头位置canvas[High/2][Width/2]=1;//初始化蛇身,画布中的元素值分别为2,3,4,5等for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1;//初始小蛇向右移动moveDirection=4;food_x=rand()%(High-5)+2;food_y=rand()%(Width-5)+2;canvas[food_x][food_y]=-2;
}void show()//显示画面
{int i,j;gotoxy(0,0);//将光标移动到原点位置,以下重画清屏for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" ");//输出空格else if(canvas[i][j]==-1)printf("#");//输出边框else if(canvas[i][j]==1)printf("@");//输出蛇头else if(canvas[i][j]>1)printf("*");//输出蛇身else if(canvas[i][j]==-2)printf("F");//输出食物}printf("\n");}printf("分数:%d\n",score);printf("按空格键游戏暂停\n");Sleep(100);
}//移动小蛇
//第一步扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(即蛇尾巴)把其变为零
//找到等于2的元素(即蛇头),
//根据输出的上下方向把对应的另一个像素值设为1(新蛇头)
void moveSnakeByDirection()
{int i,j;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;//旧蛇头蛇尾坐标int newHead_i,newHead_j;//新蛇头坐标int max=0;for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0)canvas[i][j]++;}}for(i=1;i<High-1;i++){for(j=1;j<Width-1;j++){if(canvas[i][j]>0){if(max<canvas[i][j])//找到蛇尾{max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2)//找到蛇头{oldHead_i=i;oldHead_j=j;}}}}if(moveDirection==1)//向上移动{newHead_i=oldHead_i-1;newHead_j=oldHead_j;}if(moveDirection==2)//向下移动{newHead_i=oldHead_i+1;newHead_j=oldHead_j;}if(moveDirection==3)//向左移动{newHead_i=oldHead_i;newHead_j=oldHead_j-1;}if(moveDirection==4)//向右移动{newHead_i=oldHead_i;newHead_j=oldHead_j+1;}//如果新蛇头吃到食物if(canvas[newHead_i][newHead_j]==-2){canvas[food_x][food_y]=0;score++;//产生一个新的食物do{food_x=rand()%(High-5)+2;food_y=rand()%(Width-5)+2;}while(canvas[food_x][food_y]!=0);//产生的食物的位置不能和蛇身重合canvas[food_x][food_y]=-2;//原来的旧蛇尾留着,长度自动加1}else//否则,原来的旧蛇尾剪掉,保持长度不变canvas[oldTail_i][oldTail_j]=0;//小蛇是否和自身碰撞或者和边框碰撞,游戏失败if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==-1){printf("游戏失败!\n");exit(0);}else{canvas[newHead_i][newHead_j]=1;}
}void updateWithoutInput()//与用户输入无关的更新
{moveSnakeByDirection();
}void updateWithInput()//与用户输入有关的更新
{char input;if(kbhit())//判断是否有输入{input=getch();if(input=='a'||input=='A')//左移{moveDirection=3;moveSnakeByDirection();}else if(input=='d'||input=='D')//右移{moveDirection=4;moveSnakeByDirection();}else if(input=='w'||input=='W')//上移{moveDirection=1;moveSnakeByDirection();}else if(input=='s'||input=='S')//下移{moveDirection=2;moveSnakeByDirection();}else if(input==' ')//暂停{while(1){input=getch();if(input==' ')break;}}}
}int main()
{startup();//数据的初始化HideCursor();//隐藏光标while(1){show();//显示画面updateWithoutInput();//与用户输入无关的更新updateWithInput();//与用户输入有关的更新}return 0;
}

效果图如下:

项目: 贪吃蛇(C语言)相关推荐

  1. c语言课程设计贪吃蛇报告,贪吃蛇C语言课程设计报告.doc

    贪吃蛇C语言课程设计报告 贪吃蛇游戏设计 姓名: 张力 学号: 完成日期: 月 日 一.设计目的 贪吃蛇游戏程序功能的实现主要是建立在二维数组和图形界面的应用上,通过编写游戏程序能够熟悉掌握相关数组和 ...

  2. 贪吃蛇_C语言_链表实现_SCAU课程设计

    个人大一下课程设计作品,本文中直接附上源代码(通过visual stdio 2019 实现  ): 课题:贪吃蛇(链表实现~) 语言:C/C++ 运行环境(软件):Visual Stdio 2019( ...

  3. C语言贪吃蛇游戏代码,贪吃蛇C语言代码实现大全

    一.C语言贪吃蛇代码实现前言 设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言. 贪吃蛇是非常经典的一款游戏,本次我们模拟在控制台实现贪吃蛇游戏, ...

  4. 贪吃蛇c语言 游戏中会出现障碍物,贪吃蛇C语言游戏代码.doc

    贪吃蛇C语言游戏代码 //开始编写游戏需要的类 #include //EasyX_2011惊蛰版(绘图库) #include #include #include #define UP1 #define ...

  5. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置git环境和项目创建 项目的逐步细分 配置git环境 创建项目后端 前后端不分离写法-url访问路径解析资源 安装vue vue文件 ...

  6. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2

    [Java闭关修炼]SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2 传统的登录验证模式 JWT登录验证方式 下载安装依赖 创建JWTUTIL JwtAuthenticati ...

  7. C语言小项目--贪吃蛇游戏

    一.贪吃蛇小游戏简介: 用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关. ...

  8. 贪吃蛇c语言程序 简书,C语言/C++项目源码分享—贪吃蛇

    /* 项目内容:贪吃蛇 开发环境:vs2013+easyx */ 这个项目是一个小游戏-贪吃蛇项目,代码如下 #include #include //包含easyx图形库,可以使用给我们提供的一些函数 ...

  9. 0基础C语言实战项目-贪吃蛇小游戏

    大家好啊,如果有一样是编程0基础的大一本科生,相信大家现在都对自己学习了一段时间的程序设计课程还没有过实战经验: 最近也是考试刚完,持着练手的心态我编写了这样一个经典的小游戏-贪吃蛇: 由于是第一次发 ...

最新文章

  1. svn的代码提交到git服务器_svn服务器代码仓库,数据迁移到git仓库
  2. 《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式
  3. Android:主题(Theme)
  4. 不等距双杆模型_搜索中的深度匹配模型(下)
  5. python 两个队列进行对比
  6. .NET连接SQL Server
  7. 用代码块在new对象时set属性
  8. 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
  9. STM32矩阵键盘——行列扫描编码模式
  10. php云erp进销存v8手机端,PHP仿金蝶云ERP进销存V8网络多仓管理系统
  11. IOS OpenGL ES GPUImage 图像 XYDerivative 边缘检测 GPUImageXYDerivativeFilter
  12. 索尼播放器Android系统,获得最新固件的索尼NW-ZX505,简直脱胎换骨!
  13. 模块三 day22 并发编程(上)
  14. 内核层读写应用层文件,使用filp_open函数。
  15. WebSocket 协议以及 Socket 接口
  16. 一个初学者→全栈工程师的学习之路(1)——关于全栈工程师的理解
  17. 7-90 社交集群 (30分)--详解
  18. 在Linux7关机命令,linux关机命令 【使用指南】
  19. AtCoder Beginner Contest 170 F. Pond Skater
  20. Justice 结构体记录排序前下标

热门文章

  1. 毕业设计——学术交流管理系统的设计与实现-1
  2. windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)...
  3. 从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?
  4. 初识java-循环结构(二):6
  5. CSS3边框图片-像素虚边的问题
  6. poj3671Dining Cows(DP)
  7. JavaScript与Asp.net传值
  8. VC MFC界面上显示BMP图片
  9. Prototype Pattern(原型模式)
  10. python进阶 多线程编程 —— threading和queue库实现多线程编程