用纯C语言实现贪吃蛇游戏

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

在读大学生一枚,五一期间用四天时间写一个小游戏。

本贪吃蛇游戏代码共计531行,开发环境是VS,游戏分为两种模式,标准模式和超大地图模式,详细看以下源代码,并进入游戏体验具体内容。

//贪吃蛇

#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
//游戏窗口
#define FrameX 5
#define FrameY 5
#define Frame_width 20
#define Frame_height 20
#define FrameX2 3
#define FrameY2 3
#define Frame_width2 55
#define Frame_height2 47
//全局变量
int i, j, p, q, m;int a[2];
//蛇的结构体
struct Snack{
int x[200];
//蛇的X坐标;
int y[200];
//蛇的Y坐标;
int count;
//蛇吃食物的数量;
int length;
//蛇身体的长度;
int speed;
//蛇移动的速度;
};

//食物的结构
struct Food{
 int x;
//食物的X坐标;
    int y;
//食物的Y坐标;
};

//光标的位置
void gotoxy(HANDLE hOut, int x, int y){ COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOut, pos);}

//游戏菜单
void menu(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
void over_game();
void start_game();
void start_game2();
int n;
gotoxy(hOut, 50, 14);
printf(" 超贪吃的蛇");
gotoxy(hOut, 50, 16);
printf("正常游戏模式【1】");
gotoxy(hOut, 50, 17);
printf("超大地图模式【2】");
gotoxy(hOut, 50, 18);
printf(" 结束游戏【3】");
scanf_s("%d", &n);
switch(n)
{
case 1:
 system("cls");
 start_game();
 over_game();
 break;
case 2:
 system("cls");
 start_game2();
 over_game();
 break;
case 3:
 system("cls");
 over_game();
 break;
default:
 printf("你的输入有误,请重新输入!");
 menu();
 break;
}}
//制作游戏窗口2
void make_frame2()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 //定义显示器句柄变量
 gotoxy(hOut, 24, 13);
 //定义障碍物
 printf("#");
 gotoxy(hOut, 14, 23);
 printf("#");
 gotoxy(hOut, 35, 20);
 //定义障碍物
 printf("#");
 gotoxy(hOut, 40, 35);
 printf("#");
 gotoxy(hOut, 70, 6);
 //定义障碍物
 printf("#");
 gotoxy(hOut, 80, 16);
 printf("#");
 gotoxy(hOut, 60, 45);
 //定义障碍物
 printf("#");
 gotoxy(hOut, 28, 8);
 printf("#");
for (i = 0; i < 2*Frame_width2+1;i++)
{ gotoxy(hOut, FrameX2 + i, FrameY2);
//上边框
printf("-"); gotoxy(hOut, FrameX2 + i, Frame_height2+FrameY2);
//下边框
printf("-"); }
for (i = 0; i < Frame_height2-1; i++)
{ gotoxy(hOut, FrameX2, FrameY2 + i+1);
//左边框
printf("|");
gotoxy(hOut, FrameX2+2*Frame_width2, FrameY2 + i+1);
//右边框
printf("|"); }}
//制作游戏窗口
void make_frame()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 //定义显示器句柄变量
 gotoxy(hOut, 24, 13);
 //定义障碍物
 printf("#");
 gotoxy(hOut, 14, 23);
 printf("#");
 for (i = 0; i < 2 * Frame_width + 1; i++)
 { gotoxy(hOut, FrameX + i, FrameY);
 //上边框
 printf("-");
 gotoxy(hOut, FrameX + i, Frame_height + FrameY);
 //下边框
 printf("-"); }
 for (i = 0; i < Frame_height - 1; i++)
 { gotoxy(hOut, FrameX, FrameY + i + 1);
 //左边框
 printf("|");
 gotoxy(hOut, FrameX + 2 * Frame_width, FrameY + i + 1);
 //右边框
 printf("|"); }}

//初始化蛇
void intt_snack(struct Snack* snack)
{
 snack->x[0] = FrameX + 5;
 //蛇的横坐标;
 snack->y[0] = FrameY + 6;
 //蛇的纵坐标;
 snack->speed = 200;
 //蛇的速度
 snack->length = 3;
 //蛇的长度;
 snack->count = 0;
 for (i = 1; i < snack->length; i++)
    {
 snack->x[i] = snack->x[i - 1]+2;
    snack->y[i] = snack->y[i - 1];
    }
}

