C语言实现贪吃蛇游戏

最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已。

我的代码是在Windows下运行的,因为需要用到windows.h这个库。

然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了。
好了,直接上代码吧:

1)头文件和宏定义

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>

#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ''
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

2)各种实现函数的声明

/*snake stepping: dy = -1(up) 1(dowm) 0(no move); dx = -1(left), 1(right), 0(no move)*/
void snakemove(int, int);
//to write dowm the current location of the snake
void put_money(void);
void output(void);
 // to put the current map on the screen
void initial_the_game(void);
void put_accelerate(void);
// @ is a special food which can speed up your snake.
int judge(int, int);
/* when it comes to ai, it is used to judge whether the next step is movable. */
int dis(int, int);
// when it coomes to ai, it is used to calculate the current distence //between the snake head and the food.
void welcome(void);  // the game introduction.
void gameover(void);
void edition_handed(void);
// the edition in which you can play by yourself.
void edition_presentation(void);
// the edition in which the snake can go automatically.

3)各种全局变量

// define vars for snake,notice name of vars in c
int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};
int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};
int snakeLength = 5;
int gamestate = 1;
int current_speed = 600;
int score = 0;
char edition_choose; // for player to choose the edition.
int con = 1; // to judge the initial state of the game;
int energy = 0; // write down the condition to accelerate by eating $.

//the following part is to realize the simple ai .
const char movable[4] = {'a', 'd', 's', 'w'};
int distance[4] = {9999, 9999, 9999, 9999};
int fx = 6, fy = 6; // the coordinate of the food $

4)地图

char map[12][12] =
 {"************",
 "*XXXXH  *",
 "*   *",
 "*   *",
 "*   *",
 "*   *",
 "*  $ *",
 "*   *",
 "* @  *",
 "*   *",
 "*   *",
 "************"};

5)主函数(可选模式)

int main() {
 while (con) {
  welcome();
  int flag = 1;
  while (flag) {
   edition_choose = getch(); //choose the edition
   if (edition_choose == 'h') {
    edition_handed();
    flag = 0;
   }
   else if (edition_choose == 'p') {
    edition_presentation();
    flag = 0;
   }
   else {
    printf("Please press the correct bottom -,- ...\n");
   }
  }
  gameover();
 }
 return 0;
}

6)手动模式实现

void edition_handed(void) {
 system("cls");
 output();
 char ch = 'd';
 while (gamestate) {
  switch (ch) {
   case 'a': // go left
    while (1) {
     snakemove(-1, 0);
     Sleep(current_speed);
     if (gamestate == 0) // to break the loop if the snake hit the wall or itself.
      break;
     if (kbhit() != 0) { // to change the direction
      ch = getch();
     if (ch == 's' || ch == 'w')
      break;
     else
      ch = 'a';
     }
    }
    break;
   case 'd': // go right
    while (1) {
     snakemove(1, 0);
     Sleep(current_speed);
     if (gamestate == 0)
      break;
     if (kbhit() != 0)
      ch = getch();
     if (ch == 's' || ch == 'w')
      break;
     else
      ch = 'd';
    }
    break;
   case 's': // go down
    while (1) {
     snakemove(0, 1);
     Sleep(current_speed);
     if (gamestate == 0)
      break;
     if (kbhit() != 0)
      ch = getch();
     if (ch == 'a' || ch == 'd')
      break;
     else
      ch = 's';
    }
    break;
   case 'w': // go up
    while (1) {
     snakemove(0, -1);
     Sleep(current_speed);
     if (gamestate == 0)
      break;
     if (kbhit() != 0)
      ch = getch();
     if (ch == 'a' || ch == 'd')
      break;
     else
      ch = 'w';
    }
    break;
  }
  if (gamestate == 0)
   break;
 }
 return;
}

7)自动模式实现

void edition_presentation(void) { // for ai
 system("cls");
 int i, min = 10000;
 output();
 char ch;
 char quit = 'o';
 int k;
 while (gamestate) { // find the shortest way;
  min = 10000;
  if (judge(-1, 0)) distance[0] = dis(-1, 0);
  if (judge(1, 0)) distance[1] = dis(1, 0);
  if (judge(0, 1)) distance[2] = dis(0, 1);
  if (judge(0, -1)) distance[3] = dis(0, -1);
  for (i = 0; i < 4; i++) {
   if (min >= distance[i]) {
    min = distance[i];
    k = i;
   }
  }
  Sleep(current_speed);
  switch (movable[k]) {
   case 'a': // go left
    snakemove(-1, 0);
    break;
   case 'd': // go right
    snakemove(1, 0);
    break;
   case 's': // go down
    snakemove(0, 1);
    break;
   case 'w': // go up
    snakemove(0, -1);
    break;
  }
  if (gamestate == 0)
   break;
  system("cls");
   output();
 }
 return;
}

