贪吃蛇游戏——C语言双向链表实现
采用了双向链表结点来模拟蛇身结点;
通过C语言光标控制函数来打印地图、蛇身和食物;
- /**************************
- ***************************
- 贪吃蛇游戏
- C语言数据结构
- 作者:Dew
- 时间:2019年3月23日
- 版本:1.0
- ***************************
- **************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <Windows.h>
- #include <conio.h>
- #define N 30
- #define TRUE 1
- #define FALSE 0
- #define TIME 300
- #define LEFT 37
- #define UP 38
- #define RIGHT 39
- #define DOWN 40
- void initMap();
- void showGame();
- void initSnake();
- void control(int key);
- void updateSnake(int next_head_x, int next_head_y);
- void gotoxy(int x, int y); //光标控制
- void gameRun();
- void moveUp();
- void moveDown();
- void moveLeft();
- void moveRight();
- void createFood();
- void addSnakeNode(int cur_tail_x, int cur_tail_y);
- void crashTest(int head_x, int head_y);
- struct snakeNode {
- int pos_x;
- int pos_y;
- snakeNode* pre;
- snakeNode* next;
- };
- struct foodNode {
- int pos_x;
- int pos_y;
- };
- int map[N][N];
- int keyPress;
- int key;
- int next_head_x, next_head_y;
- int cur_tail_x, cur_tail_y;
- snakeNode* snake_head = (snakeNode *)malloc(sizeof(snakeNode));
- snakeNode* snake_tail = (snakeNode *)malloc(sizeof(snakeNode));
- foodNode* food = (foodNode *)malloc(sizeof(foodNode));
- int main()
- {
- initSnake();
- initMap();
- gameRun();
- return 0;
- }
- void initMap()
- {
- int i, j;
- for(i = 0; i < N; i++)
- for (j = 0; j < N; j++)
- {
- if (i == 0 || i == N - 1)
- map[i][j] = 1;
- else if (j == 0 || j == N - 1)
- map[i][j] = 1;
- else
- map[i][j] = 0;
- }
- }
- void showGame()
- {
- int i, j;
- for (i = 0; i < N; i++)
- {
- for (j = 0; j < N; j++)
- {
- if (map[i][j] == 1) {
- gotoxy(j*2, i);
- printf("□");
- }
- else if (map[i][j] == 0) {
- gotoxy(j*2, i);
- printf(" ");
- }
- }
- printf("\n");
- }
- gotoxy(snake_head->pos_y * 2, snake_head->pos_x);
- printf("●");
- gotoxy(snake_tail->pos_y * 2, snake_tail->pos_x);
- printf("●");
- gotoxy(food->pos_y * 2, food->pos_x);
- printf("◇");
- }
- void initSnake()
- {
- snake_head->pos_x = 15;
- snake_head->pos_y = 15;
- snake_head->pre = NULL;
- snake_head->next = snake_tail;
- snake_tail->pre = snake_head;
- snake_tail->pos_x = snake_tail->pre->pos_x + 1;
- snake_tail->pos_y = snake_tail->pre->pos_y;
- snake_tail->next = NULL;
- food->pos_x = rand() % 28 + 1;
- food->pos_y = rand() % 28 + 1;
- }
- void control(int direction)
- {
- if (direction == UP)
- {
- moveUp();
- }
- else if (direction == DOWN)
- {
- moveDown();
- }
- else if (direction == LEFT)
- {
- moveLeft();
- }
- else if (direction == RIGHT)
- {
- moveRight();
- }
- }
- void updateSnake(int next_head_x, int next_head_y)
- {
- snakeNode* p = snake_tail;
- while (p != snake_head)
- {
- p->pos_x = p->pre->pos_x;
- p->pos_y = p->pre->pos_y;
- p = p->pre;
- }
- p->pos_x = next_head_x;
- p->pos_y = next_head_y;
- }
- void gotoxy(int x, int y)
- {
- COORD pos;
- HANDLE hOutput;
- pos.X = x;
- pos.Y = y;
- hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
- SetConsoleCursorPosition(hOutput, pos);
- }
- void gameRun()
- {
- showGame();
- control(UP);
- while (TRUE)
- {
- if (GetAsyncKeyState(VK_RIGHT))
- {
- control(RIGHT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_LEFT))
- {
- control(LEFT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_UP))
- {
- control(UP);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_DOWN))
- {
- control(DOWN);
- Sleep(TIME);
- }
- }
- }
- void moveUp()
- {
- while (TRUE)
- {
- next_head_x = snake_head->pos_x - 1;
- next_head_y = snake_head->pos_y;
- cur_tail_x = snake_tail->pos_x;
- cur_tail_y = snake_tail->pos_y;
- updateSnake(next_head_x, next_head_y);
- gotoxy(next_head_y * 2, next_head_x);
- printf("●");
- crashTest(next_head_x, next_head_y);
- if (next_head_x == food->pos_x && next_head_y == food->pos_y)
- {
- addSnakeNode(cur_tail_x, cur_tail_y);
- createFood();
- }
- else
- {
- gotoxy(cur_tail_y * 2, cur_tail_x);
- printf(" ");
- }
- Sleep(TIME);
- if (GetAsyncKeyState(VK_RIGHT))
- {
- control(RIGHT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_LEFT))
- {
- control(LEFT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_UP))
- {
- control(UP);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_DOWN))
- {
- continue;
- }
- }
- }
- void moveDown()
- {
- while (TRUE)
- {
- next_head_x = snake_head->pos_x + 1;
- next_head_y = snake_head->pos_y;
- cur_tail_x = snake_tail->pos_x;
- cur_tail_y = snake_tail->pos_y;
- updateSnake(next_head_x, next_head_y);
- gotoxy(next_head_y * 2, next_head_x);
- printf("●");
- crashTest(next_head_x, next_head_y);
- if (next_head_x == food->pos_x && next_head_y == food->pos_y)
- {
- addSnakeNode(cur_tail_x, cur_tail_y);
- createFood();
- }
- else
- {
- gotoxy(cur_tail_y * 2, cur_tail_x);
- printf(" ");
- }
- Sleep(TIME);
- if (GetAsyncKeyState(VK_RIGHT))
- {
- control(RIGHT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_LEFT))
- {
- control(LEFT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_UP))
- {
- continue;
- }
- else if (GetAsyncKeyState(VK_DOWN))
- {
- control(DOWN);
- Sleep(TIME);
- }
- }
- }
- void moveLeft()
- {
- while (TRUE)
- {
- next_head_x = snake_head->pos_x;
- next_head_y = snake_head->pos_y - 1;
- cur_tail_x = snake_tail->pos_x;
- cur_tail_y = snake_tail->pos_y;
- updateSnake(next_head_x, next_head_y);
- gotoxy(next_head_y * 2, next_head_x);
- printf("●");
- crashTest(next_head_x, next_head_y);
- if (next_head_x == food->pos_x && next_head_y == food->pos_y)
- {
- addSnakeNode(cur_tail_x, cur_tail_y);
- createFood();
- }
- else
- {
- gotoxy(cur_tail_y * 2, cur_tail_x);
- printf(" ");
- }
- Sleep(TIME);
- if (GetAsyncKeyState(VK_RIGHT))
- {
- continue;
- }
- else if (GetAsyncKeyState(VK_LEFT))
- {
- control(LEFT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_UP))
- {
- control(UP);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_DOWN))
- {
- control(DOWN);
- Sleep(TIME);
- }
- }
- }
- void moveRight()
- {
- while (TRUE)
- {
- next_head_x = snake_head->pos_x;
- next_head_y = snake_head->pos_y + 1;
- cur_tail_x = snake_tail->pos_x;
- cur_tail_y = snake_tail->pos_y;
- updateSnake(next_head_x, next_head_y);
- gotoxy(next_head_y * 2, next_head_x);
- printf("●");
- crashTest(next_head_x, next_head_y);
- if (next_head_x == food->pos_x && next_head_y == food->pos_y)
- {
- addSnakeNode(cur_tail_x, cur_tail_y);
- createFood();
- }
- else
- {
- gotoxy(cur_tail_y * 2, cur_tail_x);
- printf(" ");
- }
- Sleep(TIME);
- if (GetAsyncKeyState(VK_RIGHT))
- {
- control(RIGHT);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_LEFT))
- {
- continue;
- }
- else if (GetAsyncKeyState(VK_UP))
- {
- control(UP);
- Sleep(TIME);
- }
- else if (GetAsyncKeyState(VK_DOWN))
- {
- control(DOWN);
- Sleep(TIME);
- }
- }
- }
- void createFood()
- {
- food->pos_x = rand() % 28 + 1;
- food->pos_y = rand() % 28 + 1;
- gotoxy(food->pos_y * 2, food->pos_x);
- printf("◇");
- }
- void addSnakeNode(int cur_tail_x, int cur_tail_y)
- {
- snakeNode* tempNode = (snakeNode *)malloc(sizeof(snakeNode));
- tempNode->pos_x = cur_tail_x;
- tempNode->pos_y = cur_tail_y;
- tempNode->next = NULL;
- snake_tail->next = tempNode;
- tempNode->pre = snake_tail;
- snake_tail = tempNode;
- }
- void crashTest(int head_x, int head_y)
- {
- snakeNode* p = snake_head->next;
- while (p != NULL)
- {
- if (p->pos_x == head_x && p->pos_y == head_y)
- {
- gotoxy(32 * 2, 15);
- printf("...发生撞击!......游戏结束...");
- getchar();
- }
- if (p->pos_x == 1 || p->pos_x == N - 2 || p->pos_y == 1 || p->pos_y == N - 2)
- {
- gotoxy(32 * 2, 15);
- printf("...发生撞击!......游戏结束...");
- getchar();
- }
- p = p->next;
- }
- }
贪吃蛇游戏——C语言双向链表实现的更多相关文章
- 基于EasyX库的贪吃蛇游戏——C语言实现
接触编程有段时间了,一直想学习怎么去写个游戏来练练手.在看了B站上的教学终于可以自己试试怎么实现贪吃蛇这个游戏了.好了,废话不多说,我们来看看如何用EasyX库来实现贪吃蛇. 一.准备 工具vc++6 ...
- 贪吃蛇游戏C语言源代码学习
源代码下载地址为:www.clang.cc 阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include< ...
- 【C语言项目】贪吃蛇游戏(上)
目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...
- 贪吃蛇游戏(printf输出C语言版本)
这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...
- 使用Love2D引擎开发贪吃蛇游戏
今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 100行JS实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
随机推荐
- .NET core2.0 发布至IIS中
.NET CORE和asp.net 发布时不太一样,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角 ...
- 安装WebLogic失败,出现”[VALIDATION] [ERROR]:INST-07004: Oracle 主目录(O) 位置包含一个或多个无效字符“解决方案
题如图 解决方案: 在管理员cmd窗口定位到jdk bin目录,然后输入以下命令 java -jar F:\java\fmw_12.2.1.3.0_wls_quick_Disk1_1of1\fmw_1 ...
- OSI模型网络七层协议
物理层 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 1.1媒体和互连设备 物理层的媒体包括架空明线. ...
- Neutron路由篇:L3 agent+Namespace
Neutron 的路由服务是由 l3 agent 提供的. 除此之外,l3 agent 通过 iptables 提供 firewall 和 floating ip 服务. l3 agent 需 ...
- JavaScript加载次序问题
3个文件,一个index.html如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...
- [转帖]Qemu 简述
Qemu 简述 记得KVM 就是 底层用的qemu https://www.cnblogs.com/bakari/p/7858029.html 本文首发于我的公众号 Linux云计算网络(id: cl ...
- js 解决两值交换
总结七种办法来交换a和b的变量值 交换变量值方案一 最最最简单的办法就是使用一个临时变量了 不过使用临时变量的方法实在是太low了 var t; t = a; a = b; b = t; 首先把a ...
- servlet(4)异常处理
一.异常处理 当一个 Servlet 抛出一个异常时,处理异常的servlet可以从HttpServletRequest里面得到几个属性,如下: 1.javax.servlet.error.statu ...
- CF 1119C Ramesses and Corner Inversion
https://codeforces.com/problemset/problem/1119/C 题目 给两个矩阵,只能选宽和高大于等于2的子矩阵左上.左下.右上.右下四点翻转(1->0,0-& ...
- python+ffmpeg切割视频
什么是ffmpeg 1.1 简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包 ...