//初始化蛇2
void intt_snack2(struct Snack* snack)
{ snack->x[0] = FrameX2 + 5;
//蛇的横坐标;
snack->y[0] = FrameY2 + 6;
//蛇的纵坐标;
snack->speed = 200;
//蛇的速度;
snack->length = 3;
//蛇的长度;
snack->count = 0;
for (i = 1; i < snack->length; i++)
{ snack->x[i] = snack->x[i - 1] + 2;
snack->y[i] = snack->y[i - 1]; }}

//移动蛇
void move_snack(HANDLE hOut,struct Snack* snack)
{ gotoxy(hOut, snack->x[0], snack->y[0]); printf(" ");
//清除蛇尾;
for (i = 1; i < snack->length; i++)
{
  snack->x[i - 1] = snack->x[i];
  snack->y[i - 1] = snack->y[i];
}}

//打印蛇
void print_snack(HANDLE hOut, struct Snack* snack)
{
 for (i = 0; i < snack->length; i++)
{
  gotoxy(hOut, snack->x[i], snack->y[i]);
if (i == 0)
{
 printf("*");
}
else if
(i < snack->length - 1)
{
 printf("0");
}
else
{
 printf("@");
}
 }
}

//打印食物
void print_food(HANDLE hOut, struct Snack*snack,struct Food* food){ srand((unsigned)time(0));
while (1)
{
food->x = rand() % 2*Frame_width+1; food->y = rand() % Frame_height;
if (food->x == 0 || food->y == 0) { continue; }
food->x = food->x+FrameX;
food->y = food->y + FrameY;
for (i = 0; i < snack->length; i++)
{
 if (food->x == snack->x[i] && food->y == snack->y[i])
{
  break;
 }
}
if (i == snack->length)
{
 gotoxy(hOut, food->x, food->y);
printf("$");
break;
}
}
}

//打印食物2
void print_food2(HANDLE hOut, struct Snack* snack, struct Food* food)
{ srand((unsigned)time(0));
while (1)
{
 food->x = (rand() % (3*Frame_width2 + 1))+FrameX2;
food->y = (rand() % Frame_height2)+FrameY2;
if (food->x == 0 || food->y == 0)
{
 continue;
}
for (i = 0; i < snack->length; i++)
{
 if (food->x == snack->x[i] && food->y == snack->y[i])
{
  break;
 }
}
if (i == snack->length)
{
 gotoxy(hOut, food->x, food->y); printf("$");
break;
}
}
}

//吃食物
void eat_food(HANDLE hOut, struct Snack *snack, struct Food *food)
{ if (snack->x[snack->length-1] == food->x && snack->y[snack->length-1] == food->y)
{ snack->length++;
for (i = snack->length; i >= 1; i--)
{ snack->x[i] = snack->x[i - 1];
snack->y[i] =snack->y[i - 1]; } snack->x[0] = a[0];
snack->y[0] = a[1]; print_food(hOut,snack,food);
snack->count++; if (snack->count % 5 == 0) snack->speed -= 20; }}

//穿墙
void through_wall(HANDLE hOut, struct Snack* snack, char ch)
{ if (ch == 72 && snack->y[snack->length - 1] == FrameY)
{ snack->y[snack->length - 1] =Frame_height+4;
//如果蛇在上框且向上移动,穿墙
} if (ch == 80 && snack->y[snack->length - 1] == FrameY + Frame_height)
{ snack->y[snack->length - 1] = FrameY+1;
//如果蛇在下框且向下移动,穿墙
} if (ch == 75 && snack->x[snack->length - 1] == FrameX-1)
{ snack->x[snack->length - 1] =2*Frame_width + FrameX-1;
//如果蛇在左框且向左移动,穿墙
} if (ch == 77 && snack->x[snack->length - 1] == 2*Frame_width+FrameX+1)
{ snack->x[snack->length - 1] = FrameX+1;
//如果蛇在右框且向右移动,穿墙
}}

