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("蛇"); //******** 打印蛇头 else printf("口"); //******** 打印蛇身 } 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("蛇"); //******** 打印蛇头 else printf("口"); //******** 打印蛇身 } 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 图形库