C语言开发实现贪吃蛇小游戏

小时候相信大家都玩过贪吃蛇,但是自从学了编程以后我都想自己实现一下,苦于没有契机。

首先看一下游戏效果把:

接下来我们先分析一下贪吃蛇的需求有哪些:

  • 用合适的数据结构表示蛇、食物
  • 地图的初始化
  • 蛇的移动、食物的随机生成
  • 蛇的显示、食物的显示
  • 贪吃蛇的规则确定(碰到食物边长、碰到边界和自己死亡等……)

主要功能需求就是上面这些,接下来我直接上C语言代码,这个游戏相信没做过的人看完之后会觉得非常简单,因为其中没什么技术点可言,最重要的就是下面这几句代码,用于控制光标的位置。

#include<Windows.h>
COORD cor;
cor.X = 0;
cor.Y =2;
//光标位置更新到(0,2)
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);

源码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
#define WIDE 60
# define HIGH 20
//1设置地图边界
//2初始化蛇的初始坐标、以及事务
//3、将蛇和食物显示
//4 蛇的移动(WASD)
/*
 规则:
 蛇碰到强死掉
 蛇碰到自己死掉
 蛇碰到食物,身体增长,增加分数
*/
//5.蛇死掉显示分数
//存储蛇的每一节的坐标
typedef struct _body
{
 int x;
 int y;
}BODY;
typedef struct _snake
{
 //存储蛇的身体
 BODY list[WIDE * HIGH];//身体的每一节坐标
 int size;//记录身体长度
 BODY food;//食物的位置
 int dx;//x移动方向
 int dy;//y移动方向
 //记录设尾位置
 int lastx;
 int lasty;
}SNAKE;

//初始化食物坐标
void initFood(SNAKE* s)
{
 srand(time(NULL));
 s->food.x = rand() % WIDE;
 s->food.y = rand() % HIGH;

}

//初始化蛇
void initSnake(SNAKE* s)
{
 //头部
 s->list[0].x = WIDE / 2;
 s->list[0].y = HIGH / 2;
 //第一节
 s->list[1].x = WIDE / 2-1;
 s->list[1].y = HIGH / 2;
 //记录身体大小
 s->size = 2;
 //初始化食物的坐标
 initFood(s);
 //默认向右移动
 s->dx = 1;
 s->dy = 0;
}
//显示蛇
void showUi(SNAKE* s)
{
 /*
 每次显示都要设置光标的位置

 */
 //显示蛇
 COORD cor;
 for (int i = 0; i < s->size; ++i)
 {
 //设置光标的位置

 cor.X = s->list[i].x;
 cor.Y = s->list[i].y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);

 //蛇头
 if (i == 0)
 {
  printf("@");
  continue;
 }
 printf("*");
 }
 //显示食物
 cor.X = s->food.x;
 cor.Y = s->food.y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
 printf("#");
 //清除掉蛇尾
 cor.X = s->lastx;
 cor.Y = s->lasty;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 printf(" ");

}
//更新的蛇的坐标
void moveSnake(SNAKE* s)
{
    //记录下蛇尾的位置
 s->lastx = s->list[s->size - 1].x;
 s->lasty = s->list[s->size - 1].y;
 for (int i = s->size-1; i >0; --i)
 {
 s->list[i].x = s->list[i - 1].x;
 s->list[i].y = s->list[i - 1].y;
 }
 s->list[0].x += s->dx;
 s->list[0].y += s->dy;

}

void controlSnake(SNAKE* s)
{
 char key=0;
 //判断按键
 while (_kbhit())
 {
 key = _getch();
 }
 switch (key)
 {
 case 'a':
 s->dx = -1;
 s->dy = 0;
 break;
 case 's':
 s->dx = 0;
 s->dy = 1;
 break;
 case 'd':
 s->dx = 1;
 s->dy = 0;
 break;
 case 'w':
 s->dx = 0;
 s->dy = -1;
 break;
 default:
 break;
 }
}

//游戏结束
void gameEnd(SNAKE* s)
{
 COORD cor;
 cor.X = 0;
 cor.Y = HIGH + 1;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 printf("游戏结束,最终得分为%d\n", (s->size - 2) * 10);
 //直接退出程序
 exit(0);
}
//蛇吃到自己
void snakeEatSelf(SNAKE* s)
{
 for (int i = 1; i < s->size; ++i)
 {
 if (s->list[0].x == s->list[i].x && s->list[0].y == s->list[i].y)
 {
  gameEnd(s);
 }
 }
}
//吃到食物
void snakeEatFood(SNAKE* s)
{
 if (s->list[0].x == s->food.x && s->list[0].y == s->food.y)
 {
 //食物重置
 initFood(s);
 //蛇加长
 s->size++;//增加后的坐标在移动的时候会自己进行加长
 }
}

