本文实例为大家分享了C语言制作贪吃蛇小游戏的具体代码,供大家参考,具体内容如下
直接上代码
- ?#include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <conio.h>
- #include <time.h>
- #include <windows.h>
- ?
- //MAXWIDTH、MAXHEIGHT、INITLEN 以字符记
- #define MAXWIDTH (30)
- #define MAXHEIGHT MAXWIDTH
- #define INITLEN (3) ?//贪吃蛇的初始长度?
- ?
- //程序中用到的各种字符,以及它们的颜色和类型(以数字表示)
- struct{
- ? ? char *ch;
- ? ? int color;
- ? ? char type;
- }
- charBorder = {"□", 4, 1}, ?//边框
- charBg = {"■", 2, 2}, ?//背景
- charSnake = {"★", 0xe, 3}, ?//贪吃蛇节点
- charFood = {"●", 0xc, 4}; ?//食物
- ?
- //用一个结构体数组保存地图中的各个点
- struct{
- ? ? char type;
- ? ? int index;
- }globalMap[MAXWIDTH][MAXHEIGHT];
- ?
- //贪吃蛇有效活动范围地图的索引
- struct{
- ? ? int x;
- ? ? int y;
- } snakeMap[ (MAXWIDTH-2)*(MAXHEIGHT-2) ], scoresPostion;
- ?
- int scores = 0; ?//得分
- int snakeMapLen = (MAXWIDTH-2)*(MAXHEIGHT-2);
- int headerIndex, tailIndex; ?//蛇头蛇尾对应的snakeMap中的索引(下标)
- HANDLE hStdin; ?//控制台句柄
- ?
- // 设置光标位置,x为行,y为列
- void setPosition(int x, int y){
- ? ? COORD coord;
- ? ? coord.X = 2*y;
- ? ? coord.Y = x;
- ? ? SetConsoleCursorPosition(hStdin, coord);
- }
- ?
- // 设置颜色
- void setColor(int color){
- ? ? SetConsoleTextAttribute(hStdin, color);
- }
- ?
- //创建食物
- void createFood(){
- ? ? int index, rang, x, y;
- ? ? //产生随机数,确定 snakeMap 数组的索引?
- ? ? srand((unsigned)time(NULL));
- ? ? if(tailIndex<headerIndex){
- ? ? ? ? rang = headerIndex-tailIndex-1;
- ? ? ? ? index = rand()%rang + tailIndex + 1;
- ? ? }else{
- ? ? ? ? rang = snakeMapLen - (tailIndex - headerIndex+1);
- ? ? ? ? index = rand()%rang;
- ? ? ? ? if(index>=headerIndex){
- ? ? ? ? ? ? index += (tailIndex-headerIndex+1);
- ? ? ? ? }
- ? ? }
- ? ? ?
- ? ? x = snakeMap[index].x;
- ? ? y = snakeMap[index].y;
- ? ? setPosition(x, y);
- ? ? setColor(charFood.color);
- ? ? printf("%s", charFood.ch);
- ? ? globalMap[x][y].type=charFood.type;
- }
- ?
- //死掉
- void die(){
- ? ? int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;
- ? ? int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;
- ?
- ? ? setPosition(xCenter, yCenter-5);
- ? ? setColor(0xC);
- ?
- ? ? printf("You die! Game Over!");
- ? ? getch();
- ? ? exit(0);
- }
- ?
- // 蛇移动
- void move(char direction){
- ? ? int newHeaderX, newHeaderY; ?//新蛇头的坐标
- ? ? int newHeaderPreIndex; ?//新蛇头坐标以前对应的索引
- ? ? int newHeaderPreX, newHeaderPreY; ?//新蛇头的索引以前对应的坐标
- ? ? int newHeaderPreType; ?//新蛇头以前的类型
- ? ? int oldTailX, oldTailY; ?//老蛇尾坐标
- ? ? // -----------------------------------------------
- ? ? //新蛇头的坐标
- ? ? switch(direction){
- ? ? ? ? case 'w':
- ? ? ? ? ? ? newHeaderX = snakeMap[headerIndex].x-1;
- ? ? ? ? ? ? newHeaderY = snakeMap[headerIndex].y;
- ? ? ? ? ? ? break;
- ? ? ? ? case 's':
- ? ? ? ? ? ? newHeaderX = snakeMap[headerIndex].x+1;
- ? ? ? ? ? ? newHeaderY = snakeMap[headerIndex].y;
- ? ? ? ? ? ? break;
- ? ? ? ? case 'a':
- ? ? ? ? ? ? newHeaderX = snakeMap[headerIndex].x;
- ? ? ? ? ? ? newHeaderY = snakeMap[headerIndex].y-1;
- ? ? ? ? ? ? break;
- ? ? ? ? case 'd':
- ? ? ? ? ? ? newHeaderX = snakeMap[headerIndex].x;
- ? ? ? ? ? ? newHeaderY = snakeMap[headerIndex].y+1;
- ? ? ? ? ? ? break;
- ? ? }
- ? ? //新蛇头的索引
- ? ? headerIndex = headerIndex==0 ? snakeMapLen-1 : headerIndex-1;
- ? ? // -----------------------------------------------
- ? ? //新蛇头坐标以前对应的索引
- ? ? newHeaderPreIndex = globalMap[newHeaderX][newHeaderY].index;
- ? ? //新蛇头的索引以前对应的坐标
- ? ? newHeaderPreX = snakeMap[headerIndex].x;
- ? ? newHeaderPreY = snakeMap[headerIndex].y;
- ?
- ? ? //双向绑定新蛇头索引与坐标的对应关系
- ? ? snakeMap[headerIndex].x = newHeaderX;
- ? ? snakeMap[headerIndex].y = newHeaderY;
- ? ? globalMap[newHeaderX][newHeaderY].index = headerIndex;
- ?
- ? ? //双向绑定以前的索引与坐标的对应关系
- ? ? snakeMap[newHeaderPreIndex].x = newHeaderPreX;
- ? ? snakeMap[newHeaderPreIndex].y = newHeaderPreY;
- ? ? globalMap[newHeaderPreX][newHeaderPreY].index = newHeaderPreIndex;
- ?
- ? ? //新蛇头以前的类型
- ? ? newHeaderPreType = globalMap[newHeaderX][newHeaderY].type;
- ? ? //设置新蛇头类型
- ? ? globalMap[newHeaderX][newHeaderY].type = charSnake.type;
- ? ? // 判断是否出界或撞到自己
- ? ? if(newHeaderPreType==charBorder.type || newHeaderPreType==charSnake.type ){
- ? ? ? ? die();
- ? ? }
- ? ? //输出新蛇头
- ? ? setPosition(newHeaderX, newHeaderY);
- ? ? setColor(charSnake.color);
- ? ? printf("%s", charSnake.ch);
- ? ? //判断是否吃到食物
- ? ? if(newHeaderPreType==charFood.type){ ?//吃到食物
- ? ? ? ? createFood();
- ? ? ? ? //更改分数
- ? ? ? ? setPosition(scoresPostion.x, scoresPostion.y);
- ? ? ? ? printf("%d", ++scores);
- ? ? }else{
- ? ? ? ? //老蛇尾坐标
- ? ? ? ? oldTailX = snakeMap[tailIndex].x;
- ? ? ? ? oldTailY = snakeMap[tailIndex].y;
- ? ? ? ? //删除蛇尾
- ? ? ? ? setPosition(oldTailX, oldTailY);
- ? ? ? ? setColor(charBg.color);
- ? ? ? ? printf("%s", charBg.ch);
- ? ? ? ? globalMap[oldTailX][oldTailY].type = charBg.type;
- ? ? ? ? tailIndex = (tailIndex==0) ? snakeMapLen-1 : tailIndex-1;
- ? ? }
- }
- ?
- //下次移动的方向
- char nextDirection(char ch, char directionOld){
- ? ? int sum = ch+directionOld;
- ? ? ch = tolower(ch);
- ? ? if( (ch=='w' || ch=='a' || ch=='s' || ch=='d') && sum!=197 && sum!=234 ){
- ? ? ? ? return ch;
- ? ? }else{
- ? ? ? ? return directionOld;
- ? ? }
- }
- ?
- //暂停
- char pause(){
- ? ? return getch();
- }
- ?
- // 初始化
- void init(){
- ? ? // 设置相关变量?
- ? ? int x, y, i, index;
- ? ? int xCenter = MAXHEIGHT%2==0 ? MAXHEIGHT/2 : MAXHEIGHT/2+1;
- ? ? int yCenter = MAXWIDTH%2==0 ? MAXWIDTH/2 : MAXWIDTH/2+1;
- ? ? CONSOLE_CURSOR_INFO cci; ?//控制台光标信息
- ?
- ? ? //判断相关设置是否合理
- ? ? if(MAXWIDTH<16){
- ? ? ? ? printf("'MAXWIDTH' is too small!");
- ? ? ? ? getch();
- ? ? ? ? exit(0);
- ? ? }
- ?
- ? ? //设置窗口大小?
- ? ? system("mode con: cols=96 lines=32");
- ?
- ? ? //隐藏光标
- ? ? hStdin = GetStdHandle(STD_OUTPUT_HANDLE);
- ? ? GetConsoleCursorInfo(hStdin, &cci);
- ? ? cci.bVisible = 0;
- ? ? SetConsoleCursorInfo(hStdin, &cci);
- ? ? ?
- ? ? //打印背景?
- ? ? for(x=0; x<MAXHEIGHT; x++){
- ? ? ? ? for(y=0; y<MAXWIDTH; y++){
- ? ? ? ? ? ? if(y==0 || y==MAXWIDTH-1 || x==0 || x==MAXHEIGHT-1){
- ? ? ? ? ? ? ? ? globalMap[x][y].type = charBorder.type;
- ? ? ? ? ? ? ? ? setColor(charBorder.color);
- ? ? ? ? ? ? ? ? printf("%s", charBorder.ch);
- ? ? ? ? ? ? }else{
- ? ? ? ? ? ? ? ? index = (x-1)*(MAXWIDTH-2)+(y-1);
- ? ? ? ? ? ? ? ? snakeMap[index].x= x;
- ? ? ? ? ? ? ? ? snakeMap[index].y= y;
- ? ? ? ? ? ? ? ? globalMap[x][y].type = charBg.type;
- ? ? ? ? ? ? ? ? globalMap[x][y].index = index;
- ?
- ? ? ? ? ? ? ? ? setColor(charBg.color);
- ? ? ? ? ? ? ? ? printf("%s", charBg.ch);
- ? ? ? ? ? ? }
- ? ? ? ? }
- ? ? ? ? printf("\n");
- ? ? }
- ? ? ?
- ? ? //初始化贪吃蛇
- ? ? globalMap[xCenter][yCenter-1].type = globalMap[xCenter][yCenter].type = globalMap[xCenter][yCenter+1].type = charSnake.type;
- ?
- ? ? headerIndex = (xCenter-1)*(MAXWIDTH-2)+(yCenter-1) - 1;
- ? ? tailIndex = headerIndex+2;
- ? ? setPosition(xCenter, yCenter-1);
- ? ? setColor(charSnake.color);
- ? ? for(y = yCenter-1; y<=yCenter+1; y++){
- ? ? ? ? printf("%s", charSnake.ch);
- ? ? }
- ? ? //生成食物
- ? ? createFood();
- ?
- ? ? //设置程序信息
- ? ? setPosition(xCenter-1, MAXWIDTH+2);
- ? ? printf(" ? Apples : 0");
- ? ? setPosition(xCenter, MAXWIDTH+2);
- ? ? printf(" ? Author : xiao p");
- ? ? setPosition(xCenter+1, MAXWIDTH+2);
- ? ? printf("Copyright : c.biancheng.net");
- ? ? scoresPostion.x = xCenter-1;
- ? ? scoresPostion.y = MAXWIDTH+8;
- }
- ?
- int main(){
- ? ? char charInput, direction = 'a';
- ? ? init();
- ? ? ?
- ? ? charInput = tolower(getch());
- ? ? direction = nextDirection(charInput, direction);
- ?
- ? ? while(1){
- ? ? ? ? if(kbhit()){
- ? ? ? ? ? ? charInput = tolower(getch());
- ? ? ? ? ? ? if(charInput == ' '){
- ? ? ? ? ? ? ? ? charInput = pause();
- ? ? ? ? ? ? }
- ? ? ? ? ? ? direction = nextDirection(charInput, direction);
- ? ? ? ? }
- ? ? ? ? move(direction);
- ? ? ? ? Sleep(500);
- ? ? }
- ? ? ?
- ? ? getch();
- ? ? return 0;
- }
【操作过程】
编译运行后,先按enter键使游戏开始,然后w,s a d 分别控制上下左右移动
【运行展示】

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。