//穿墙2
void through_wall2(HANDLE hOut, struct Snack* snack, char ch)
{ if (ch == 72 && snack->y[snack->length - 1] == FrameY2)
{ snack->y[snack->length - 1] = Frame_height2 + 4;
//如果蛇在上框且向上移动,穿墙
} if (ch == 80 && snack->y[snack->length - 1] == FrameY2 + Frame_height2)
{ snack->y[snack->length - 1] = FrameY2 + 1;
//如果蛇在下框且向下移动,穿墙
} if (ch == 75 && snack->x[snack->length - 1] == FrameX2 - 1)
{ snack->x[snack->length - 1] = 2 * Frame_width2 + FrameX2 - 1;
//如果蛇在左框且向左移动,穿墙
} if (ch == 77 && snack->x[snack->length - 1] == 2 * Frame_width2 + FrameX2 + 1)
{ snack->x[snack->length - 1] = FrameX2 + 1;
//如果蛇在右框且向右移动,穿墙
}}

//判断蛇是否死亡
int snack_die(struct Snack *snack){
 for (i = 0; i < snack->length - 1; i++)
 { if (snack->x[snack->length - 1] == snack->x[i] && snack->y[snack->length - 1] == snack->y[i])
  return 0;
 if (snack->x[snack->length - 1] == 24 && snack->y[snack->length - 1] == 13)
  return 0;
 if (snack->x[snack->length - 1] == 14 && snack->y[snack->length - 1] == 23)
  return 0; }
 return 1;}

//判断蛇是否死亡2
int snack_die2(struct Snack* snack)
{ for (i = 0; i < snack->length - 1; i++)
{ if (snack->x[snack->length - 1] == snack->x[i] && snack->y[snack->length - 1] == snack->y[i])
return 0;
if (snack->x[snack->length - 1] == 24 && snack->y[snack->length - 1] == 13)
return 0;
if (snack->x[snack->length - 1] == 14 && snack->y[snack->length - 1] == 23)
return 0;
if (snack->x[snack->length - 1] == 35 && snack->y[snack->length - 1] == 20)
return 0;
if (snack->x[snack->length - 1] == 40 && snack->y[snack->length - 1] == 35)
return 0;
if (snack->x[snack->length - 1] == 70 && snack->y[snack->length - 1] == 6)
return 0;
if (snack->x[snack->length - 1] == 80 && snack->y[snack->length - 1] == 16)
return 0;
if (snack->x[snack->length - 1] == 60 && snack->y[snack->length - 1] == 45)
return 0;
if (snack->x[snack->length - 1] == 28 && snack->y[snack->length - 1] == 8)
return 0; }
return 1;}

//开始游戏
void start_game(){ unsigned char ch = 77;
//定义用于接收键盘输入的字符变量
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//定义显示器句柄变量
struct Snack s, * snack = &s;
struct Food f, * food = &f; make_frame(); intt_snack(snack);
print_food(hOut,snack, food);
while (1)
{ a[0] = snack->x[0];
//记住蛇尾的横坐标
a[1] = snack->y[0];
//记住蛇尾的竖坐标
 j = 0;
if (_kbhit())
{
 /* 判断是否按下键盘,如果按下,ch接收键盘输入 */
ch = _getch();
if (_kbhit())
{
/* 如果长按键盘,则加速 */
 Sleep(20);
j = 1; } }
 switch (ch)
 {
 case 72:
 {
  /* 向上移动 */
  move_snack(hOut, snack);
  //移动蛇
  snack->y[snack->length - 1] -= 1;
  //蛇头的竖坐标向上移,即减1
 break;
 }
 case 80:
 {
  /* 向下移动 */
  move_snack(hOut, snack);
  //移动蛇
  snack->y[snack->length - 1] += 1;
  //蛇头的竖坐标向下移,即加1
 break;
 }
 case 75: {
  /* 向左移动 */
  move_snack(hOut, snack);
  //移动蛇
  snack->x[snack->length - 1] -= 2;
  //蛇头的横坐标向左移,即减2
 break;
 }
 case 77:
 {
  /* 向右移动 */
  move_snack(hOut, snack);
  //移动蛇
  snack->x[snack->length - 1] += 2;
  //蛇头的横坐标向右移,即加2
  break; } }
 through_wall(hOut, snack, ch);
 eat_food(hOut, snack, food);
 //吃食物
 print_snack(hOut, snack);
 //打印蛇
 if (snack_die(snack) == 0)
 {
  /* 游戏结束条件:1.蛇碰到自身 2.按Esc键 3.速度为50ms */
  gotoxy(hOut, 15, 15);
  printf("Game Over"); Sleep(1000);
  break;
 }
 if(j == 0)
 {
  Sleep(snack->speed);
 //延迟时间
 }
 else
 {
  Sleep(10);
 }
}
}

