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 图形库