一、贪吃蛇小游戏简介:

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

二、函数框架

三、数据结构

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语言贪吃蛇经典小游戏相关推荐

  1. c语言代码大全500行,C语言职工档案管理系统 500多行代码1

    <C语言职工档案管理系统 500多行代码1>由会员分享,可在线阅读,更多相关<C语言职工档案管理系统 500多行代码1(17页珍藏版)>请在人人文库网上搜索. 1.1程序的总体 ...

  2. 100行实现《贪吃蛇》小游戏详解(Qt)

    目录 游戏说明 游戏效果展示 游戏代码详解 ​关键数据结构 初始化游戏界面 游戏部分 提示部分 蛇逻辑 小蛇的初始化 边界判断 蛇吃食物判断 随机生成食物 是否撞到自己 小蛇的移动 游戏主体逻辑 定时 ...

  3. python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)

    经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...

  4. 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)

    在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识 Jframe GUI 双向链表 线程 二 ...

  5. 最终幻想游戏java_Java简单实现贪吃蛇经典小游戏(附源代码)

    在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识Jframe GUI 双向链表 线程 二. ...

  6. python小游戏代码大全-20行python代码的入门级小游戏的详解

    背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...

  7. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  8. 贪食蛇php,贪吃蛇网页小游戏的代码

    贪吃蛇网页小游戏的代码 ::selection { color:#FFFFFF; background:transparent; } ::-moz-selection { color:#FFFFFF; ...

  9. python编程游戏代码tkinter,python编程游戏代码大全

    python有趣的编程代码 class Point:  row=0  col=0  def __init__(self, row, col):    =row    =col  def copy(se ...

  10. 用前端技术实现贪吃蛇的小游戏

    用前端技术实现贪吃蛇的小游戏 前言 游戏功能 游戏设计 游戏主页代码 游戏中的js代码(snake.js) 游戏运行界面 前言 周末大热天窝在家里无聊,想温习一下前端开发,所以用javascript ...

最新文章

  1. 层次聚类python_用python绘制层次聚类图
  2. SpringBoot高级篇MongoDB之修改基本使用姿势
  3. 修改 class_带你探索JVM的Class文件结构
  4. 1014. 福尔摩斯的约会
  5. win7 php mysql扩展名_win7下MySQL 5.1.73安装过程(图解)并在php.ini中启用相关扩展。...
  6. 王义成:阿里云Redis服务助力游戏行业发展
  7. JS的三种消息提示框alert confirm prompt
  8. 18、Java并发性和多线程-饥饿与公平
  9. 计算机沟通方式,雅思阅读练习:计算机改变沟通方式
  10. 用promise封装ajax_ES6-promise封装AJAX请求
  11. web面试常见问题补充
  12. bzoj4152-[AMPPZ2014]The_Captain
  13. vim无法写入hosts文件(提示hosts是一个只读文件)
  14. 使用BeautifulSoup爬取“0daydown”站点的信息(2)——字符编码问题解决
  15. Linux — 安装JDK 使用rpm命令安装
  16. 网站seo优化方式途径
  17. 群英传内推第001期
  18. 月中工作总结_在全职工作的9个月中,我是如何从新手转到软件工程师的
  19. python柱状图纵轴刻度_Python数据分析:Matplotlib
  20. JDK中java.exe,javadoc.exe,jdb.exe,javaprof.exe分别是什么,有什么作用?

热门文章

  1. Wannafly挑战赛28A(模拟,题意文字游戏)
  2. 拉普拉斯矩阵(Laplacian Matrix) 及半正定性证明
  3. Oracle 递归查询 (start with ...connect by ...prior)
  4. postgresql搭建从库
  5. 2017.10.17笔记
  6. Erlang中的RSA签名
  7. 【转】Java 5种字符串拼接方式性能比较。
  8. HDU 2188 (巴什博弈)
  9. Atlas Resources
  10. OpenCV2:Mat属性type,depth,step