手敲最基础C语言代码----“贪吃蛇”

article/2025/9/30 10:48:43

C语言创作游戏----第二弹----贪吃蛇(无限吃)


 主函数系列:

        创建引入头文件----方便查看代码!!

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<graphics.h>
#include"贪吃蛇.h"int main()
{//设置cmd窗口的名字!system("title 无限吃!");//生成随机数种子!srand((size_t)time(NULL));/**************************  光标的清除   *************************************/CONSOLE_CURSOR_INFO cursor;						 //定义光标信息的结构体变量cursor.dwSize = sizeof(cursor);				   	 //检测光标大小cursor.bVisible = FALSE;						 //将光标设置为不可见HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台信息SetConsoleCursorInfo(handle, &cursor);			 //设置光标信息
/******************************************************************************//*******************************//****	主函数列表:		    ****/Init_wall();		/****		初始化界面		****/Init_food();		/****		食物的初始化	    ****/Init_snake();		/****		蛇的定义		    ****/Play_game();		/****		游戏基本操作	    ****/system("cls");		/*******************************/printf(">>>>	持续优化中....	<<<<\n");printf(">>>>	敬请期待....	<<<<\n");return 0;
}

 定义全局变量:
            设置蛇所有定义:            
                    1*身体坐标        (X-Y)  
                     2*身体长度        (size) 
                     3*身体大小范围  (60*20)  
           图形界面:                   
                    高 x 长:20 x 60        
           定义食物:(二维数组)      
                    food[0]== X 坐标;
                    food[1]== Y 坐标;   

struct Body
{int x;int y;
};
struct Snake
{int size;struct Body body[60 * 20];
}snake;
void Init_snake()
{//蛇头snake.body[0].x = 30;snake.body[0].y = 10;//蛇身子snake.size = 2;snake.body[1].x = 29;snake.body[1].y = 10;
}	int food[2] = { 0 };
//int scoure = 0;-----分数定义为全局变量void Init_food()
{food[0] = rand() % 56 + 2;food[1] = rand() % 14 + 2;
}
//************		定义蛇的移动增量----1 / -1
int dx = 0;
int dy = 0;
//*************		定义尾巴坐标为空——方便蛇移动的同时,坐标之间的转换!!!
int px = 0;
int py = 0;

 对于图标信息的显示:

        px/py:全局变量中提前定义为空-----方便蛇身增长时,身体坐标的转变!!!

        Set Console Cursor Position:设置 控制台 光标 位置(合成词)


//************		显示图标信息界面!!!
void Show_UI()
{COORD coord;coord.X = px;coord.Y = py;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("  ");for (int i = 0; i < snake.size; i++){coord.X = snake.body[i].x;coord.Y = snake.body[i].y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);if (i == 0)printf("蛇"); //********	打印蛇头elseprintf("口"); //********	打印蛇身}coord.X = food[0];coord.Y = food[1];SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("▲");
}

 墙体的打印设置:

        一个中文字会占两个字符!