8)其他辅助函数

欢迎界面

void welcome(void) { // just for some introduction
 printf("WELCOME TO THE SNAKE'S WORLD !!!!\n");
 printf("\n");
 printf("\n");
 printf("Please choose the edition you want.\n");
 printf("\n");
 printf("\n");
 printf("The 'h' is for the hand-operated and the 'p' is for the simple presentation\n");
 printf("\n");
 printf("\n");
 printf("Attention: the presentation still has a liitle bug, while it can be moving right for a period of time...\n ");
 return;
}

游戏结束界面

void gameover(void) { // give you some introduction when you lose the game.
 system("cls");
 printf("Game over!!!\n");
 printf("Do you want to continue? y or n\n");
 char start; // in order to judge whether you still want to play the game.
 while (1) {
  start = getch();
  if (start == 'y') {
   system("cls");
   initial_the_game();
   break;
  } else if (start == 'n') {
   system("cls");
   con = 0; // in order to let the game end.
   printf("See you next time! ^-^\n");
   break;
  } else {
   printf("Please press the correct buttom.\n");
  }
 }
}

图像实现方式

void output(void) { // put the cuttent game map.
 printf("THE INTERESTING SNAKE GAME CREATED BY LONGJ =,=\n");
 printf("use w~s~a~d to control the snake's movement\n");
 printf("ATTENTION: the @ can speed up your lovely snake~~\n");
 int i, j;
 for (i = 0; i < 12; i++) {
  for (j = 0; j < 12; j++) {
   printf("%c", map[i][j]);
   if (j == 11)
    printf("\n");
  }
 }
 printf("Your current_speed is %d\n", current_speed);
 printf("The number of your food undigested is %d (when it comes to 5, your speed will be accelerated!) \n", energy);
 printf("SCORE = %d\n", score);
 return;
}

蛇的行走实现

void snakemove(int dx, int dy) { // all the conditions are comparing the head and the next position.
 int i;
 if (snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])
  return; // to prevent it go to itslef.
 if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == 'X') {
  gamestate = 0;
  return;
 }
 if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '*') {
  gamestate = 0;
  return;
 }
 if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == ' '
  || map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@') {
  map[snakeY[0]][snakeX[0]] = ' '; // clear the former_tail
  if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@'
  && current_speed > 100) { // what will happen when your snake eats the @
   current_speed -= 100;
   put_accelerate();
  }
  for (i = 0; i < snakeLength - 1; ++i) {
   snakeX[i] = snakeX[i + 1];
   snakeY[i] = snakeY[i + 1];
  }
  snakeX[snakeLength - 1] += dx;
  snakeY[snakeLength - 1] += dy;
  for (i = 0; i < snakeLength - 1; i++) // write down the current snake location
   map[snakeY[i]][snakeX[i]] = 'X';
  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H';
 }
 if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$') {
  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'X';
  snakeLength++;
  snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;
  snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;
  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H';
  score++;
  energy++;
  if (energy == 5 && current_speed > 50) {
   current_speed -= 50;
   energy = 0;
  }
  put_money();
 }
 system("cls");
 output();
 return;
}

食物放置的实现

void put_money(void) { /// ai will change the code
 int flag = 1;
 while (flag) {
  srand(time(NULL));
  fx = rand() % 12;
  fy = rand() % 12;
  if (map[fy][fx] == ' ') {
   map[fy][fx] = '$';
   flag = 0;
  }
  if (edition_choose == 'p') {
   int i;
   for (i = 0; i< 4; i++)
    distance[i] = 9999;
  }
 }
 return;
}

void put_accelerate(void) {
 int x, y, flag = 1;
 while (flag) {
  srand(time(NULL));
  x = rand() % 12;
  y = rand() % 12;
  if (map[x][y] == ' ') {
   map[x][y] = '@';
   flag = 0;
  }
 }
 return;
}

ai辅助函数

int dis(int dx, int dy) {
 return abs(fx - snakeX[snakeLength - 1] - dx) + abs(fy - snakeY[snakeLength - 1] - dy);
}

int judge(int dx, int dy) {
 if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == ' ')
  return 1;
 else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$')
  return 1;
 else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@')
  return 1;
 else
  return 0;
}

游戏over后的初始化函数:

