C语言贪吃蛇小游戏演示和说明

ops/2024/12/22 20:54:58/

C语言贪吃蛇小游戏演示和说明


设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。

游戏开始后,会在中间位置出现一条只有三个节点的贪吃蛇,并随机出现一个食物,如下图所示:


图1:游戏初始化


按下键盘上的任意一个键,贪吃蛇开始移动。和大部分游戏一样,你可以通过W、A、S、D四个键来控制移动方向,如下图所示:


图2:游戏进行中


当贪吃蛇出界或者撞到自己时,游戏结束,如下图所示:


图3:游戏结束

这个版本的贪吃蛇将有以下特点:

  • 使用控制台(终端)
  • ASCII字符表示蛇和食物
  • 方向控制(W, A, S, D)
  • 简单的游戏结束逻辑(蛇撞墙或撞到自己)

c
#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h> // 注意:这是特定于某些编译器的,如Borland C或Turbo C  
#include <windows.h> // 用于Sleep函数  #define WIDTH 20  
#define HEIGHT 10  
#define SNAKE_LEN 100  typedef struct {  int x, y;  
} Point;  Point snake[SNAKE_LEN], food;  
int snakeSize = 3;  
int direction = 2; // 0: left, 1: up, 2: right, 3: down  
int gameOver = 0;  void initialize() {  for (int i = 0; i < WIDTH + 2; i++)  printf("#");  printf("\n");  for (int i = 0; i < HEIGHT; i++) {  for (int j = 0; j < WIDTH; j++)  printf(" ");  printf("#\n");  }  for (int i = 0; i < 3; i++) {  snake[i].x = WIDTH / 2 + i;  snake[i].y = HEIGHT / 2;  }  food.x = rand() % (WIDTH - 2) + 1;  food.y = rand() % (HEIGHT - 1) + 1;  while (snake[0].x == food.x && snake[0].y == food.y) {  food.x = rand() % (WIDTH - 2) + 1;  food.y = rand() % (HEIGHT - 1) + 1;  }  draw();  
}  void draw() {  system("cls");  for (int i = 0; i < WIDTH + 2; i++)  printf("#");  printf("\n");  for (int i = 0; i < HEIGHT; i++) {  for (int j = 0; j < WIDTH; j++) {  if (j == 0 || j == WIDTH - 1)  printf("#");  else if (i == snake[0].y && j == snake[0].x)  printf("O");  else {  int eat = 0;  for (int k = 0; k < snakeSize; k++)  if (snake[k].x == j && snake[k].y == i) {  printf("o");  eat = 1;  break;  }  if (!eat && i == food.y && j == food.x)  printf("F");  else  printf(" ");  }  }  printf("#\n");  }  for (int i = 0; i < WIDTH + 2; i++)  printf("#");  printf("\n");  
}  void input() {  if (_kbhit()) {  switch (_getch()) {  case 'w':  case 'W':  if (direction != 1) direction = 0;  break;  case 's':  case 'S':  if (direction != 0) direction = 1;  break;  case 'a':  case 'A':  if (direction != 3) direction = 2;  break;  case 'd':  case 'D':  if (direction != 2) direction = 3;  break;  }  }  
}  void move() {  Point head = snake[0];  switch (direction) {  case 0: head.x--; break;  case 1: head.y--; break;  case 2: head.x++; break;  case 3: head.y++; break;  }  // Check collision  if (head.x >= WIDTH || head.x < 0 || head.y >= HEIGHT || head.y < 0)  gameOver = 1;  for (int i = 1; i < snakeSize; i++)  if (snake[i].x == head.x && snake[i].y == head.y)  gameOver = 1;  for (int i = snakeSize - 1; i > 0; i--)  snake[i] = snake[i - 1];  snake[0] = head;  if (head.x == food.x && head.y == food.y) {  food.x = rand() % (WIDTH - 2) + 1;  food.y = rand() % (HEIGHT - 1) + 1;  snakeSize++;  while (snake[0].x == food.x && snake[0].y == food.y) {  food.x = rand() % (WIDTH - 2) + 1;  food.y = rand() % (HEIGHT - 1) + 1;  }  }  
}  int main() {  initialize();  while (!gameOver) {  input();  move();  draw();  Sleep(100); // 控制游戏速度  }  printf("Game Over!\n");  return 0;  
}

注意:

代码中使用了_kbhit()和_getch()函数,这些函数是特定于某些编译器的(如Borland C或Turbo C),在标准C库中并不包含。如果你使用的是GCC或其他不支持这些函数的编译器,你可能需要寻找替代方法(如使用curses库等)。
Sleep()函数用于Windows平台,如果你在其他平台上编译,可能需要替换为相应的函数(如usleep()在Unix/Linux上)。
 

演示程序百度网盘下载地址:百度网盘 请输入提取码  密码:u5ee


http://www.ppmy.cn/ops/117641.html

相关文章

探索 TensorFlow:构建强大的机器学习模型

探索 TensorFlow&#xff1a;构建强大的机器学习模型 TensorFlow&#xff0c;由Google开发并维护&#xff0c;是一个开源的机器学习库&#xff0c;广泛用于深度学习研究和生产。它提供了丰富的API和工具&#xff0c;使得构建、训练和部署复杂的机器学习模型变得简单而高效。在…

通过 LabVIEW 正则表达式读取数值(整数或小数)

在LabVIEW开发中&#xff0c;字符串处理是一个非常常见的需求&#xff0c;尤其是在处理包含复杂格式的数字时。本文通过一个具体的例子来说明如何利用 Match Regular Expression Function 和 Match Pattern Function 读取并解析字符串中的数字&#xff0c;并重点探讨这两个函数…

GNU链接器(LD):什么是符号?符号定义及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

【嵌入式】总结——Linux系统移植(二)

同上一篇&#xff0c;本篇是对这一阶段学习历程的总结&#xff0c;仅作参考。 引言 这算是学习嵌入式Linux的二阶段&#xff0c;这一阶段虽是裸机开发与linux开发的过渡篇&#xff0c;但这一阶段也非常容易劝退。就我个人经验而言&#xff0c;学完裸机驱动后不应该直接看这一阶…

Java——包装类及认识泛型

包装类&#xff1a; 在学习泛型之前我们一定要认识包装类。 在Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了一个包装类型。 除了int类型和char类型的包装类不是它们对应的基本类型…

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行

1. Unity3D介绍 Unity3D是虚拟现实行业中&#xff0c;使用率较高的一款软件。 它有着强大的功能&#xff0c;是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…

Dubbo和Http的调用有什么区别

背景 我们在项目开发中&#xff0c;需要进行调用外部接口时&#xff0c;往往使用Dubbo和Http方式都能实现远程调用。那么他们在使用上&#xff0c;有什么区别呢&#xff1f; 定位不同 一个是分布式环境下的框架&#xff0c;一个是通信协议。 Dubbo&#xff1a;是一种高性能的…

quill富文本插入表格quill-better-table

使用quill-better-table插件&#xff0c;官网GitCode - 全球开发者的开源社区,开源代码托管平台 安装 首先quill-better-table插件&#xff0c;官网有写需要 quills v2.0.0-dev3 我这里使用的是 quills v2.0.0-dev4&#xff0c;自行安装 然后就是安装我们的插件 quill-bett…