//开始游戏
void startGame(SNAKE* s)
{
 //每次对蛇头是否碰墙进行判断
 while (s->list[0].x<WIDE&&s->list[0].x>=0&&s->list[0].y<HIGH&&s->list[0].y>0)
 {
 //控制方向
  controlSnake(s);
 //更新蛇的坐标
 moveSnake(s);
 //system("cls");//清屏
 //蛇移动
 showUi(s);
 //判断蛇是否碰到自己
 snakeEatSelf(s);
 //吃到食物
 snakeEatFood(s);
 //蛇的速度可以通过睡眠时间进行调整
 Sleep(200);

 }
 gameEnd(s);
}
//初始化边界
void initWall()
{
 COORD cor;
 for (int i = 0; i <= WIDE; ++i)
 {
 for (int j = 0; j <= HIGH; ++j)
 {
  if (i == 0 || i == WIDE||j==0||j==HIGH)
  {

  COORD cor;
  cor.X = i;
  cor.Y = j;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
  printf("+");
  }
 }
 }
}
//隐藏光标
void hideCursor()
{
 CONSOLE_CURSOR_INFO cursor;
 cursor.bVisible = FALSE;
 cursor.dwSize = sizeof(cursor);
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleCursorInfo(handle, &cursor);
}
int main()
{
 //隐藏光标
 hideCursor();
 //初始化地图
 initWall();
 //蛇类型定义
 SNAKE* snake = (SNAKE*)malloc(sizeof(SNAKE));

 //初始化蛇和食物
 initSnake(snake);
 //显示蛇
 showUi(snake);
 //开始游戏
 startGame(snake);

 free(snake);
 //程序在HIGH+1行后面输出
 COORD cor;
 cor.X = 0;
 cor.Y =HIGH+2;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 return 0;
}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

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

(0)

相关推荐

  • C语言手把手教你实现贪吃蛇AI(下)

    本文实例为大家分享了C语言实现贪吃蛇AI的具体代码,供大家参考,具体内容如下 1. 目标 这一部分的目标是把之前写的贪吃蛇加入AI功能,即自动的去寻找食物并吃掉. 2. 控制策略 为了保证蛇不会走入"死地",所以蛇每前进一步都需要检查,移动到新的位置后,能否找到走到蛇尾的路径,如果可以,才可以走到新的位置:否则在当前的位置寻找走到蛇尾的路径,并按照路径向前走一步,开始循环之前的操作,如下图所示.这个策略可以工作,但是并不高效,也可以尝试其他的控制策略,比如易水寒的贪吃蛇AI 运行效果如

  • C语言手把手教你实现贪吃蛇AI(中)

    手把手教你实现贪吃蛇AI,具体内容如下 1. 目标 这一部分主要是讲解编写贪吃蛇AI所需要用到的算法基础. 2. 问题分析 贪吃蛇AI说白了就是寻找一条从蛇头到食物的一条最短路径,同时这条路径需要避开障碍物,这里仅有的障碍就是蛇身.而A star 算法就是专门针对这一个问题的.在A star 算法中需要用到排序算法,这里采用堆排序(当然其他排序也可以),如果对堆排序不熟悉的朋友,请移步到这里--堆排序,先看看堆排序的内容. 3. A*算法 A star(也称A*)搜寻算法俗称A星算法.这是一种在

  • C语言手把手教你实现贪吃蛇AI(上)

    本文实例为大家分享了手把手教你实现贪吃蛇AI的具体步骤,供大家参考,具体内容如下 1. 目标 编写一个贪吃蛇AI,也就是自动绕过障碍,去寻找最优路径吃食物. 2. 问题分析 为了达到这一目的,其实很容易,总共只需要两步,第一步抓一条蛇,第二步给蛇装一个脑子.具体来说就是,首先我们需要有一条普通的贪吃蛇,也就是我们常玩儿的,手动控制去吃食物的贪吃蛇:然后给这条蛇加入AI,也就是通过算法控制,告诉蛇怎么最方便的绕开障碍去吃食物.为了讲清楚这个问题,文章将分为三部分:上,写一个贪吃蛇程序:中,算法基础

  • 基于C语言实现的贪吃蛇游戏完整实例代码

    本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

  • 贪吃蛇C语言代码实现(难度可选)

    本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 /********************************************************* ********************贪吃蛇(难度可选)******************** **************制作者:Xu Lizi 日期:2012/12/31******** ********************部分函数有借鉴************************ ****

  • C语言贪吃蛇经典小游戏

    一.贪吃蛇小游戏简介: 用上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,也不能咬到自己的身体,等到了一定的分数,就能过关. 二.函数框架 三.数据结构 typedef struct Snake { size_t x; //行 size_t y; //列 struct Snake* next; }Snake, *pSnake; 定义蛇的结构体,利用单链表来表示蛇,每个结点为蛇身体的一部分. 四.代码实现(vs2010  c

  • C语言实现贪吃蛇游戏

    最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已. 我的代码是在Windows下运行的,因为需要用到windows.h这个库. 然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了. 好了,直接上代码吧: 1)头文件和宏定义 #include<stdio.h> #include&

  • C语言结构数组实现贪吃蛇小游戏

    一.设计思路 蛇身本质上就是个结构数组,数组里存储了坐标x.y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印.所以撞墙.咬到自己只是数组x.y值的简单比较. 二.用上的知识点 结构数组Windows API函数 三.具体实现 先来实现静态页面,把地图.初始蛇身.食物搞定. 这里需要用到Windows API的知识,也就是对控制台上坐标的修改 //这段代码来自参考1 void Pos(int x, int y) { COORD pos; HANDLE hOutput; pos.X

  • 70行C语言代码实现贪吃蛇

    本文实例为大家分享了C语言实现贪吃蛇的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <Windows.h> #include <conio.h> #include <time.h> #define MAX_WIDE 50 #define MAX_HIGH 16 short dx = 1, dy = 0, randxy, score = 0; COORD coord; struct Snake{ short len

  • C语言链表实现贪吃蛇游戏

    阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h> #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上 :D:下:L:左 R:右 typedef struct SNAK

随机推荐