void initial_the_game(void) {
 int i, j, count = 1;
 snakeLength = 5;
 gamestate = 1;
 fx = fy = 6;
 current_speed = 600;
 for (i = 0; i < 5; i++)
  snakeY[i] = 1;
 for (i = 0; i < 5; i++) {
  snakeX[i] = count++;
 }
 for (j = 0; j < 12; j++) {
  map[0][j] = '*';
  map[11][j] = '*';
 }
 for (i = 1; i < 11; i++) {
  map[i][0] = map[i][11] = '*';
  for (j = 1; j < 11; j++)
   map[i][j] = ' ';
 }
 map[fy][fx] ='$';
 map[8][4] = '@';
 for (i = 0; i< 4; i++) {
   distance[i] = 9999;
 }
 for (i = 0; i < 4; i++)
  map[snakeY[i]][snakeX[i]] = 'X';
 map[snakeY[4]][snakeX[4]] = 'H';
 return;
}

小结:

不难看出,c语言代码比较冗长,而且初始化的函数实现起来十分麻烦,稍有不慎就会全部出错,导致游戏无法持续玩下去,博主当初写的时候就是被坑了很久=_=

因而现在在学c++,希望以后把类的概念之类的东西都弄得更加熟练之后,可以去把这个冗长的c代码改成更加简洁,阅读性更强的c++代码。

(好的,已经更新了,写出了一个比较简单的C++贪吃蛇,的确是思路清晰很多,代码的可读性更高。)

这篇博客给那些想要用c来写贪吃蛇的同学一些参考,运行起来是没有问题的,可以选择性看:)

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

您可能感兴趣的文章:

  • C语言手把手教你实现贪吃蛇AI(下)
  • C语言手把手教你实现贪吃蛇AI(中)
  • 贪吃蛇C语言代码实现(难度可选)
  • C语言手把手教你实现贪吃蛇AI(上)
  • C语言贪吃蛇经典小游戏
  • C语言链表实现贪吃蛇游戏
  • C语言结构数组实现贪吃蛇小游戏
  • 基于C语言实现的贪吃蛇游戏完整实例代码
  • 70行C语言代码实现贪吃蛇
(0)

相关推荐

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

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

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

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

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

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

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

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

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

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

  • 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语言手把手教你实现贪吃蛇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语言入门者学习阅读. 程序可在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语言实现贪吃蛇游戏代码

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

  • C语言实现贪吃蛇游戏(单人版)

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 相比于第一个:贪吃蛇游戏,功能更加丰富 #include"snake.h" //蛇的移动 void move_snake(); //画出蛇 void draw_snake(); //产生食物 void creatfood(); //判断蛇是否吃到食物 void eatfood(); //判断蛇是否死掉 void SnakeState(); int main() { //设置窗口大小 system("

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

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 在读大学生一枚,五一期间用四天时间写一个小游戏. 本贪吃蛇游戏代码共计531行,开发环境是VS,游戏分为两种模式,标准模式和超大地图模式,详细看以下源代码,并进入游戏体验具体内容. //贪吃蛇 #include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> //游戏窗口 #define FrameX

  • C语言实现贪吃蛇游戏演示

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 IDE用的是 VS2019 先看效果 代码全览 game.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PLATFORM 1 //运行的系统 1为win 0为lin

  • C语言实现贪吃蛇游戏

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

  • C语言实现贪吃蛇游戏设计

    C语言实现贪吃蛇,供大家参考,具体内容如下 实验平台:DEV C++ /******************************************************************************** *File name:SnakeGame3.0.c *Description:贪吃蛇游戏源代码(C语言),采用 *宽度优先算法,计算蛇到食物的最短路径(时间复杂度n^3空间复杂度n^2),这个算法遇 * *到自身围困情况将失效,无法计算出最短路径 * *******

  • C语言实现贪吃蛇游戏(命令行)

    这是一个纯C语言写的贪吃蛇游戏,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<conio.h> #define SNAKE_LENGTH 100//定义蛇的最大长度 #define SCREEN_WIDETH 80 #define SCREEN_HEIGHT 30 //定义每一节蛇的坐标 struct

  • python语言实现贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 新手自学python(简易贪吃蛇代码) 环境python3.7 刚刚大学毕业进入工作岗位,发现同事基本都会写py脚本,于是自学了一下,并写了一个简单的贪吃蛇代码,我觉得写的还是比较容易看懂,适合新手接触python. # -*- coding: utf-8 -*- import tkinter as tk # 使用Tkinter前需要先导入 import tkinter.messagebox import pic

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

    本文实例为大家分享了C语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.最好用VS运行 2.用到的函数有:_kbhit _getch EasyX图形库内一系列函数 3.蛇身与食物用矩形画的 代码如下: #include<stdio.h> #include<graphics.h> //easyx头文件 #include<conio.h> #include<time.h> /********************设置各种属性*************

  • 利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行.那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动.那么我们就先来实现这个函数. gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用. gotoxy.h #includ

随机推荐