void start_game2(){ unsigned char ch = 77;
//定义用于接收键盘输入的字符变量
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//定义显示器句柄变量
struct Snack s, * snack = &s; struct Food f, * food = &f;
make_frame2();
intt_snack2(snack);
print_food(hOut, snack, food);
while (1) { a[0] = snack->x[0];
//记住蛇尾的横坐标
a[1] = snack->y[0];
//记住蛇尾的竖坐标
j = 0; if (_kbhit())
{
 /* 判断是否按下键盘,如果按下,ch接收键盘输入 */
 ch = _getch();
 if (_kbhit()) {
 /* 如果长按键盘,则加速 */
 Sleep(20); j = 1; } }
switch (ch) {
case 72: {
 /* 向上移动 */
 move_snack(hOut, snack);
 //移动蛇
 snack->y[snack->length - 1] -= 1;
 //蛇头的竖坐标向上移,即减1
break;
} case 80: {
 /* 向下移动 */
 move_snack(hOut, snack);
 //移动蛇
 snack->y[snack->length - 1] += 1;
 //蛇头的竖坐标向下移,即加1
break; } case 75: {
 /* 向左移动 */
 move_snack(hOut, snack);
 //移动蛇
 snack->x[snack->length - 1] -= 2;
 //蛇头的横坐标向左移,即减2
break; } case 77: {
 /* 向右移动 */
 move_snack(hOut, snack);
 //移动蛇
 snack->x[snack->length - 1] += 2;
 //蛇头的横坐标向右移,即加2
 break; } }
through_wall2(hOut, snack, ch);
eat_food(hOut, snack, food);
//吃食物
print_snack(hOut, snack);
//打印蛇
if (snack_die2(snack) == 0)
{
 /* 游戏结束条件:1.蛇碰到自身 2.按Esc键 3.速度为50ms */
 gotoxy(hOut, 30, 18);
 printf("Game Over");
 Sleep(1000);
 break; }
if (j == 0) { Sleep(snack->speed);
//延迟时间
}
else { Sleep(10); } }}
void choose()
{ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
void start_game();
 void start_game2();
 void over_game();
 int n;
gotoxy(hOut, 10, 20);
printf("Continue [1]");
gotoxy(hOut, 30, 20);
 printf("Continue [2]");
gotoxy(hOut, 50, 20);
 printf("Exit [3]");
 gotoxy(hOut, 70, 20);
printf("选择:");
scanf_s("%d", &n);
switch (n)
{ case 1: system("cls");
start_game();
over_game();
break;
case 2:
system("cls");
start_game2();
over_game();
break;
case 3:
exit(0);
break;
default:
 printf("※※您的输入有误,请重新输入※※");
 system("pause >nul"); over_game();
 choose(); break; }}

/******结束菜单*******************************************************************/
void over_game()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 system("cls");
 printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n");
 choose();
 system("pause");
}
void main(){
 menu();
 start_game();
 //开始游戏
 start_game2();
 //开始游戏
 over_game();
 //结束游戏
}

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

(0)

相关推荐

  • C语言实现贪吃蛇游戏

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

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

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

  • 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

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

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

  • C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为移动数组的操作,将吃食物增加蛇身体长度的操作转换为在数组后面追加元素的操作. 2.移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,然后擦去蛇的最后一节,最后确定蛇头的方向,再绘制一个蛇头.这样就会显示一个移动效果. 3.身体增加效果:每次移动时候,判断蛇头是否碰到了食物,如果碰到了食

  • 基于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语言手把手教你实现贪吃蛇AI(上)

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

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

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

  • C语言实现贪吃蛇游戏代码

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 //------------------------------------------problm区------------------------------ //①思考typedef 定义的变量如何利用fwrite进行存储 //②典型可利用sleep()语句类实现控制移动速度 //③BOOL PlaySoundW(LPCWSTR, HMODULE, DWORD)": 无法将参数 1 从"const ch

随机推荐