//***********		打印墙体!!!
void Init_wall()
{int map[20][30] = { 0 };for (int i = 0; i < 22; i++){for (int j = 0; j < 32; j++){if (i == 0 || i == 21){printf("墙");}else if (j == 0 || j == 31){printf("墙");}else{printf("  ");//两个字符!}}printf("\n");}
}

 游戏的操作设置:
        蛇的移动:        
                1*获取持续移动操作! 
                2*坐标增减量实现对坐标方向的转换 

//***********		玩游戏操作!!!
void Play_game()
{		/*********************		处于有效界面内操作		*****************/char move = 'd';while (snake.body[0].x > 1 && snake.body[0].x < 60&& snake.body[0].y > 0 && snake.body[0].y < 21){/*********************			显示界面			*******************/Show_UI();while (_kbhit()){move = _getch();}switch (move){case'w':	dx = 0; dy = -1;	break;case'a':	dx = -1; dy = 0;	break;case's':	dx = 0; dy = 1;		break;case'd':	dx = 1; dy = 0;		break;default:break;}/*********************	 判断蛇头是否会咬自己身子!	*****************/for (int i = 1; i < snake.size; i++){if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y){return;}}/*********************		 当蛇吃到食物时!		*****************/if (snake.body[0].x == food[0] && snake.body[0].y == food[1]){snake.size++;Init_food();//scoure += 10;-----分数增加的位置!!!!}/*********************		 蛇的身体增长		*****************/px = snake.body[snake.size - 1].x;py = snake.body[snake.size - 1].y;for (int i = snake.size - 1; i > 0; i--){//*************    snake.size 初始值为 2;body[0] + body[1]snake.body[i].x = snake.body[i - 1].x;snake.body[i].y = snake.body[i - 1].y;}snake.body[0].x += dx;snake.body[0].y += dy;//*********   设置蛇的速度!Sleep(100);}
}

头文件系列汇总:

        坐标体系/地图大小/蛇身大小限制-----可自由定义!!!

#pragma once
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<graphics.h>/***********************************************************************/
/*****************	 设置蛇所有定义:					    ****************/
/*****************	 		1*身体坐标		(X-Y)		****************/
/*****************	 		2*身体长度		(size)	    ****************/
/*****************	 		3*身体大小范围  (60*20)	    ****************/
/*****************	 图形界面:							****************/
/*****************			高 x 长:20 x 60			    ****************/
/*****************	 定义食物:(二维数组)				    ****************/
/*****************			food[0]== X 坐标;			****************/
/*****************			food[1]== Y 坐标;			****************/
/***********************************************************************/struct Body
{int x;int y;
};
struct Snake
{int size;struct Body body[60 * 20];
}snake;
void Init_snake()
{//蛇头snake.body[0].x = 30;snake.body[0].y = 10;//蛇身子snake.size = 2;snake.body[1].x = 29;snake.body[1].y = 10;
}	int food[2] = { 0 };
//int scoure = 0;-----分数定义为全局变量void Init_food()
{food[0] = rand() % 56 + 2;food[1] = rand() % 14 + 2;
}
//************		定义蛇的移动增量----1 / -1
int dx = 0;
int dy = 0;
//*************		定义尾巴坐标为空——方便蛇移动的同时,坐标之间的转换!!!
int px = 0;
int py = 0;//************		显示图标信息界面!!!
void Show_UI()
{COORD coord;coord.X = px;coord.Y = py;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("  ");for (int i = 0; i < snake.size; i++){coord.X = snake.body[i].x;coord.Y = snake.body[i].y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);if (i == 0)printf("蛇"); //********	打印蛇头elseprintf("口"); //********	打印蛇身}coord.X = food[0];coord.Y = food[1];SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("▲");
}//***********		打印墙体!!!
void Init_wall()
{int map[20][30] = { 0 };for (int i = 0; i < 22; i++){for (int j = 0; j < 32; j++){if (i == 0 || i == 21){printf("墙");}else if (j == 0 || j == 31){printf("墙");}else{printf("  ");//两个字符!}}printf("\n");}
}//***********		玩游戏操作!!!
void Play_game()
{		/*********************		处于有效界面内操作		*****************/char move = 'd';while (snake.body[0].x > 1 && snake.body[0].x < 60&& snake.body[0].y > 0 && snake.body[0].y < 21){/*********************			显示界面			*******************/Show_UI();/*******************************************************************//***************  蛇的移动:				            ****************//***************	  1*获取持续移动操作!	            ****************//***************      2*坐标增减量实现对坐标方向的转换  ****************//******************************************************************/while (_kbhit()){move = _getch();}switch (move){case'w':	dx = 0; dy = -1;	break;case'a':	dx = -1; dy = 0;	break;case's':	dx = 0; dy = 1;		break;case'd':	dx = 1; dy = 0;		break;default:break;}/*********************	 判断蛇头是否会咬自己身子!	*****************/for (int i = 1; i < snake.size; i++){if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y){return;}}/*********************		 当蛇吃到食物时!		*****************/if (snake.body[0].x == food[0] && snake.body[0].y == food[1]){snake.size++;Init_food();//scoure += 10;-----分数增加的位置!!!!}/*********************		 蛇的身体增长		*****************/px = snake.body[snake.size - 1].x;py = snake.body[snake.size - 1].y;for (int i = snake.size - 1; i > 0; i--){//*************    snake.size 初始值为 2;body[0] + body[1]snake.body[i].x = snake.body[i - 1].x;snake.body[i].y = snake.body[i - 1].y;}snake.body[0].x += dx;snake.body[0].y += dy;//*********   设置蛇的速度!Sleep(100);}
}


        以上就是贪吃蛇内核代码!

        具体优化方式:

                利用工具---Easyx 图形库

 


http://chatgpt.dhexx.cn/article/fTftlcJ0.shtml

相关文章

创建链表和遍历链表算法演示

#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void traverse_list(pNode pHead); int…

C++ 创建链表

本文旨在解决两个问题&#xff1a; 1、如何写一个创建链表函数 2、为什么对于单个节点必须要new&#xff0c;而不能使用& 1、如何写一个创建链表函数 代码如下 ListNode* createListNode(vector<int> input) {ListNode dummy ListNode(-1);ListNode* pre &d…

单链表创建

单链表的创建与操作 链表作为基本的数据结构&#xff0c;学习好链表的创建与操作是数据结构入门的基础。 &#xff08;小白make for myself&#xff09; 单链表的创建 typedef struct Node {int data;struct Node* next; }Node;//结构体创建&#xff0c;也可以使用*Node取址…

动态链表的创建

#include <stdio.h> //List结构样式 typedef struct node { int data; struct node *next; }Node; //创建head的空链 Node *createList() { Node *head (Node *)malloc(sizeof(Node)); if(NULL head) exit(-1); head->next NULL; return head; } Node *insertList(…

C++创建一个链表

这个是在参加面试的时候遇到的题目&#xff0c;说句实话&#xff0c;我当时不懂。 后面查了资料&#xff0c;里面写的比较仔细就不多说了。 #include <iostream> using namespace std; struct node {int data;node* next;node(int data, node* next NULL) {this->d…

如何在Python中创建与使用链表(单链表)

如何在Python中创建与使用链表&#xff08;单链表&#xff09; 最近用Python语言在Leetcode中刷题&#xff0c;接触到不少关于链表的题&#xff0c;学校目前还没有开设数据结构的课程&#xff08;开设的话应该也是以C/C语言写的&#xff09;。 因为不太了解链表使用方式&#…

循环链表的创建

循环链表的创建以及基本操作 上篇我们讲了运用头插法和尾插法创建单链表的方法&#xff0c;和两种方法的比较。 接着我们学习循环链表的创建。 只要学会了单链表的创建&#xff0c;循环链表的创建就变得很简单。 循环链表创建 单链表的结构&#xff1a; 循环链表&#xff1a…

单链表的创建

单链表类型定义 单链表是由一串结点组成的&#xff0c;其中每个结点都包含指向下一个结点的指针&#xff0c;最后一个结点的指针为空&#xff1b; 假设结点只包括一个整数和指向下一结点的指针 typedef struct node{int data;struct node *next; }LNode,*LinkList; //LNode为…

创建双向链表(详解)

双向链表操作 在学习了单链表之后&#xff0c;就顺带学习了双链表的操作。 什么是双链表&#xff1f; 双链表顾名思义&#xff0c;就是链表由单向的链变成了双向链。 使用这种数据结构&#xff0c;我们可以不再拘束于单链表的单向创建于遍历等操作&#xff0c;大大减少了在使…

如何构建一个简单链表

如何构建一个简单链表 一、 含构造函数和默认实参的结构体 typedef struct node {int data;struct node* next;node(int data 0, struct node* next NULL): data(data), next(next) {}} node; 二、 创建一个一定长度的链表 (一) 错误样例&#xff1a; int n 3;node* head …

C++:创建链表的过程详解

创建链表的过程详解 本人是一名刚开始学习算法的小白&#xff0c;今天遇到了一些关于链表的创建问题&#xff0c;查了一些资料&#xff0c;我把它们整理了一下&#xff0c;希望大家多多指教。 整体的代码&#xff1a; #include<iostream> using namespace std;struct …

链表的创建与使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、链表是什么&#xff1f; 二、链表的创建与基本操作 1.链表的创建 3.链表的头插 4.链表的尾插 5.链表的销毁 6.链表的查找 7.链表的删除…

链表的创建

目录 一&#xff1a;链表的定义 二&#xff1a;链表的改进 链表的实现可以为后面JAVA的类集框架服务。 链表是一种最简单的数据结构&#xff0c;其主要目的是依靠引用关系实现多个数据的保存。 一&#xff1a;链表的定义 定义一个Node类&#xff0c;保存的数据是String型&a…

C语言之创建链表

自己琢磨着思考了一下书上的单链表的创建案例&#xff0c;记录一下自己的理解 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>struct Student{char cName[20];int age;struct Student* pNext; }; /*节点数量*/ int iCount0;/*创建链表的函数 返回头…

如何创建链表?

链表&#xff1a; 链表的组成其实很简单&#xff0c;就是由很多结点组成的。 一个结点包含数据域和指针域&#xff0c;数据域用来存放数据&#xff0c;指针域负责指向其他结点&#xff0c;起到链接的作用。创建链表&#xff1a; 其实创建一个链表也很简单&#xff0c;在我看来…

用CodeBlocks写SFML程序

vs2019 写sfml程序简直杀鸡用牛刀&#xff0c;vs2019占用资源太大了。 所以我想到了用Dev-C&#xff0c;然而我不会配置&#xff0c;卑鄙的CSDN相关资料查阅需要VIP&#xff0c;然而VIP太贵了。 SFML官方教程是用Code::Blocks&#xff0c;于是去下一个。 setup安装........ …

[笔记]使用SFML来生成分形图片

前言 最近在上《优秀科普纪录片》时&#xff0c;看了一部有关 分形 的纪录片&#xff0c;在观看的过程中&#xff0c;想着自己也来生成一些分形图片&#xff0c;正好偶然了解到了SFML这个简单的图形库&#xff0c;所以天时地利人和&#xff0c;正好查一些资料来学习一下。 以…

SFML环境配置

材料&#xff1a; 1.visual studio 2017 2.SFML-2.5.1-windows-vc15-32-bit 准备阶段 1.进入SFML官网下载sfml-vs2017-32bit版本 2.将该压缩包解压在一个文件夹中 步骤&#xff1a; 1.进入vs&#xff0c;在上述文件夹中新建Empty Project&#xff0c;右键资源文件->添加-…

[SFML] 多个OpenGL上下文

代码 #include <iostream> #include <gl/glew.h> #include <SFML/Graphics.hpp> #include <windows.h>int main() {auto getInstance [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug [](GLenum source, GLenum type, GLuint id, GL…

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…