900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

时间:2024-02-09 19:08:58

相关推荐

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!

贪吃蛇小程序,主要采用C语言描述,采用数组进行数据存储的图形化操作界面,会涉及一点点C++ 知识(特别少的一点点),但是有C语言基础就够用了,编译器:VS,会涉及部分库函数的安装及使用,不过也很简单啦!

效果展示:

看到了这个效果之后,那我们就动手来实现吧!

希望大家都能轻松实现这个项目!另外涉及到的#include <graphics.h>需要额外安装图形库插件easyX哦~

代码如下:

#include <graphics.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <stdio.h>#include "snake.h"int score = 0;int gamespeed = 100;//蛇运行速度static void Init(void); /*图形驱动*/static void Close(void); /*图形结束*/static void Game_interface(void); /*游戏界面*/static void GameOver(void); /*结束游戏*/static void GamePlay(void); /*游戏过程*/static void PrScore(void);/*输出成绩*//*主函数*/int main(void){Init(); Game_interface(); GamePlay(); Close(); return 0;}/*图形驱动*/static void Init(void){int gd=9,gm=2;initgraph(&gd,&gm," ");cleardevice();}/* 开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙 */static void Game_interface(void){int i;setcolor(LIGHTCYAN); /*setbkcolor(LIGHTGREEN);*/setlinestyle(PS_SOLID,0,1);/*设置线型*/for(i=50;i<=600;i+=10)/*画边框*/{rectangle(i,40,i+10,49); /*上边框*/rectangle(i,451,i+10,460); /*下边框*/}for(i=40;i<=450;i+=10){rectangle(50,i,59,i+10); /*左边框*/rectangle(601,i,610,i+10); /*右边框*/}}/* 游戏主函数 */static void GamePlay(void){int i;srand(time(NULL)); /*随机数发生器*/food.yes = 1; /*1表示需要出现新食物,0表示已经存在食物*/snake.life = 0; /*活着*/snake.direction = 1; /*方向往右*/snake.x[0] = 100;snake.y[0] = 100;snake.x[1] = 110;snake.y[1] = 100;snake.node = 2; /*节数*/PrScore(); /*输出得分*/while(1) /*可以重复玩游戏,压ESC键结束*/{while( !kbhit() )/*在没有按键的情况下,蛇自己移动*/{if(food.yes == 1) /*需要出现新食物*/{food.x = rand()%400 + 60;food.y = rand()%350 + 60;while(food.x%10 != 0) /*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/food.x++;while(food.y%10 != 0)food.y++;food.yes = 0; /*画面上有食物了*/}if(food.yes == 0) /*画面上有食物了就要显示*/{setcolor(GREEN);rectangle(food.x,food.y,food.x + 10,food.y - 10);}for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/{snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction){case 1: snake.x[0] += 10;break;case 2: snake.x[0] -= 10;break;case 3: snake.y[0] -= 10;break;case 4: snake.y[0] += 10;break;}/* 从蛇的第四节开始判断是否撞到自己 */for(i=3;i<snake.node;i++){if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0])){GameOver(); /*显示失败*/snake.life = 1;break;}}if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455))/*蛇是否撞到墙壁*/{GameOver(); /*本次游戏结束*/snake.life = 1;/*蛇死*/}if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if((snake.x[0] == food.x) && (snake.y[0] == food.y)) /*吃到食物以后*/{setcolor(BLACK); /*把画面上的食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node] = -20;snake.y[snake.node] = -20;/* 新的一节先放在看不见的位置,下次循环就取前一节的位置 */snake.node++; /*蛇的身体长一节*/food.yes = 1; /*画面上需要出现新的食物*/score += 10;PrScore();/*输出新得分*/}setcolor(RED);/*画出蛇*/for(i=0;i<snake.node;i++)rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);Sleep(gamespeed);setcolor(BLACK); /*用黑色去除蛇的的最后一节*/rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);} /*endwhile(!kbhit)*/if(snake.life == 1) /*如果蛇死就跳出循环*/break;key=getch();/*接收按键*/if (key == ESC) break; /*按ESC键退出*/switch(key){ case UP:if(snake.direction != 4) /*判断是否往相反的方向移动*/snake.direction = 3;break;case RIGHT:if(snake.direction != 2)snake.direction = 1;break;case LEFT:if(snake.direction != 1)snake.direction = 2;break;case DOWN:if(snake.direction != 3)snake.direction = 4;break;}}/*endwhile(1)*/}/*游戏结束*/static void GameOver(void){cleardevice();PrScore();setcolor(RED);setfont(56,0,"黑体");outtextxy(200,200,"GAME OVER");getch();}/*输出成绩*/static void PrScore(void){char str[10];setfillstyle(YELLOW);bar(50,15,220,35);setcolor(BROWN);setfont(16,0,"宋体");sprintf(str,"score:%d",score);outtextxy(55,16,str);}static void Close(void){closegraph();}​​#ifndef SNAKE_H#define SNAKE_H#define LEFT 'a'#define RIGHT 'd'#define DOWN 's'#define UP 'w'#define ESC 27#define N 200/*蛇的最大长度*/char key; /*控制按键*/struct Food{int x; /*食物的横坐标*/int y; /*食物的纵坐标*/int yes; /*判断是否要出现食物的变量*/}food; /*食物的结构体*/struct Snake{int x[N];int y[N];int node;/*蛇的节数*/int direction; /*蛇移动方向*/int life;/* 蛇的生命,0活着,1死亡*/}snake;#endif​

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

整理分享(学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。