c语言小游戏代码大全300行,C语言贪吃蛇经典小游戏
一、贪吃蛇小游戏简介:
用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关。
二、函数框架
三、数据结构
typedef struct Snake
{
size_t x; //行
size_t y; //列
struct Snake* next;
}Snake, *pSnake;
定义蛇的结构体,利用单链表来表示蛇,每个结点为蛇身体的一部分。
四、代码实现(vs2010 c语言)
1.Snake.h
#ifndef __SNAKE_H__
#define __SNAKE_H__
#include
#include
#include
#include
#include
#include
//标识地图大小
#define ROW_MAP 10 //地图的行
#define COL_MAP 20 //地图的列
#define SUCCESS_SCORE 10//通关分数
enum Direction //蛇行走的方向
{
R, //右
L, //左
U, //上
D //下
}Direction;
enum State
{
ERROR_SELF, //咬到自己
ERROR_WALL, //撞到墙
NORMAL, //正常状态
SUCCESS //通关
}State;
typedef struct Snake
{
size_t x; //行
size_t y; //列
struct Snake* next;
}Snake, *pSnake;
void StartGame();
void RunGame();
void EndGame();
#endif
2.Snake.c
#include "Snake.h"
pSnake head = NULL; //定义蛇头指针
pSnake Food = NULL; //定义食物指针
int sleeptime = 500;//间隔时间,用来控制速度
int Score = 0; //总分
int everyScore = 1; //每步得分
//定义游戏中用到的符号
const char food = '#';
const char snake = '*';
void Pos(int x, int y) //控制输出光标
{
COORD pos; //pos为结构体
pos.X = x; //控制列
pos.Y = y; //控制行
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);//读取标准输出句柄来控制光标为pos
}
void Face()
{
system("color 0C");
printf("*******************************************************\n");
printf("* Welcome to Snake Game! *\n");
printf("* *\n");
printf("* ->开始游戏请按 enter键 *\n");
printf("* ->退出游戏请按 esc键 *\n");
printf("* ->暂停游戏请按 space键 *\n");
printf("* ->通过上下左右键来控制蛇的移动 *\n");
printf("* ->通过F1键减速 F2键加速 *\n");
printf("*******************************************************\n");
}
void Map() //初始化地图
{
int i = 0;
for(i = 0; i
{
Pos(i, 0);
printf("■");
Pos(i, ROW_MAP-1);
printf("■");
}
for(i = 0; i
{
Pos(0, i);
printf("■");
Pos(COL_MAP-2, i);
printf("■");
}
}
void PrintSnake() //打印蛇
{
pSnake cur = head;
while(cur)
{
Pos(cur->y, cur->x);
printf("%c", snake);
cur = cur->next;
}
}
void InitSnake() //初始化蛇身
{
int initNum = 3;
int i = 0;
pSnake cur;
head = (pSnake)malloc(sizeof(Snake));
head->x = 5;
head->y = 10;
head->next = NULL;
cur = head;
for(i = 1; i < initNum; i++)
{
pSnake newNode = (pSnake)malloc(sizeof(Snake));
newNode->x = 5+i;
newNode->y = 10;
newNode->next = NULL;
cur->next = newNode;
cur = cur->next;
}
PrintSnake();
}
void CreateFood() //在地图上随机产生一个食物
{
pSnake cur = head;
Food = (pSnake)malloc(sizeof(Snake));
//产生x~y的随机数 k=rand()%(Y-X+1)+X;
srand((unsigned)time(NULL));
Food->x = rand()%(ROW_MAP-2 - 1 + 1)+1;
Food->y = rand()%(COL_MAP-3 - 2 + 1)+2;
Food->next = NULL;
while(cur) //检查食物是否与蛇身重合
{
if(cur->x == Food->x && cur->y == Food->y)
{
free(Food);
Food = NULL;
CreateFood();
return;
}
cur = cur->next;
}
Pos(Food->y, Food->x);
printf("%c", food);
}
void StartGame() //游戏开始的所有设置
{
Face();
system("pause");
if(GetAsyncKeyState(VK_RETURN))
{
system("cls");
Pos(COL_MAP+5, 1);
printf("当前分数/通关分数:");
Pos(COL_MAP+20, 1);
printf("%d/%d", Score, SUCCESS_SCORE);
Pos(COL_MAP+5, 2);
printf("当前分每步得分:");
Pos(COL_MAP+20, 2);
printf("%d", everyScore);
Pos(COL_MAP+5, 3);
printf("\n");
Pos(COL_MAP+5, 4);
printf("速度越快 得分越高哦!!\n");
Map();
InitSnake();
CreateFood();
}
else if(GetAsyncKeyState(VK_ESCAPE))
{
exit(0);
}
}
int IsCrossWall() //判断是否碰到墙
{
if(head->x <= 0 || head->x >= ROW_MAP-1
||head->y <= 1 || head->y >= COL_MAP-2)
{
State = ERROR_WALL;
return 0;
}
return 1;
}
int IsEatSelf(pSnake newHead) //判断是否咬到自己
{
pSnake cur = head;
assert(newHead);
while(cur)
{
if(cur->x == newHead->x && cur->y == newHead->y)
{
State = ERROR_SELF;
return 0;
}
cur = cur->next;
}
return 1;
}
int IsFood(pSnake pos) //判断该位置是不是食物
{
assert(pos);
if(pos->x == Food->x && pos->y == Food->y)
{
return 1;
}
return 0;
}
void SnakeMove() //蛇移动一次
{
pSnake newHead = NULL;
newHead = (pSnake)malloc(sizeof(Snake));
if(Direction == R)
{
newHead->x = head->x;
newHead->y = head->y+1;
newHead->next = head;
}
else if(Direction == L)
{
newHead->x = head->x;
newHead->y = head->y-1;
newHead->next = head;
}
else if(Direction == U)
{
newHead->x = head->x-1;
newHead->y = head->y;
newHead->next = head;
}
else if(Direction == D)
{
newHead->x = head->x+1;
newHead->y = head->y;
newHead->next = head;
}
if(IsFood(newHead))
{
head = newHead;
PrintSnake();
CreateFood();
Score += everyScore;
Pos(COL_MAP+20, 1);
printf("%d/%d", Score, SUCCESS_SCORE);
if(Score >= SUCCESS_SCORE)
{
State = SUCCESS;
}
}
else
{
if(IsCrossWall() && IsEatSelf(newHead))
{
pSnake cur = NULL;
head = newHead;
cur = head;
//删除蛇尾并打印
while(cur->next->next != NULL)
{
Pos(cur->y, cur->x);
printf("%c", snake);
cur = cur->next;
}
Pos(cur->y, cur->x);
printf("%c", snake);
Pos(cur->next->y, cur->next->x);
printf(" "); //打印空格来覆盖频幕上的蛇尾
free(cur->next);
cur->next = NULL;
}
else
{
free(newHead);
newHead = NULL;
}
}
}
void Pause()
{
while(1)
{
Sleep(sleeptime);
if(GetAsyncKeyState(VK_SPACE))
{
break;
}
}
}
void ControlSnake() //用键盘控制游戏
{
if(GetAsyncKeyState(VK_UP) && Direction!=D)
{
Direction = U;
}
else if(GetAsyncKeyState(VK_DOWN) && Direction!=U)
{
Direction = D;
}
else if(GetAsyncKeyState(VK_LEFT) && Direction!=R)
{
Direction = L;
}
else if(GetAsyncKeyState(VK_RIGHT) && Direction!=L)
{
Direction = R;
}
else if(GetAsyncKeyState(VK_F1))
{
if(sleeptime != 500)
{
sleeptime = 500;
everyScore = 1;
Pos(COL_MAP+20, 2);
printf("%d", everyScore);
}
}
else if(GetAsyncKeyState(VK_F2))
{
if(sleeptime != 300)
{
sleeptime = 300;
everyScore = 2;
Pos(COL_MAP+20, 2);
printf("%d", everyScore);
}
}
else if(GetAsyncKeyState(VK_SPACE))
{
Pause();
}
else if(GetAsyncKeyState(VK_ESCAPE))
{
exit(0);
}
}
void StateGame() //判断游戏失败或成功
{
if(State == ERROR_SELF)
{
system("cls");
printf("很遗憾,蛇咬到自己,游戏失败!\n");
}
else if(State == ERROR_WALL)
{
system("cls");
printf("很遗憾,蛇碰到墙壁,游戏失败!\n");
}
else if(State == SUCCESS)
{
system("cls");
printf("恭喜您,已通关!!!\n");
}
}
void RunGame()
{
Direction = R; //蛇初始行走方向为右
State = NORMAL;//游戏初始为正常状态
while(1)
{
ControlSnake();
SnakeMove();
if(State != NORMAL)
{
StateGame();
break;
}
Sleep(sleeptime);
}
}
void EndGame() //释放链表并恢复默认值
{
pSnake cur = head;
while(cur)
{
pSnake del = cur;
cur = cur->next;
free(del);
del = NULL;
}
head = NULL;
if(Food != NULL)
{
free(Food);
Food = NULL;
}
Score = 0;
everyScore = 1;
sleeptime = 500;
}
3.Test.c
#include "Snake.h"
int main()
{
while(1)
{
StartGame();
RunGame();
EndGame();
}
system("pause");
return 0;
}
五、运行界面展示
1.欢迎界面
2.游戏界面
小小的c语言项目,用来练手,仅供参考哦!!
谢谢阅读,如有问题,欢迎提出。
更多有趣的经典小游戏实现专题,分享给大家:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
c语言小游戏代码大全300行,C语言贪吃蛇经典小游戏相关推荐
- c语言代码大全500行,C语言职工档案管理系统 500多行代码1
<C语言职工档案管理系统 500多行代码1>由会员分享,可在线阅读,更多相关<C语言职工档案管理系统 500多行代码1(17页珍藏版)>请在人人文库网上搜索. 1.1程序的总体 ...
- 100行实现《贪吃蛇》小游戏详解(Qt)
目录 游戏说明 游戏效果展示 游戏代码详解 关键数据结构 初始化游戏界面 游戏部分 提示部分 蛇逻辑 小蛇的初始化 边界判断 蛇吃食物判断 随机生成食物 是否撞到自己 小蛇的移动 游戏主体逻辑 定时 ...
- python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...
- 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)
在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识 Jframe GUI 双向链表 线程 二 ...
- 最终幻想游戏java_Java简单实现贪吃蛇经典小游戏(附源代码)
在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识Jframe GUI 双向链表 线程 二. ...
- python小游戏代码大全-20行python代码的入门级小游戏的详解
背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...
- python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...
原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...
- 贪食蛇php,贪吃蛇网页小游戏的代码
贪吃蛇网页小游戏的代码 ::selection { color:#FFFFFF; background:transparent; } ::-moz-selection { color:#FFFFFF; ...
- python编程游戏代码tkinter,python编程游戏代码大全
python有趣的编程代码 class Point: row=0 col=0 def __init__(self, row, col): =row =col def copy(se ...
- 用前端技术实现贪吃蛇的小游戏
用前端技术实现贪吃蛇的小游戏 前言 游戏功能 游戏设计 游戏主页代码 游戏中的js代码(snake.js) 游戏运行界面 前言 周末大热天窝在家里无聊,想温习一下前端开发,所以用javascript ...
最新文章
- 层次聚类python_用python绘制层次聚类图
- SpringBoot高级篇MongoDB之修改基本使用姿势
- 修改 class_带你探索JVM的Class文件结构
- 1014. 福尔摩斯的约会
- win7 php mysql扩展名_win7下MySQL 5.1.73安装过程(图解)并在php.ini中启用相关扩展。...
- 王义成:阿里云Redis服务助力游戏行业发展
- JS的三种消息提示框alert confirm prompt
- 18、Java并发性和多线程-饥饿与公平
- 计算机沟通方式,雅思阅读练习:计算机改变沟通方式
- 用promise封装ajax_ES6-promise封装AJAX请求
- web面试常见问题补充
- bzoj4152-[AMPPZ2014]The_Captain
- vim无法写入hosts文件(提示hosts是一个只读文件)
- 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
- Linux — 安装JDK 使用rpm命令安装
- 网站seo优化方式途径
- 群英传内推第001期
- 月中工作总结_在全职工作的9个月中,我是如何从新手转到软件工程师的
- python柱状图纵轴刻度_Python数据分析:Matplotlib
- JDK中java.exe,javadoc.exe,jdb.exe,javaprof.exe分别是什么,有什么作用?
热门文章
- Wannafly挑战赛28A(模拟,题意文字游戏)
- 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明
- Oracle 递归查询 (start with ...connect by ...prior)
- postgresql搭建从库
- 2017.10.17笔记
- Erlang中的RSA签名
- 【转】Java 5种字符串拼接方式性能比较。
- HDU 2188 (巴什博弈)
- Atlas Resources
- OpenCV2:Mat属性type,depth,step