彩版_贪吃蛇C语言版
C语言贪吃蛇程序设计说明书
C语言贪吃蛇程序设计说明书题目:贪吃蛇游戏学校: 系别: 专业班级: 姓名: 学号: 指导老师: 日期:一、设计题目:贪吃蛇是一款经典的休闲游戏,一条蛇在密闭的围墙内,随机出现一个食物,通过控制方向键操作小蛇不停的朝着食物前进,直到吃掉食物。
每吃一个食物,小蛇都会长长一截,随之难度增大;当小蛇头撞到墙或自己时,小蛇死亡。
二、功能设计:本游戏要求实现以下几个功能:(1) 用上、下、左、右键控制游戏区蛇的运动方向,使之吃食而使身体变长;(2) 用户可以调节蛇的运行速度来选择不同的难度;(3) 游戏分多个难度级别;(4) 用户可自选颜色;(5) 记录成绩前五名的游戏玩家;(6) 增加背景音乐;(7) 提高障碍物和游戏级别。
三、程序模块图:贪吃蛇游戏初画控设帮始图制置助模模模模化块块块块墙蛇食移食死变成等音体身物动物亡长绩级效2四、算法流程图:开始初始化界面和蛇身放置食物获取按键开始运动碰到边界是否否蛇吃到食是蛇长大蛇死亡是继续否结束3五、函数原型与功能 1.主函数:void main()启动程序,触动其他函数。
2.初始化:void init ()设置背景框大小、蛇体初始值,随机产生食物。
3.随机产生食物:void setfoodcrd()设置食物生成坐标,0表示食物被吃。
4.画食物:void showfood()用矩形框来画食物5.画蛇:void showsnake()根据蛇的坐标和节数,循环用矩形框来画蛇。
6.蛇移动:void snakemove() 根据按键,重设坐标7.改变蛇的方向:void changeskdir()响应用户的运动方向8.判断蛇是否死亡:void judgeslod判断蛇是否碰到自己或墙。
9.判断蛇是否吃到食物:void judgefood()判断是否吃到食物,吃食后变0,蛇增长一节。
10.结束游戏:void gameover()结束话语,并执行下一步。
六、基本代码#include<graphics.h> #include<conio.h>#include<stdio.h>#pragma comment(lib,"Winmm.lib")#include "MyTimer.h" #define SIZEMAX 100 /*蛇最大长度*/ #define SPEED 100 /*初始速度*/ #define len 20 /*蛇宽度*/#define lm 10 /*蛇每次移动距离*/ #define initlen 600 /*初始化窗口正方形的长度*/ #define Min_snakelen 2 /*蛇的最小长度*/typedef struct {int x,y;}DIR;int snakelen=Min_snakelen; /*蛇的长度*/4int isfood=1; /*食物状态*/ int isover=0; /*游戏状态*/int ispause=1; /*暂停状态*/int ismusic=1; /*音乐播放状态*/ char dir; /*记录蛇运动的方向*/ char c='d';DIR snake[500],food; /*定义蛇节点和食物的类型*/ int speed=SPEED;void drawmap() /*画地图函数*/ {IMAGE img;char str[10];loadimage(&img,"贪吃蛇.jpg"); /*游戏界面*/putimage(0,0,&img);loadimage(&img,"7.jpg"); /*侧栏提示*/putimage(600,0,&img);sprintf(str,"%d",snakelen);setfont(30,0,"宋体");setbkmode(TRANSPARENT);outtextxy(620,10,"操作说明:");setfont(20,0,"宋体");outtextxy(615,50,"awsd控制方向键");outtextxy(615,80,"p键暂停");outtextxy(615,110,"o键继续");outtextxy(615,200,"esc键退出");outtextxy(615,140,"l键暂停音乐");outtextxy(615,170,"k键继续播放");outtextxy(730,250,str);outtextxy(620,250,"蛇当前长度");}void init() /*初始化蛇函数*/ {int i;IMAGE img;snake[0].x=9*len+lm;snake[0].y=4*len+lm;loadimage(&img,"1.jpg");putimage(snake[0].x-lm,snake[0].y-lm,&img); for(i=1;i<snakelen;i++){snake[i].x=len*(9-i)+lm;snake[i].y=len*4+lm;5loadimage(&img, "2.jpg");putimage(snake[i].x-lm,snake[i].y-lm, &img); }}void showsnake() /*画蛇函数*/ {int i;IMAGE img;loadimage(&img, "1.jpg");putimage(snake[0].x-lm,snake[0].y-lm , &img);loadimage(&img, "2.jpg");for(i=1;i<snakelen;i++)putimage(snake[i].x-lm,snake[i].y-lm, &img); }void snakemove() /*画动蛇函数*/ {int i;int mx=snake[0].x;int my=snake[0].y;switch(dir){case 'a':mx-=len;break;case 'd':mx+=len;break;case 'w':my-=len;break;case 's':my+=len;break;default:break;}for(i=snakelen-1;i>=0;i--){snake[i+1].x=snake[i].x;snake[i+1].y=snake[i].y;}snake[0].x=mx;snake[0].y=my;showsnake();}int ceshiover() /*检测游戏结束函数*/ {int i;if(snake[0].x<0||snake[0].x>30*len-lm||snake[0].y<0||snake[0].y>30*len-lm)return 1;for(i=1;i<snakelen;i++)6{if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y) return 1;}return 0;}int foodinsnake() /*检测食物是否在蛇上函数*/ {for(int i=0;i<snakelen;i++)if(food.x==snake[i].x&&food.y==snake[i].y)return 1;elsereturn 0;}void showfood() /*画食物函数*/{IMAGE img;do{food.x=(rand()%30)*len+lm;food.y=(rand()%30)*len+lm;}while(foodinsnake());loadimage(&img, "3.jpg");putimage(food.x-lm,food.y-lm , &img);isfood=0;}void kmusic(){if(ismusic==0)mciSendString("pause mymusic",NULL,0,NULL);if(ismusic==1)mciSendString("resume mymusic",NULL,0,NULL);}void playbkmusic() /*播放背景音乐函数*/{mciSendString("open 超级玛丽.mp3 alias mymusic", NULL, 0, NULL); mciSendString("play mymusic repeat", NULL, 0, NULL);}void playgame() /*玩游戏函数*/{c='d'; //蛇开始向右移动isover=0;7snakelen=Min_snakelen;dir='d';IMAGE img;MyTimer t; //定义精确延时对象int T=200; // 延长时间drawmap(); //画游戏地图init(); //画小蛇初始位置while(!isover){if(ispause){snakemove();FlushBatchDraw(); //批量绘图EndBatchDraw(); //结束批量绘图if(snake[0].x==food.x&&snake[0].y==food.y){ snakelen++;isfood=1;}if(isfood)showfood();if(snakelen<35)T=200-3*snakelen;t.Sleep(T);BeginBatchDraw(); // 开始批量绘图模式,防止闪烁问题drawmap();loadimage(&img, "3.jpg"); // 加载食物图片putimage(food.x-lm,food.y-lm , &img);};//按键控制if(kbhit())c=getch();switch(c){case 'a':if(dir!='d'){dir=c;}break;case 'd':if(dir!='a'){dir=c;}break;case 'w':if(dir!='s'){8dir=c;}break;case 's':if(dir!='w'){dir=c;}break;case 27: exit(0); break; //游戏退出case 'p': ispause=0;break; //p暂停case 'o': ispause=1;break; //o继续游戏case 'l': ismusic=0;break; //l暂停音乐case 'k': ismusic=1;break; //k继续播放default:break;}kmusic(); //音乐控制播放//判断游戏结束if(ceshiover())isover=1;//判断是否重新再来HWND wnd = GetHWnd(); //获取窗口句柄if(isover)if (MessageBox(wnd, "游戏结束。
C语言实现贪吃蛇游戏
C语言实现贪吃蛇游戏.txt每天早上起床都要看一遍“福布斯”富翁排行榜,如果上面没有我的名字,我就去上班。
谈钱不伤感情,谈感情最他妈伤钱。
我诅咒你一辈子买方便面没有调料包。
/*===========================================================*程序名:贪吃蛇/*===========================================================*调用库:*----------------------*图形库graphics.h,随机库stdlib.h*===========================================================*/#include <graphics.h>#include <stdlib.h>/*===========================================================*宏定义:*----------------------*上、下、左、右、退出(ESC),暂停(PAUSE),确定(ENTER)*alive---蛇活着,dead---蛇死亡*no---食物不存在,yes---食物存在*N---蛇最大长度,达到200时游戏完成*===========================================================*/#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define ENTER 0x1c0d#define alive 1#define dead 0#define yes 1#define no 0#define N 200/*===========================================================*自定义函数以及全局变量声明*---------------------------*Score---统计吃的食物个数;Speed_degree:控制蛇速度变量*===========================================================*/void make_full_screen();void start_screen();void menu();void wall_note();void play_game();void score();void game_over();void close_full_screen();void victory();void forum();void leave_or_again();void victory();int Score,Speed_degree;/*=========================================================== *自定义函数:make_full_screen()*---------------------------------*初始化图形界面*===========================================================*/ void make_full_screen(){int driver=DETECT,mode;registerbgidriver(EGAVGA_driver);initgraph(&driver,&mode,"");cleardevice();}/*=========================================================== *自定义函数:start_screen()*------------------------------*贪吃蛇游戏的欢迎界面*===========================================================*/ void start_screen(){int i,p,color=9;settextstyle(0,0,2);setcolor(GREEN);outtextxy(150,400,"Press any key to loading...");setcolor(YELLOW);outtextxy(200,450,"Deviser:caolvchong");forum();while(bioskey(1)==0) /*当没有按键时显示snake*/{settextstyle(0,0,6);for(i=9;i<15;i++){color++;if(color>=14) color=9;setcolor(color);outtextxy(200,200,"SNAKE");for(p=1;p<3;p++)delay(50000);}}bioskey(0);/*返回键盘值,不然按下的扫描码将被后面检测按键函数接收*/ cleardevice();/*清屏*/}/*===========================================================*自定义函数:menu()*------------------------------*贪吃蛇游戏的菜单界面*===========================================================*/void menu(){int j=100,k=j,n,key,tag=1;char *char_up=NULL,*char_down=NULL;/*----------------------------------------------*参数说明:*j:作为显示选择条(bar)的位置参数*k: 作为清除选择条的位置参数*key:接收按键参数*tag:跳出menu()函数的标签,触发条件按下enter**char_up,*char_down接收ASCII码的24(↑)和25(↓)*----------------------------------------------*/setcolor(RED);settextstyle(0,0,2);outtextxy(15,15,"choose a level");setcolor(LIGHTBLUE);settextstyle(0,0,3);outtextxy(15,100,"Easy");outtextxy(15,150,"Normal");outtextxy(15,200,"Hard");setcolor(GREEN);settextstyle(0,0,2);sprintf(char_up,"%c",24);outtextxy(150,350,char_up);sprintf(char_down,"%c",25);outtextxy(210,350,char_down);outtextxy(170,350,"or ");outtextxy(230,350,"to select");outtextxy(150,380,"ENTER to play");outtextxy(150,410,"ESC to exit");setfillstyle(2,YELLOW);bar(190,j,215,j+25);forum();while(tag!=0){setfillstyle(1,BLACK);bar(190,k,215,k+25);setfillstyle(2,YELLOW);bar(190,j,215,j+25);key=bioskey(0);switch(key){case DOWN: k=j;if(j<200) j+=50;break;case UP: k=j;if(j>100) j-=50;break;case ENTER: tag=0;break;case ESC: close_full_screen(); /*退出*/}switch(j){case 100:Speed_degree=12;break;case 150:Speed_degree=8;break;case 200:Speed_degree=4;break; /*对应各等级的速度延迟循环次数*/ }}}/*===========================================================*自定义函数:wall_note()*------------------------------*贪吃蛇游戏的围墙,就是蛇的活动范围*以及游戏中提示按键:ESC--退出;SPACE--暂停*===========================================================*/void wall_note(){cleardevice();setlinestyle(0,0,3);setcolor(LIGHTRED);rectangle(47,57,603,453);setfillstyle(1,LIGHTGREEN);bar(55,10,600,40);settextstyle(0,0,3);setcolor(RED);outtextxy(58,15,"ESC:exit");outtextxy(305,15,"SPACE:pause");forum();}/*=========================================================== *自定义函数:play_game()*------------------------------*具体的游戏过程*===========================================================*/ void play_game(){struct{int x[N];int y[N];int block;int life;int direction;}snake;struct{int x;int y;int exist;}food;int i,key;/*---------------------------------*参数说明:*结构体snake.[x],snake.[y]为蛇身体坐标*snake.block蛇的节数;snake.life蛇生命参数*snake.direction蛇的运动方向*--------------*结构体food.x,food.y为食物坐标*food.exist食物存在参数*-------------*i:一些循环控制参量*key:接收键盘按键参量*----------------------------------*/randomize();/*初始化随机库*/snake.x[0]=100;snake.y[0]=100;snake.direction=RIGHT;snake.life=alive;snake.block=3;food.exist=no;score();/*初始分数*//*-----------------------------------*初始化:*蛇的头部位置,运动方向向右,生命活着*节数为3,食物开始不存在,初始化分数显示为0*-----------------------------------*/for(;;)/* 循环,作用于下面while(!kbhit),按键后重新开始* while(!hkbit)循环,并对按键分析,实现上下左右*以及退出暂停的检测*/{while(!kbhit())/*没有按键时,实现对食物是否存在的判断,对于不存*在时产生食物,并画出;*对蛇移动的处理:自动向前移动,对接收来的上下左*右的处理,对蛇运动过程是否导致死亡判断,对蛇身*体变长以及画出蛇的处理*对分数的处理:显示分数,对是否完全200个进行判断*/{if(food.exist==no)/*没有食物时,随机出现食物*/{food.x=random(531)+60;food.y=random(381)+60;/*随机出现食物,确保食物在蛇的活动范围内*/while(food.x%10!=0) food.x++;while(food.y%10!=0) food.y++;/*确保食物在屏幕坐标10的正数倍,这样才能被蛇吃到*/ food.exist=yes;/*食物存在了*/for(i=0;i<snake.block;i++)if(food.x==snake.x&&food.y==snake.y){food.exist=no;break;}/*如果食物在蛇的身体内,重新产生食物*/}setlinestyle(0,0,1);setcolor(RED);rectangle(food.x,food.y,food.x+10,food.y+10);/*画出食物*/for(i=snake.block-1;i>0;i--){snake.x=snake.x[i-1];snake.y=snake.y[i-1];}/*蛇身体后面一格变前面一格,实现蛇移动的原理*/switch(snake.direction){case RIGHT: snake.x[0]+=10;break;case LEFT: snake.x[0]-=10;break;case UP: snake.y[0]-=10;break;case DOWN: snake.y[0]+=10;break;}/*蛇上下左右移动的处理*/for(i=4;i<snake.block;i++)if(snake.x==snake.x[0]&&snake.y==snake.y[0]){snake.life=dead;break;}/*对蛇是否碰到自己的判断,碰到自己,蛇死*/if(snake.x[0]<48||snake.x[0]>597||snake.y[0]<53||snake.y[0]>447) snake.life=dead; /*碰到墙,蛇死*/if(snake.life==dead){game_over();break;}/*如果蛇死的话,显示游戏结束,退出while(!hkbit())循环*/if(food.x==snake.x[0]&&food.y==snake.y[0])/*食物被吃*/{setcolor(BLACK);rectangle(food.x,food.y,food.x+10,food.y+10);/*把食物去掉*/ snake.block++;/*蛇身增加*/Score++; /*分数增加*/score();/*统计显示分数*/victory();/*吃到食物200个显示完成游戏*/food.exist=no;/*食物被吃,食物就不存在了*/}setcolor(LIGHTBLUE);for(i=1;i<snake.block;i++){setlinestyle(0,0,1);rectangle(snake.x,snake.y,snake.x+10,snake.y+10);}/*画蛇*/setcolor(YELLOW);rectangle(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);/*设置蛇的头部*/snake.x[snake.block]=-100;snake.y[snake.block]=-100;for(i=0;i<Speed_degree;i++)delay(10000);setcolor(BLACK);rectangle(snake.x[snake.block-1],snake.y[snake.block-1],snake.x[snake.block-1]+10,snake.y[snake.block-1]+10);/*去掉蛇的最后一节*/}key=bioskey(0);/*等待按键*/if(key==SPACE) bioskey(0);/*暂停*/else if(key==ESC) closegraph();/*结束游戏*/else if(key==RIGHT&&snake.direction!=LEFT) snake.direction=RIGHT; else if(key==UP&&snake.direction!=DOWN) snake.direction=UP;else if(key==LEFT&&snake.direction!=RIGHT) snake.direction=LEFT; else if(key==DOWN&&snake.direction!=UP) snake.direction=DOWN; if(snake.life==dead) break;}}/*===========================================================*自定义函数:score()*------------------------------*统计显示分数*===========================================================*/void score(){char *str=NULL;setfillstyle(0,BLACK);bar(250,460,405,490);setcolor(LIGHTGREEN);settextstyle(0,0,2);sprintf(str,"Score:%d",Score);outtextxy(255,460,str);}/*=========================================================== *自定义函数:victory()*------------------------------*吃到食物200个,完成游戏*===========================================================*/ void victory(){if(Score==200){cleardevice();setcolor(YELLOW);settextstyle(0,0,6);outtextxy(100,200,"Victory!");forum();leave_or_again();}}/*=========================================================== *自定义函数:game_over()*------------------------------*显示游戏结束,选择继续游戏还是离开*===========================================================*/ void game_over(){cleardevice();score();setcolor(RED);settextstyle(0,0,6);outtextxy(100,200,"Game Over");forum();leave_or_again();}/*=========================================================== *自定义函数:leave_or_again()*------------------------------*离开还是重新游戏选择*至于菜单条的设计与前面menu()类似*===========================================================*/void leave_or_again(){int j=300,k,key,tag=1;while(tag!=0){setcolor(BLUE);settextstyle(0,0,3);outtextxy(150,300,"Leave");outtextxy(150,350,"Again");setfillstyle(1,BLACK);bar(330,k,355,k+25);setfillstyle(2,YELLOW);bar(330,j,355,j+25);key=bioskey(0);switch(key){case DOWN: k=j;if(j<350) j+=50;break;case UP: k=j;if(j>300) j-=50;break;case ENTER: tag=0;break;}}switch(j){case 300:close_full_screen();case 350:cleardevice();Score=0;menu();wall_note();play_game();break;}}*===========================================================*自定义函数:close_full_screen()*------------------------------*关闭图形界面*===========================================================*/ void close_full_screen(){cleardevice();closegraph();}/*=========================================================== *主函数:*------------------------------*调用图形界面--->开始欢迎界面--->菜单界面*--->画围墙--->游戏过程--->结束图形界面*===========================================================*/ main(){make_full_screen();start_screen();menu();wall_note();play_game();close_full_screen();}/*============================END============================*/。
C语言小游戏源代码《贪吃蛇》
void init(void){/*构建图形驱动函数*/ int gd=DETECT,gm; initgraph(&gd,&gm,""); cleardevice(); }
欢迎您阅读该资料希望该资料能给您的学习和生活带来帮助如果您还了解更多的相关知识也欢迎您分享出来让我们大家能共同进步共同成长
C 语言小游戏源代码《贪吃பைடு நூலகம்》
#define N 200/*定义全局常量*/ #define m 25 #include <graphics.h> #include <math.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define Esc 0x011b int i,j,key,k; struct Food/*构造食物结构体*/ { int x; int y; int yes; }food; struct Goods/*构造宝贝结构体*/ { int x; int y; int yes; }goods; struct Block/*构造障碍物结构体*/ { int x[m]; int y[m]; int yes; }block; struct Snake{/*构造蛇结构体*/ int x[N]; int y[N]; int node; int direction; int life; }snake; struct Game/*构建游戏级别参数体*/ { int score; int level; int speed;
贪吃蛇游戏(printf输出C语言版本)
贪吃蛇游戏(printf输出C语⾔版本)这⼀次我们应⽤printf输出实现⼀个经典的⼩游戏—贪吃蛇,主要难点是⼩蛇数据如何存储、如何实现转弯的效果、吃到⾷物后如何增加长度。
1 构造⼩蛇⾸先,在画⾯中显⽰⼀条静⽌的⼩蛇。
⼆维数组canvas[High][Width]的对应元素,值为0输出空格,-1输出边框#,1输出蛇头@,⼤于1的正数输出蛇⾝*。
startup()函数中初始化蛇头在画布中间位置(canvas[High/2][Width/2] = 1;),蛇头向左依次⽣成4个蛇⾝(for (i=1;i<=4;i++) canvas[High/2][Width/2-i] = i+1;),元素值分别为2、3、4、5。
1 #include <stdio.h>2 #include <stdlib.h>3 #include <conio.h>4 #include <windows.h>5//C语⾔⾃学⽹6#define High 20 // 游戏画⾯尺⼨7#define Width 3089// 全局变量10int canvas[High][Width] = {0}; // ⼆维数组存储游戏画布中对应的元素11// 0为空格,-1为边框#,1为蛇头@,⼤于1的正数为蛇⾝*1213void gotoxy(int x,int y) //光标移动到(x,y)位置14 {15 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);16 COORD pos;17 pos.X = x;18 pos.Y = y;19 SetConsoleCursorPosition(handle,pos);20 }2122void startup() // 数据初始化23 {24int i,j;2526// 初始化边框27for (i=0;i<High;i++)28 {29 canvas[i][0] = -1;30 canvas[i][Width-1] = -1;31 }32for (j=0;j<Width;j++)33 {34 canvas[0][j] = -1;35 canvas[High-1][j] = -1;36 }3738// 初始化蛇头位置39 canvas[High/2][Width/2] = 1;40// 初始化蛇⾝,画布中元素值分别为2,3,4,5....41for (i=1;i<=4;i++)42 canvas[High/2][Width/2-i] = i+1;43 }4445void show() // 显⽰画⾯46 {47 gotoxy(0,0); // 光标移动到原点位置,以下重画清屏48int i,j;49for (i=0;i<High;i++)50 {51for (j=0;j<Width;j++)52 {53if (canvas[i][j]==0)54 printf(""); // 输出空格55else if (canvas[i][j]==-1)56 printf("#"); // 输出边框#57else if (canvas[i][j]==1)58 printf("@"); // 输出蛇头@59else if (canvas[i][j]>1)60 printf("*"); // 输出蛇⾝*61 }62 printf("\n");63 }64 }6566void updateWithoutInput() // 与⽤户输⼊⽆关的更新67 {68 }6970void updateWithInput() // 与⽤户输⼊有关的更新71 {72 }7374int main()75 {76 startup(); // 数据初始化77while (1) // 游戏循环执⾏78 {79 show(); // 显⽰画⾯80 updateWithoutInput(); // 与⽤户输⼊⽆关的更新81 updateWithInput(); // 与⽤户输⼊有关的更新82 }83return0;84 }2 ⼩蛇⾃动移动实现⼩蛇的移动是贪吃蛇游戏的难点,下图列出了⼩蛇分别向右、向上运动后,对应⼆维数组元素值的变化,从中我们可以得出实现思路。
C语言项目案例之贪吃蛇
C语⾔项⽬案例之贪吃蛇项⽬案例:贪吃蛇下载链接:1. 初始化墙代码:// 初始化墙void init_wall(void){for (size_t y = 0; y <= HIGH; ++y){for (size_t x = 0; x <= WIDE; ++x){if (x == WIDE || y == HIGH) // 判断是否到墙{printf("=");}else{printf(" ");}}printf("\n");}}效果:2. 定义蛇和⾷物类型typedef struct{int x;int y;}FOOD; // ⾷物typedef struct{int x;int y;}BODY; // ⾝体typedef struct{int size; // ⾝体长度BODY body[WIDE*HIGH];}SNAKE; // 蛇3. 初始化蛇和⾷物// 定义⼀个蛇和⾷物SNAKE snake;FOOD food;// 初始化⾷物void init_food(void){food.x = rand() % WIDE; // 随机⽣成坐标food.y = rand() % HIGH;}// 初始化蛇void init_snake(void){snake.size = 2;// 将蛇头初始化到墙中间snake.body[0].x = WIDE / 2;snake.body[0].y = HIGH / 2;// 蛇⾝紧跟蛇头snake.body[1].x = WIDE / 2 - 1;snake.body[1].y = HIGH / 2;}4. 显⽰UI// 显⽰UIvoid showUI(void){// 显⽰⾷物// 存放光标位置COORD coord;coord.X = food.x;coord.Y = food.y;// 光标定位SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); putchar('$');// 显⽰蛇for (size_t 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)}else{putchar('#');}}}效果:最终代码// main.c#define _CRT_SECURE_NO_WARNINGS#include "./snakeGame.h"int main(void){// 取消光标CONSOLE_CURSOR_INFO cci;cci.bVisible = FALSE; // 取消光标cci.dwSize = sizeof(cci);SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci); system("color 2");printf("欢迎来到贪吃蛇\n准备好了吗?按s/S开始,q/Q退出\n"); char ch = _getch();switch (ch){case 's':case 'S':system("color 0");system("cls");break;default:return 0;}init_wall();init_food();init_snake();showUI();playGame();return 0;}// snakeGame.c#include "./snakeGame.h"// 定义⼀个蛇和⾷物SNAKE snake;FOOD food;// ⽅向增量int dx = 0;int dy = 0;int lx, ly; // 尾节点// 初始化⾷物void init_food(void){food.x = rand() % WIDE; // 随机⽣成坐标food.y = rand() % HIGH;}// 初始化蛇void init_snake(void){snake.size = 2;snake.fraction = 0;// 将蛇头初始化到墙中间snake.body[0].x = WIDE / 2;snake.body[0].y = HIGH / 2;snake.body[1].x = WIDE / 2 - 1;snake.body[1].y = HIGH / 2;}// 初始化墙void init_wall(void){for (size_t y = 0; y <= HIGH; ++y){for (size_t x = 0; x <= WIDE; ++x){if (x == WIDE || y == HIGH) // 判断是否到墙{printf("=");}else{printf(" ");}}printf("\n");}printf("分数:0\n");}// 显⽰UIvoid showUI(void){// 显⽰⾷物// 存放光标位置COORD coord;coord.X = food.x;coord.Y = food.y;// 光标定位SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar('$');// 显⽰蛇for (size_t 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){putchar('@');}else{putchar('#');}}// 处理尾节点coord.X = lx;coord.Y = ly;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);putchar(' ');coord.X = WIDE;coord.Y = HIGH;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);printf("\n分数:%d\n",snake.fraction);}void playGame(void){COORD _coord;system("color 7");char key = 'D';// 蛇不能撞墙while (snake.body[0].x >= 0 && snake.body[0].x <= WIDE && snake.body[0].y >= 0 && snake.body[0].y <= HIGH) {// 蛇不能撞⾃⼰for (size_t i = 1; i < snake.size; ++i){if (snake.body[0].x == snake.body[i].x && snake.body[0].y == snake.body[i].y){goto OVER;}}// 撞⾷物if (snake.body[0].x == food.x && snake.body[0].y == food.y){++snake.size;++snake.fraction;// 随机出现⾷物init_food();}// 控制蛇移动// 判断是否按下按键if (_kbhit()){key = _getch(); // 不需要敲回车,按下就⽴马确认}// 判断W A S D中哪个按键按下switch (key){case 'w':case 'W':dx = 0;dy = -1;break;case 'a':case 'A':dx = -1;dy = 0;break;case 's':case 'S':dx = 0;dy = 1;break;case 'd':dx = 1;dy = 0;break;case 'q':case 'Q':_coord.X = WIDE;_coord.Y = HIGH;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), _coord); putchar('\n');return;}// 蛇移动// 记录尾节点位置lx = snake.body[snake.size - 1].x;ly = snake.body[snake.size - 1].y;for (size_t i = snake.size - 1; i > 0; --i){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;showUI();Sleep(500); // 延时}// 游戏结束OVER:system("color 4");_coord.X = 6;_coord.Y = HIGH + 1;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), _coord); printf("\n游戏结束");printf("按r/R重新开始,按q/Q退出\n");char _key;_key = _getch();switch (_key){case 'r':case 'R':system("cls");init_wall();init_food();init_snake();showUI();playGame();case 'Q':case 'q':default:system("color 7");return;}}// snakeGame.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <Windows.h>#define WIDE 60 // 长#define HIGH 20 // ⾼typedef struct{int x;int y;}FOOD; // ⾷物typedef struct{int x;int y;}BODY; // ⾝体typedef struct{int size; // ⾝体长度int fraction; // 分数BODY body[WIDE*HIGH];}SNAKE; // 蛇void init_wall(void);void init_food(void);void init_snake(void);void showUI(void);void playGame(void);。
C语言贪吃蛇
C语⾔贪吃蛇/*亲测DEVC++编译器完美执⾏*/#define _CRT_SECURE_NO_WARNINGS#include<windows.h>#include<time.h>#include<conio.h>#include<stdio.h>void readini(FILE **fphead, int *score, char *argv[]) //创建或打开⼀个和运⾏⽂件对应的ini⽂件,读取最⾼纪录{char filename[200], *pfilename;int flag = -1, i;strcpy(filename, argv[0]);for (i = 0; filename[i] != '\0'; i++){if ('.' == filename[i])flag = 1;}if (1 == flag){filename[i - 1] = 'i';filename[i - 2] = 'n';filename[i - 3] = 'i';}else{filename[i] = '.';filename[i + 1] = 'i';filename[i + 2] = 'n';filename[i + 3] = 'i';filename[i + 4] = '\0';}for (; filename[i] != '\\'&&i >= 0; i--)pfilename = &filename[i];if ((*fphead = fopen(pfilename, "rb+")) == NULL){if ((*fphead = fopen(pfilename, "wb+")) == NULL){printf("⽆法创建或打开\"%s\"⽂件\n", pfilename);system("pause");exit(0);}}else{fread(score, sizeof(int), 1, *fphead);}}void writeini(FILE **fphead, int *score, char *argv[]) //打开⼀个和运⾏⽂件对应的ini⽂件,写⼊最⾼纪录{char filename[200], *pfilename;int flag = -1, i;strcpy(filename, argv[0]);for (i = 0; filename[i] != '\0'; i++){if ('.' == filename[i])flag = 1;}if (1 == flag){filename[i - 1] = 'i';filename[i - 2] = 'n';filename[i - 3] = 'i';}else{filename[i] = '.';filename[i + 1] = 'i';filename[i + 2] = 'n';filename[i + 3] = 'i';filename[i + 4] = '\0';}for (; filename[i] != '\\'&&i >= 0; i--)pfilename = &filename[i];if ((*fphead = fopen(pfilename, "wb+")) == NULL){printf("⽆法写⼊\"%s\"⽂件,磁盘写保护!\n", pfilename);system("pause");exit(0);}else{rewind(*fphead);fwrite(score, sizeof(int), 1, *fphead);fclose(*fphead);}}void gotoxy(int x, int y)//光标定位,光标定位函数SetConsoleCursorPosition是左上⾓位置是0,0然后向左向下延伸{COORD pos;pos.X = 2 * y;pos.Y = x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}void color(int a)//颜⾊函数{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);}void Refresh(int q[][22], int grade, int gamespeed, int length, int score) // 输出贪吃蛇棋盘{int i, j;for (i = 0; i<22; i++){for (j = 0; j<22; j++){if (q[i][j] == 0)//输出棋盘空⽩{gotoxy(i, j);color(11);printf("■");}if (q[i][j] == 1 || q[i][j] == 2)//输出棋盘墙壁{gotoxy(i, j);color(11);printf("□");}if (q[i][j] == 3)//输出蛇头{gotoxy(i, j);printf("★");}if (q[i][j] == 4)//输出蛇⾝{gotoxy(i, j);color(12);printf("◆");}if (q[i][j] == 5)//输出果⼦{gotoxy(i, j);color(12);printf("●");}}if (i == 0) printf("\t***********************");if (i == 1) printf("\t等级为:%d", grade);//显⽰等级if (i == 3) printf("\t⾃动前进时间");if (i == 4) printf("\t间隔为:%dms", gamespeed);//显⽰时间if (i == 6) printf("\t历史最⾼分为:%d分", score);if (i == 7) printf("\t你现在得分为:%d分", (length + (grade - 1) * 8) * 10);if (i == 8) printf("\t**********************");if (i == 9) printf("\t游戏说明:");if (i == 10) printf("\t(1)⽤⼩键盘⽅向键控制");if (i == 11) printf("\t蛇头运动⽅向;");if (i == 12) printf("\t(2)蛇每吃⼀个果⼦蛇⾝");if (i == 13) printf("\t增加⼀节;");if (i == 14) printf("\t(3)蛇咬到⾃⼰或碰到墙");if (i == 15) printf("\t壁游戏结束。
C语言实现贪吃蛇游戏(命令行)
C语⾔实现贪吃蛇游戏(命令⾏)这是⼀个纯C语⾔写的贪吃蛇游戏,供⼤家参考,具体内容如下#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>#define SNAKE_LENGTH 100//定义蛇的最⼤长度#define SCREEN_WIDETH 80#define SCREEN_HEIGHT 30//定义每⼀节蛇的坐标struct coor{int x;int y;};//枚举⽅向enum CH {right = VK_RIGHT,left = VK_LEFT,up = VK_UP,down = VK_DOWN};//定义蛇的属性struct snake{int len;//当前蛇的长度struct coor coord[SNAKE_LENGTH];//每⼀节蛇的坐标enum CH CH;//定义蛇的⽅向int SPEED;int flag;//定义蛇的状态 1表⽰存活 0表⽰死亡}snake;//光标移动函数void gotoxy(int x, int y){COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}//初始化游戏界⾯void init_sence(){//初始化上下墙for (int i = 0; i < SCREEN_WIDETH; i += 2){gotoxy(i,0);printf("■");gotoxy(i, SCREEN_HEIGHT);printf("■");}//初始化左右墙for (int i = 0; i <=SCREEN_HEIGHT; i++){gotoxy(0, i);printf("■");gotoxy(SCREEN_WIDETH,i);printf("■");}//打印提⽰信息gotoxy(SCREEN_WIDETH + 5, 2);printf("\t\t贪吃蛇");gotoxy(SCREEN_WIDETH + 5, 6);printf("2018//12//1");gotoxy(SCREEN_WIDETH + 5, 8);printf("作者:⼩⾖芽");gotoxy(SCREEN_WIDETH + 5, 10);printf("F1:加速\tF2:减速");gotoxy(SCREEN_WIDETH + 5, 12);printf("CTRL:继续\t空格:暂停");gotoxy(SCREEN_WIDETH + 5, 14);printf("ESC:退出游戏");gotoxy(SCREEN_WIDETH + 5, 28);printf("建议:QQ:2862841130:::");}struct foodcoord {int x;int y;int flag;//定义⾷物的状态}food;//**这是c程序**#include"snake.h"//蛇的移动void move_snake();//画出蛇void draw_snake();//产⽣⾷物void creatfood();//判断蛇是否吃到⾷物void eatfood();//判断蛇是否死掉void SnakeState();int main(){//设置窗⼝⼤⼩system("mode con cols=110 lines=31");//设置标题SetConsoleTitleA("贪吃蛇");//初始化蛇begin:snake.CH = VK_RIGHT;//初始化⽅向snake.len = 5; //初始化长度snake.SPEED = 300;//初始化蛇的移动速度snake.coord[1].x = SCREEN_WIDETH / 2;//初始化蛇头的坐标 snake.coord[1].y = SCREEN_HEIGHT / 2;snake.coord[2].x = SCREEN_WIDETH / 2-2;//初始化蛇头的坐标 snake.coord[2].y = SCREEN_HEIGHT / 2;snake.coord[3].x = SCREEN_WIDETH / 2-4;//初始化蛇头的坐标 snake.coord[3].y = SCREEN_HEIGHT / 2;//初始化⾷物状态food.flag = 1;//1表⽰吃到⾷物 0表⽰没有吃到⾷物//初始化⾷物状态snake.flag = 1;//1活 0死init_sence();//初始化游戏界⾯while (1){draw_snake();//画蛇Sleep(snake.SPEED);//蛇的移动速度move_snake();//移动蛇if(food.flag)creatfood();//产⽣⾷物eatfood();//判断是否吃到⾷物SnakeState();//判断蛇是否死亡if (!snake.flag)break;}system("cls");gotoxy(SCREEN_WIDETH/2, SCREEN_HEIGHT/2-4);printf(" GAME OVER");gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+2);printf("你的得分是:\t\t\t%d ",snake.len-1);gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+4);printf("我不服再来:\t\t\tCTRL ");gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+6);printf("算了垃圾游戏毁我青春:\t\tESC");while (1){if (GetAsyncKeyState(VK_CONTROL)){system("cls");goto begin;}else if (GetAsyncKeyState(VK_ESCAPE))return 0;}}//蛇的移动void move_snake(){//判断是否有按键操作if (GetAsyncKeyState(up)){if(snake.CH!=down)snake.CH = up;}else if (GetAsyncKeyState(down)){if (snake.CH != up)snake.CH = down;}else if (GetAsyncKeyState(right)){if (snake.CH != left)snake.CH = right;}else if (GetAsyncKeyState(left)){if (snake.CH != right)snake.CH = left;}else if (GetAsyncKeyState(VK_F1)){if(snake.SPEED>=100)snake.SPEED -= 50;}else if (GetAsyncKeyState(VK_F2)){if (snake.SPEED <= 3000)snake.SPEED += 100;}//根据检测到的⽅向改变蛇头的位置switch (snake.CH){case right:snake.coord[1].x += 2; break;case left:snake.coord[1].x -= 2; break;case up:snake.coord[1].y -= 1; break;case down:snake.coord[1].y += 1; break;}}//画出蛇void draw_snake(){//画出蛇头gotoxy(snake.coord[1].x, snake.coord[1].y);printf("□");//画出蛇⾝,直接⼀个for循环实现for (int i = 2; i <= snake.len; i++){gotoxy(snake.coord[i].x, snake.coord[i].y);printf("□");}//擦掉尾巴gotoxy(snake.coord[snake.len].x, snake.coord[snake.len].y); printf(" ");//遍历每⼀节蛇for (int i = snake.len; i >1; i--){snake.coord[i].x = snake.coord[i - 1].x;snake.coord[i].y = snake.coord[i - 1].y;}gotoxy(0, 0);printf("■");gotoxy(85, 25);printf("得分:%d ", snake.len-1);}//产⽣⾷物void creatfood(){//随机种⼦⽣成srand((unsigned)time(NULL));if(food.flag)while (1){food.x = rand() % 80;food.y = rand() % 30;if (food.x % 2 == 0 && food.x >= 2 && food.x <= 78 && food.y > 1 && food.y < 30){int flag = 0;//判断产⽣的⾷物可不可能在蛇的⾝体上for (int i = 1; i <= snake.len; i++){if (snake.coord[i].x == food.x&&snake.coord[i].y == food.y){flag = 1;break;}}if (flag)continue;//绘制⾷物else{gotoxy(food.x, food.y);printf("⊙");food.flag = 0;break;}}}food.flag = 0;}//判断蛇是否吃到⾷物void eatfood(){//只需要判断蛇头是否与⾷物重合if (food.x == snake.coord[1].x&&food.y == snake.coord[1].y){snake.len+=1;food.flag = 1;}}//判断蛇是否死掉void SnakeState(){if (snake.coord[1].x < 2 || snake.coord[1].x>78 || snake.coord[1].y < 1 || snake.coord[1].y>29) snake.flag = 0;for (int i = 2; i <= snake.len; i++){if (snake.coord[1].x == snake.coord[i].x&&snake.coord[1].y == snake.coord[i].y)snake.flag = 0;}}更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
彩版_贪吃蛇C语言版(VC++6.0中运行完美通过)
// (彩版——贪吃蛇代码)在vc++6.0 中运行通过~~// 本屌花了整整3天才弄透,然后自己小小改编了的贪吃蛇代码,// 特色在于可以自己输入初始蛇身长度,以及食物总数,// 二是可以加速、减速。
// 第一次挂代码,望对大家有微末帮助!!~//以下为运行效果图://好了,现在上源文件,,哈哈# include <stdio.h># include <stdlib.h># include <malloc.h># include <windows.h># include <conio.h># include <time.h># define ESC 27# define SPACE 32# define MAX_X 25# define MAX_Y 50int max_food;// 食物总数int length = 0;// 蛇身长度char sna_dir = 'd';// 蛇头方向char temp;int snaDir_x, snaDir_y;// 蛇头方向坐标clock_t now_time;// 取系统时钟double wait_time = 300;// 限制蛇的速度typedef struct Node// 结构体{int x;int y;struct Node *pNext;}NODE, *PNODE;typedef struct Queue// queue 队列{PNODE front;PNODE rear;}QUEUE, *PQUEUE;PQUEUE pSnake = (PQUEUE)malloc(sizeof(QUEUE));// 全局HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄void hideCursor()// 隐藏光标{CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(hConsole, &cursor_info);}void Setcolor(int color)// 实现彩色的函数{SetConsoleTextAttribute(hConsole, color);}void gotoxy(int x, int y)// 确定坐标{COORD loc;loc.X = y;loc.Y = x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HAND LE), loc);}void destroy()// 销毁{PNODE p = pSnake->front;PNODE t = pSnake->front;while (NULL != p)//最后使pSnake->front 和p 都为NULL{p = p->pNext;free(t);t = p;}}void game_over()// 游戏结束{gotoxy(11, 20);destroy();printf("Game Over");system("pause>nul");exit(0);}void enqueue(int x, int y)// 进队{PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->x = x;pNew->y = y;pSnake->rear->pNext = pNew;pSnake->rear = pNew;pSnake->rear->pNext = NULL;length++;}void dequeue()// 出队{PNODE p = pSnake->front;pSnake->front = pSnake->front->pNext;pSnake->front->x = p->x;pSnake->front->y = p->y;free(p);length--;}void pri_sna_info()// 打印信息{int i;Setcolor(13);gotoxy(4, 58);printf("Length: %d",length);gotoxy(6, 58);printf("还差%d 就通关了~~!", max_food+1);for (i=51; i<80; i++){gotoxy(10, i);printf("-");}Setcolor(13);gotoxy(15, 58);printf("按1 加速");gotoxy(16, 58);printf("按2 减速");gotoxy(19, 58);printf("空格键暂停");gotoxy(20, 58);printf("ESC 退出");Setcolor(15);}void draw_wall()// 画墙{int i;for (i=1; i<MAX_Y; i++){gotoxy(0, i);printf("=");gotoxy(MAX_X, i);printf("=");}for (i=0; i<MAX_X+1; i++){gotoxy(i, 0);printf("|");gotoxy(i, MAX_Y);printf("|");}Setcolor(15);}void rand_food()// 随机产生食物并显示{PNODE p;while(1){pSnake->front->x = rand()%(MAX_X-1) + 1;pSnake->front->y = rand()%(MAX_Y-1) + 1;p = pSnake->front->pNext;while(NULL != p){if(pSnake->front->x==p->x && pSnake->front->y==p->y) break;elsep = p->pNext;}if(NULL == p)break;}max_food--;Setcolor(14);gotoxy(pSnake->front->x, pSnake->front->y);printf("@");fflush(stdout);Setcolor(15);}void judge()// 判断赢或继续或挂{PNODE p;p = pSnake->front->pNext;if (max_food+1 == 0){system("cls");Setcolor(13);gotoxy(11, 25);printf("==== 哈哈,你赢啦!!!====");system("pause>nul");exit(0);}while (pSnake->rear != p){if (pSnake->rear->x==p->x && pSnake->rear->y==p->y){game_over();}elsep = p->pNext;}if (p->x==pSnake->front->x && p->y==pSnake->front->y) {rand_food();pri_sna_info();}elsedequeue();}void clear_tail()// 清除蛇尾{PNODE p = pSnake->front->pNext;gotoxy(p->x, p->y);printf(" ");}void print_sna()// 打印蛇{PNODE p = pSnake->front->pNext;int color;Setcolor(0xe);gotoxy(p->x, p->y);printf("z");while (pSnake->rear != p){color = rand()%15 + 1;if(color == 14)color -= rand()%13 + 1;Setcolor(color);p = p->pNext;gotoxy(p->x, p->y);printf("r");}Setcolor(0xf);gotoxy(p->x, p->y);printf("o");Setcolor(15);}void head(char c)// 蛇头方向{int x;char ch = 0;PNODE p = pSnake->front->pNext;while (pSnake->rear != p)p = p->pNext;if (c == 32){x = 1;gotoxy(11, 20);printf("--Pause--");while (ch != 32){ch = getch();}c = temp;gotoxy(11, 20);printf(" ");}if (x == 1)c = temp;if (temp=='a'&&c=='d' || temp=='d'&&c=='a' || temp=='s'&&c=='w' || temp=='w'&&c=='s')// 避免按与当前方向相反的键而挂掉,也就是增强游戏健壮性了c = temp;if (c!='a' && c!='w' && c!='d' && c!='s' && c!=27)c = temp;switch (c){case 'a':sna_dir = 'a';snaDir_x = p->x;snaDir_y = p->y - 1;if (snaDir_y < 1)game_over();break;case 's':sna_dir = 's';snaDir_x = p->x + 1;snaDir_y = p->y;if (snaDir_x == MAX_X)game_over();break;case 'w':sna_dir = 'w';snaDir_x = p->x - 1;snaDir_y = p->y;if (snaDir_x < 1)game_over();break;case 'd':sna_dir = 'd';snaDir_x = p->x;snaDir_y = p->y + 1;if (snaDir_y == MAX_Y)game_over();break;default:break;}enqueue(snaDir_x, snaDir_y); if (c == 27){system("cls");gotoxy(11, 35);printf("退出成功");system("pause>nul");exit(0);}}void move_sna()// 蛇的移动,,{if (kbhit())//这个函数去百度下就知道了——判断键盘是否有输入{temp = sna_dir;sna_dir = getch();if (sna_dir == '1'){sna_dir = temp;if (wait_time >= 50)wait_time -= 50;}if (sna_dir == '2'){sna_dir = temp;if (wait_time <= 800)wait_time += 50;}head(sna_dir);}else{head(sna_dir);}judge();print_sna();}void con_sna()// 控制蛇{if (clock()-now_time >= wait_time) // 通过wait_time控制蛇的速度{clear_tail();move_sna();now_time = clock();}}void init() // 这个是初始化,大家都知道的{int i;int len;system("title orrrrrrrrrrrrz——膜拜");system("mode con: cols=80 lines=26");PNODE (pSnake->front) = (PNODE)malloc(sizeof(NODE));pSnake->rear = pSnake->front;Setcolor(13);gotoxy(11, 20);printf("You Can Set The Length Of Your Snake: ");scanf("%d", &len);system("cls");gotoxy(11, 10);printf("You Can Set The Number Of Customs Clearance Of Foods: ");scanf("%d", &max_food);system("cls");Setcolor(15);hideCursor();// 隐藏光标for (i=0; i<len; i++){enqueue(11, i+20);}draw_wall();rand_food();pri_sna_info();}int main(void){init();srand((unsigned)time(NULL));// 随机函数,为rand()函数服务的,一样的,去百度这个函数~~now_time = clock();while (1){con_sna();}return 0;}。
贪吃蛇(C语言)
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <windows.h>//蛇头移动方向#define UP 1#define DOWN 2#define LEFT 3#define RIGHT 4〃死亡判定(葱墙或葱自己)#define KISSASS 1#define KISSWALL 2//坐标转化#define POINT(x,y) ((y)*80+(x)+1)// 将(x,y)坐标转化为一个int 类数值#define GETX(x) (((x)-1)%80)// 将int 类数值提取出原先的x#define GETY(y) (((y)-1)/80)// 同理,提取出yHANDLE Console;void Position(int x, int y); // 移动光标到(x,y) //Windows.hvoid DrawMap();// 画墙void ShowText(char *text);//根据字符串的长短智能打印出包围字符串的笑脸void ResetSnake();// 初始化贪吃蛇int RefreshSnake();// 更新蛇的移动void CreatFood();// 生成食物void Draw();//画出蛇身和食物void RefreshScreen();// 屏幕刷新void GameOver(int Type);// 游戏结束条件int Gaming();//代码跑起来char play = 0; ////值为1则继续游戏,值为0游戏退出char pause = 0; //值为1则暂停,值为0游戏继续char direction; // 蛇头方向int snake[500]; //snake[0]为蛇头int body; //蛇身体长度int newbody;//吃完食物新长的蛇身int addHead,deleteTail;//增加蛇头擦去蛇尾,使贪吃蛇动起来int food = 0; // 食物void main()(CONSOLE_CURSOR_INFO CurrInfo = { sizeof(CONSOLE_CURSOR_INFO), 0 };Console = GetStdHandle(STD_OUTPUT_HANDLE);DrawMap();ShowText("Copyright reserve by 博元");while(Gaming()){if (play)DrawMap();};return 0;}void Position(int x, int y)// 移动光标到(x,y) //Windows.h{COORD coors = { x, y };SetConsoleCursorPosition(Console, coors);}void DrawMap() // 画墙{int i;for (i = 3; i < 70; i = i + 12){Position(i, 0);printf("===我是墙===");}for (i = 0; i < 25; i = i + 1){Position(0, i);printf("|| ");}for (i = 3; i < 70; i = i + 12){Position(i, 24);printf("============");}for (i = 0; i < 25; i = i + 1){Position(76, i); printf("|| ");void ShowText(char *text) //根据字符串的长短智能打印出包围字符串的笑脸(int i;int strLength = strlen(text); // 得到字符串长度Position(40 - (strLength / 2)-1, 11);printf("%c”, 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);Position(40 - (strLength / 2)-1, 12);printf("%c ", 1);printf(text);printf(" %c", 1);Position(40 - (strLength / 2)-1, 13);printf("%c", 1);for (i = 0; i < strLength + 2; i++)(printf("%c", 1);}printf("%c", 1);}void ResetSnake() //初始化贪吃蛇(int x, y;for (x = 39, y = 0; y < 2; y++)(snake[y] = POINT(x, 7 - y);}body = 2; //设定蛇身初始长度为2newbody = 6;addHead = 0;deleteTail = 0;direction = LEFT;}int RefreshSnake() 〃更新蛇的移动〃返回值为1游戏结束(int x, y;memcpy(snake + 1, snake, sizeof(int)*body);if (!newbody){deleteTail = snake[body];snake[body] = 0;}else{body++;newbody--;}x = GETX(snake[0]);y = GETY(snake[0]);switch (direction) //控制蛇头移动方向{case UP:y -= 1; //蛇头向上移动一格(对应坐标y-1 )snake[0] = POINT(x, y);break;case DOWN:y += 1;snake[0] = POINT(x, y); break;case LEFT:x -= 1;snake[0] = POINT(x, y); break;case RIGHT:x += 1;snake[0] = POINT(x, y); break;}addHead = snake[0];if (x > 75 || x < 3 ||y > 23 || y < 1) // 检测是否撞墙(GameOver(KISSWALL);return 1;}int i;for (i = 1; i < body; i++)if (snake[0] == snake[i]) // 检测是否撞到自己身体(GameOver(KISSASS);return 1;}if (snake[0] == food)(while (1) //食物的位置不与蛇身重合(food = (rand() % (75 * 23));for (i = 0; snake[i]; i++)if (food == snake[i])// 检测是否吃到食物,吃到则reset食物food = 0;if (food) 〃如果food==0 则重新建立一个食物坐标break;}CreatFood(); // 吃了?再来一个!newbody = (rand() % 6) + 1; // 吃完食物蛇身增长一节}return 0;}void CreatFood() // 生成食物(if (GETX(food) > 75 || GETX(food) < 3 || GETY(food) > 23 || GETY(food) < 1) CreatFood;elsePosition(GETX(food), GETY(food));printf("%c”,4);}void Draw() //画出蛇身和食物(system("cls");int i;for (i = 0; snake[i]; i++)(Position(GETX(snake[i]), GETY(snake[i]));printf("%c”,1);}CreatFood();}void RefreshScreen() // 屏幕刷新(if (deleteTail)(Position(GETX(deleteTail), GETY(deleteTail));printf("");}if (addHead)(Position(GETX(addHead), GETY(addHead));printf("%c",1);}addHead = deleteTail = 0;}void GameOver(int Type) // 游戏结束条件(switch (Type)(case KISSASS://® 至ij 自己身体ShowText("NOOB !当你以光速绕着一棵树奔跑就会发现自己在葱自己!");break;case KISSWALL://撞墙ShowText("NOOB !你有考虑过墙的感受吗");}food = 0;play = 0;memset(snake, 0, sizeof(int) * 500); // 存初始化} int Gaming() // 执行int Keyboardinput;Sleep(60);// 速度if (kbhit())(Keyboardinput = getch();if (Keyboardi nput == 0 || Keyboardinput == 0xE0) (Keyboardinput = getch();switch (Keyboardi nput) // 方向控制(case 72:if (direction != DOWN) direction = UP;break;case 80:if (direction != UP)direction = DOWN;break;case 75:if (direction != RiGHT)direction = LEFT;break;case 77:if (direction != LEFT)direction = RiGHT;break;}}if (Keyboardi nput == '\r') // 暂停(if (!play)(play = 1;if (pause)(Draw();pause = 0;}}else(ShowText("不许暂停,继续葱!!");play = 0;pause =1;}}else if (KeyboardI nput == 0x1B) // 退出return 0; }if (play)(if (!food)(srand(clock());food = (rand() % (75 * 23));ResetSnake();Draw();}else(if (!RefreshSnake())(RefreshScreen();}}}return 1;}// Allrights reserve by 博元。
c语言课程设计贪吃蛇设计
Part Three
C语言基础知识
数据类型和变量
基本数据类型:int、float、char、double等 复合数据类型:数组、结构体、指针等 变量声明:使用关键字"int"、"float"等声明变量 变量赋值:使用"="为变量赋值 变量作用域:局部变量、全局变量等 变量生命周期:从声明到释放的过程
结构体和联合体:包括结构 体定义、结构体初始化、结 构体访问、联合体定义、联 合体初始化、联合体访问等
函数和数组
函数:C语言中的基本单元,用于实现特定功能
数组:C语言中的基本数据类型,用于存储一组相同类型 的数据
数组函数:如strlen()、strcpy()等,用于操作字符串
指针:C语言中的重要概念,用于指向内存地址
Part Four
贪吃蛇游戏设计
游戏逻辑设计
游戏结束:当蛇碰到边界或 自己时结束
游戏循环:不断更新蛇的位 置和方向
游戏开始:初始化蛇的位置 和方向
得分计算:根据吃到的食物 数量计算得分
游戏难度:根据得分调整游 戏难度,如增加蛇的速度或
改变食物的位置
游戏界面:设计游戏界面, 包括蛇、食物、边界等元素
Part Seven
总结和展望
课程设计收获和体会
掌握了C语言的基本语法和编 程技巧
学会了如何设计并实现一个完 整的游戏项目
提高了解决问题的能力和团队 协作能力
对游戏开发有了更深入的了解 和兴趣
C语言在游戏开发中的应用前景
游戏开发中,C语言具有高效、稳定的特点,适合开发大型游戏。 C语言具有广泛的应用领域,可以开发各种类型的游戏,如动作、冒险、策略等。 C语言具有强大的社区支持,可以找到大量的游戏开发资源和教程。 C语言在游戏开发中具有广泛的应用前景,可以开发出更多优秀的游戏作品。
C语言实现贪吃蛇代码
C语⾔实现贪吃蛇代码本⽂实例为⼤家分享了C语⾔实现贪吃蛇代码的具体代码,供⼤家参考,具体内容如下#include"stdafx.h"#include<stdio.h>#include<time.h>#include<windows.h>#include<stdlib.h>#include<conio.h>#define U 1#define D 2#define L 3#define R 4 //蛇的状态 U:上 D:下 L:左 R:右typedef struct snake //蛇⾝的⼀个节点{int x; //节点的x坐标int y; //节点的y坐标struct snake *next; //蛇⾝的下⼀个节点}snake;int score=0,add=10; //总得分和每吃⼀次⾷物的得分int highscore=0; //最⾼分int status,sleeptime=200; //蛇前进状态,每次运⾏的时间间隔snake *head,*food; //蛇头指针,⾷物指针snake *q; //遍历蛇时⽤的指针int endgamestatus=0; //游戏结束时的状态HANDLE hOut; //控制台句柄void gotoxy(int x,int y);int color(int c);void printsnake();void wlcome();void createmap();void scoreandtips();void initsnake();void createfood();int biteself();void cantcrosswall();void speedup();void speeddown();void snakemove();void keyboardcontrol();void lostdraw();void endgame();void choose();void file_out();void file_in();void explation();main(){system("mode con cols=100 lines=30");printsnake();wlcome();file_out();keyboardcontrol();endgame();}void gotoxy(int x,int y)//设置光标位置{COORD c;c.X=x;c.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); //定位光标的位置}int color(int c)//设置颜⾊{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);return 0;}void printsnake()//打印字符蛇{color(3);printf("学号:1910101099"); gotoxy(35,1);color(6);printf("/^\\/^\\");gotoxy(34,2);printf("|_| o|");gotoxy(33,2);color(2);printf("_");gotoxy(25,3);color(12);printf("\\/");gotoxy(31,3);color(2);printf("/");gotoxy(37,3);color(6);printf("\\_/");gotoxy(41,3);color(10);printf(" \\");gotoxy(26,4);color(12);printf("\\____");gotoxy(32,4);printf("_________");gotoxy(31,4);color(2);printf("|");gotoxy(43,4);color(10);printf("\\");gotoxy(32,5);color(2);printf("\\_______");gotoxy(44,5);color(10);printf("\\");gotoxy(39,6);printf("| | \\");gotoxy(38,7);printf("/ / \\");gotoxy(37,8);printf("/ / \\ \\");gotoxy(35,9);printf("/ / \\ \\");gotoxy(34,10);printf(" / / \\ \\");gotoxy(33,11);printf("/ / _----_ \\ \\");gotoxy(32,12);gotoxy(32,14);printf("\\ ~-____-~ _-~ ~-_ ~-_-~ /"); gotoxy(33,15);printf("~-_ _-~ ~-_ _-~");gotoxy(35,16);printf("~--____-~ ~-___-~");}void wlcome()//欢迎界⾯{int n;int i,j=1;gotoxy(43,18);color(11);printf("贪吃蛇⼤作战");color(14);for(i=20;i<=26;i++){for(j=27;j<=74;j++){gotoxy(j,i);if(i==20||i==26){printf("-");}else if(j==27||j==74){printf("|");}}}color(12);gotoxy(35,22);printf("1.开始游戏");gotoxy(55,22);printf("2.游戏说明");gotoxy(35,24);printf("3.退出游戏");gotoxy(29,27);color(3);printf("请选择1 2 3\n");color(14);scanf("%d",&n);switch(n){case 1:system("cls");//清屏createmap();initsnake();createfood();keyboardcontrol();break;case 2:explation();break;break;case 3:exit(0);break;}}void createmap()//创建地图{int i,j;for(i=0;i<58;i+=2){gotoxy(i,0);color(5);printf("□");gotoxy(i,26);gotoxy(0,i);printf("□");gotoxy(56,i);printf("□");}for(i=2;i<56;i+=2){for(j=1;j<26;j++){gotoxy(i,j);color(3);printf("■\n\n");}}}void scoreandtips()//游戏界⾯右侧的得分和⼩提⽰ {file_out();gotoxy(64,4);color(11);printf("*最⾼纪录*: %d",highscore);gotoxy(64,8);color(14);printf("得分: %d ",score);color(13);gotoxy(73,11);printf("⼩提⽰");gotoxy(60,13);color(6);printf("+---------------------+");gotoxy(60,25);printf("+---------------------+");color(3);gotoxy(64,14);printf("每个⾷物得分:%d分",add);gotoxy(64,16);printf("不能穿墙,不能咬到⾃⼰");gotoxy(64,18);printf("⽤↑↓←→分别控制蛇的移动");gotoxy(64,20);printf("F1为加速,F2为减速");gotoxy(64,22);printf("space: 暂停游戏");gotoxy(64,24);printf("ESC:退出游戏");}void file_out()//打开⽂件记录最⾼分{FILE *fp;fp=fopen("save.txt","a+");fscanf(fp,"%d",&highscore);fclose(fp);}void initsnake(){snake *tail;int i;tail=(snake*)malloc(sizeof(snake));tail->x=24;tail->y=5;tail->next=NULL;for(i=1;i<=4;i++){head=(snake*)malloc(sizeof(snake));head->next=tail;head->x=24+2*i;head->y=5;tail=head;}while(tail!=NULL){gotoxy(tail->x,tail->y);}void createfood()//随机出现⾷物{snake *food_1;srand((unsigned)time(NULL));food_1=(snake*)malloc(sizeof(snake));while((food_1->x%2!=0)){food_1->x=rand()%52+2;}food_1->y=rand()%24+1;q=head;while(q->next==NULL){if(q->x==food_1->x&&q->y==food_1->y){free(food_1);createfood();}q=q->next;}gotoxy(food_1->x,food_1->y);food=food_1;color(12);printf("@");}int biteself(){snake *self; //定义self为蛇⾝上除蛇头以外的节点self=head->next;while(self!=NULL){if(self->x==head->x&&self->y==head->y){return 1;}self=self->next;}return 0;}void cantcrosswall(){if(head->x==0||head->x==56||head->y==0||head->y==26) {endgamestatus=1;endgame();}}void speedup()//加速{if(sleeptime>=50){sleeptime=sleeptime-10;add=add+2;}}void speeddown()//减速{if(sleeptime<350){sleeptime=sleeptime+30;add=add-2;if(sleeptime==350){add=1;}}}void snakemove()//控制⽅向if(status==U)//上{nexthead->x=head->x; //向上前进时,x不变,y-1nexthead->y=head->y-1;nexthead->next=head;head=nexthead;q=head;//如果下⼀个位置上有⾷物,下⼀个位置的坐标和⾷物坐标相同if(nexthead->x==food->x&&nexthead->y==food->y){while(q!=NULL){gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}score=score+add;speedup();createfood();}else{while(q->next->next!=NULL)//如果没有遇见⾷物{gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}//经过上⾯的循环,q指向蛇尾,蛇尾的下⼀步就是蛇⾛过去的位置 gotoxy(q->next->x,q->next->y);color(3);printf("■");//恢复⾛过的位置free(q->next);q->next=NULL;}}if(status==D){nexthead->x=head->x; //向下前进时,x不变,y+1nexthead->y=head->y+1;nexthead->next=head;head=nexthead;q=head;//如果下⼀个位置上有⾷物,下⼀个位置的坐标和⾷物坐标相同if(nexthead->x==food->x&&nexthead->y==food->y){while(q!=NULL){gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}score=score+add;speedup();createfood();}else{while(q->next->next!=NULL)//如果没有遇见⾷物{gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}//经过上⾯的循环,q指向蛇尾,蛇尾的下⼀步就是蛇⾛过去的位置 gotoxy(q->next->x,q->next->y);color(3);if(status==L)//左{nexthead->x=head->x-2; //向左前进时,x不变,y+1nexthead->y=head->y;nexthead->next=head;head=nexthead;q=head;//如果下⼀个位置上有⾷物,下⼀个位置的坐标和⾷物坐标相同if(nexthead->x==food->x&&nexthead->y==food->y){while(q!=NULL){gotoxy(q->x,q->y); //⾷物变成蛇⾝上的⼀部分color(14);printf("★");q=q->next;}score=score+add;speedup();createfood();}else{while(q->next->next!=NULL)//如果没有遇见⾷物{gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}//经过上⾯的循环,q指向蛇尾,蛇尾的下⼀步就是蛇⾛过去的位置 gotoxy(q->next->x,q->next->y);color(3);printf("■");//恢复⾛过的位置free(q->next);q->next=NULL;}}if(status==R){nexthead->x=head->x+2; //向上前进时,x不变,y-1nexthead->y=head->y;nexthead->next=head;head=nexthead;q=head;//如果下⼀个位置上有⾷物,下⼀个位置的坐标和⾷物坐标相同if(nexthead->x==food->x&&nexthead->y==food->y){while(q!=NULL){gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}score=score+add;speedup();createfood();}else{while(q->next->next!=NULL)//如果没有遇见⾷物{gotoxy(q->x,q->y);color(14);printf("★");q=q->next;}//经过上⾯的循环,q指向蛇尾,蛇尾的下⼀步就是蛇⾛过去的位置 gotoxy(q->next->x,q->next->y);color(3);if(biteself()==1){endgamestatus=2;endgame();}}void keyboardcontrol(){status=R;while(1){scoreandtips();//GetAsyncKeyState函数⽤来判断函数调⽤指定虚拟键的状态 if(GetAsyncKeyState(VK_UP)&&status!=D){status=U;}else if(GetAsyncKeyState(VK_DOWN)&&status!=U){status=D;}else if(GetAsyncKeyState(VK_LEFT)&&status!=R){status=L;}else if(GetAsyncKeyState(VK_RIGHT)&&status!=L){status=R;}if(GetAsyncKeyState(VK_SPACE)){while(1){//调⽤sleep函数,令进程停⽌,直到达到其中设定的参数时间 Sleep(300);if(GetAsyncKeyState(VK_SPACE)){break;}}}else if(GetAsyncKeyState(VK_ESCAPE)){endgamestatus=3;break;}else if(GetAsyncKeyState(VK_F1)){speedup();}else if(GetAsyncKeyState(VK_F2)){if(sleeptime<350){sleeptime=sleeptime+30;add=add-2;if(sleeptime==350){add=1;}}}Sleep(sleeptime);snakemove();}}void lostdraw(){system("cls");int i,j;gotoxy(35,5);color(14);printf("o00o");gotoxy(39,5);color(11);printf("----------");gotoxy(48,5);color(14);printf("---");gotoxy(51,5);color(11);printf("----------");gotoxy(61,5);color(14);printf("o00o");gotoxy(65,5);color(11);printf("-----------------+");for(i=6;i<=19;i++){gotoxy(17,i);printf("|");gotoxy(82,i);printf("|");}gotoxy(17,20);printf("+----------------------------------");gotoxy(52,20);color(11);printf("-----------------------------+");}void endgame(){system("cls");if(endgamestatus==1){lostdraw();gotoxy(35,9);color(12);printf("对不起,您撞到墙了。
c语言贪吃蛇详细步骤
第二个参数:距离句柄(0,0)的相对位置, 要设置rd.x,rd.y的值,是COORD类型
种种子的函数和用法
种种子:srand((unsigned int)time()NULL) 利用时间差作为种种子的频率 包含头文件<time.h>
8.判断是否再产生食物
方法
判断蛇是否死亡和食物是否被吃掉就可以了 (判断食物是否被吃掉——只需判断蛇头的 坐标是否和食物的坐标重合就可以了)
9.蛇吃食物后变长
5.蛇的移动
步骤 1.销毁当前蛇 2.确定好蛇移动的方向,东西方向移动列+2 (方块占两个字符),南北方向移动行+1 3.找出蛇移动后的坐标 4.重新画蛇
销毁蛇的方法
找出当前蛇位置的坐标,用strncpy函数将数 组里面对应的坐标的方块换成空格 (注意: 一个方块等于两个空格)
6.判断蛇是否死亡
C语言贪吃蛇步骤和方法
1.显示界面
1. 把背景框画出来
2. 按自己的风格设计(追求代码的灵活性)
显示界面的实现方法
方法 1:把数组所有元素初始化为0,把边界 的元素初始化为1,把方块画到元素值为1 的边界上 方法 2 :直接定义一个字符数组,把背景框 画出来(推荐(printf输出比较少,解决闪 烁问题))
3.停止音乐播放
选择一个标记做为停止的信号(按键消息 (可以使用_getch函数,接收当前你按键盘 上的键的信息)) 停止播放音乐的函数:playsound (NULL,NULL,NULL)
4. 设置蛇的位置,长度和方向把蛇 画出来
C语言实现贪吃蛇游戏
C语⾔实现贪吃蛇游戏最近整理下电脑,看到了⾃⼰在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是⽐较好理解,于是把⾃⼰的代码搬上来,⽹络上写贪吃蛇的c语⾔的⽂章很多,我这篇也仅是给⼤家作为⼀个参考⽽已。
我的代码是在Windows下运⾏的,因为需要⽤到windows.h这个库。
然后也做了⼀个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了。
好了,直接上代码吧:1)头⽂件和宏定义#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<windows.h>#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define BLANK_CELL ''#define SNAKE_FOOD '$'#define WALL_CELL '*'2)各种实现函数的声明/*snake stepping: dy = -1(up) 1(dowm) 0(no move); dx = -1(left), 1(right), 0(no move)*/void snakemove(int, int);//to write dowm the current location of the snakevoid put_money(void);void output(void);// to put the current map on the screenvoid initial_the_game(void);void put_accelerate(void);// @ is a special food which can speed up your snake.int judge(int, int);/* when it comes to ai, it is used to judge whether the next step is movable. */int dis(int, int);// when it coomes to ai, it is used to calculate the current distence //between the snake head and the food.void welcome(void); // the game introduction.void gameover(void);void edition_handed(void);// the edition in which you can play by yourself.void edition_presentation(void);// the edition in which the snake can go automatically.3)各种全局变量// define vars for snake,notice name of vars in cint snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};int snakeLength = 5;int gamestate = 1;int current_speed = 600;int score = 0;char edition_choose; // for player to choose the edition.int con = 1; // to judge the initial state of the game;int energy = 0; // write down the condition to accelerate by eating $.//the following part is to realize the simple ai .const char movable[4] = {'a', 'd', 's', 'w'};int distance[4] = {9999, 9999, 9999, 9999};int fx = 6, fy = 6; // the coordinate of the food $4)地图char map[12][12] ={"************","*XXXXH *","* *","* *","* *","* $ *","* *","* @ *","* *","* *","************"};5)主函数(可选模式)int main() {while (con) {welcome();int flag = 1;while (flag) {edition_choose = getch(); //choose the editionif (edition_choose == 'h') {edition_handed();flag = 0;}else if (edition_choose == 'p') {edition_presentation();flag = 0;}else {printf("Please press the correct bottom -,- ...\n");}}gameover();}return 0;}6)⼿动模式实现void edition_handed(void) {system("cls");output();char ch = 'd';while (gamestate) {switch (ch) {case 'a': // go leftwhile (1) {snakemove(-1, 0);Sleep(current_speed);if (gamestate == 0) // to break the loop if the snake hit the wall or itself. break;if (kbhit() != 0) { // to change the directionch = getch();if (ch == 's' || ch == 'w')break;elsech = 'a';}}break;case 'd': // go rightwhile (1) {snakemove(1, 0);Sleep(current_speed);if (gamestate == 0)break;if (kbhit() != 0)ch = getch();if (ch == 's' || ch == 'w')break;elsech = 'd';}break;case 's': // go downwhile (1) {snakemove(0, 1);Sleep(current_speed);if (gamestate == 0)if (kbhit() != 0)ch = getch();if (ch == 'a' || ch == 'd')break;elsech = 's';}break;case 'w': // go upwhile (1) {snakemove(0, -1);Sleep(current_speed);if (gamestate == 0)break;if (kbhit() != 0)ch = getch();if (ch == 'a' || ch == 'd')break;elsech = 'w';}break;}if (gamestate == 0)break;}return;}7)⾃动模式实现void edition_presentation(void) { // for aisystem("cls");int i, min = 10000;output();char ch;char quit = 'o';int k;while (gamestate) { // find the shortest way; min = 10000;if (judge(-1, 0)) distance[0] = dis(-1, 0);if (judge(1, 0)) distance[1] = dis(1, 0);if (judge(0, 1)) distance[2] = dis(0, 1);if (judge(0, -1)) distance[3] = dis(0, -1);for (i = 0; i < 4; i++) {if (min >= distance[i]) {min = distance[i];k = i;}}Sleep(current_speed);switch (movable[k]) {case 'a': // go leftsnakemove(-1, 0);break;case 'd': // go rightsnakemove(1, 0);break;case 's': // go downsnakemove(0, 1);break;case 'w': // go upsnakemove(0, -1);break;}if (gamestate == 0)break;system("cls");output();}return;}8)其他辅助函数void welcome(void) { // just for some introductionprintf("WELCOME TO THE SNAKE'S WORLD \n");printf("\n");printf("\n");printf("Please choose the edition you want.\n");printf("\n");printf("\n");printf("The 'h' is for the hand-operated and the 'p' is for the simple presentation\n");printf("\n");printf("\n");printf("Attention: the presentation still has a liitle bug, while it can be moving right for a period of time...\n ");return;}游戏结束界⾯void gameover(void) { // give you some introduction when you lose the game.system("cls");printf("Game over\n");printf("Do you want to continue? y or n\n");char start; // in order to judge whether you still want to play the game.while (1) {start = getch();if (start == 'y') {system("cls");initial_the_game();break;} else if (start == 'n') {system("cls");con = 0; // in order to let the game end.printf("See you next time! ^-^\n");break;} else {printf("Please press the correct buttom.\n");}}}图像实现⽅式void output(void) { // put the cuttent game map.printf("THE INTERESTING SNAKE GAME CREATED BY LONGJ =,=\n");printf("use w~s~a~d to control the snake's movement\n");printf("ATTENTION: the @ can speed up your lovely snake~~\n");int i, j;for (i = 0; i < 12; i++) {for (j = 0; j < 12; j++) {printf("%c", map[i][j]);if (j == 11)printf("\n");}}printf("Your current_speed is %d\n", current_speed);printf("The number of your food undigested is %d (when it comes to 5, your speed will be accelerated!) \n", energy);printf("SCORE = %d\n", score);return;}蛇的⾏⾛实现void snakemove(int dx, int dy) { // all the conditions are comparing the head and the next position.int i;if (snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2]) return; // to prevent it go to itslef.if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == 'X') {gamestate = 0;return;}if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '*') {gamestate = 0;return;}if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == ' '|| map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@') {map[snakeY[0]][snakeX[0]] = ' '; // clear the former_tail&& current_speed > 100) { // what will happen when your snake eats the @current_speed -= 100;put_accelerate();}for (i = 0; i < snakeLength - 1; ++i) {snakeX[i] = snakeX[i + 1];snakeY[i] = snakeY[i + 1];}snakeX[snakeLength - 1] += dx;snakeY[snakeLength - 1] += dy;for (i = 0; i < snakeLength - 1; i++) // write down the current snake locationmap[snakeY[i]][snakeX[i]] = 'X';map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H';}if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$') {map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'X';snakeLength++;snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H';score++;energy++;if (energy == 5 && current_speed > 50) {current_speed -= 50;energy = 0;}put_money();}system("cls");output();return;}⾷物放置的实现void put_money(void) { /// ai will change the codeint flag = 1;while (flag) {srand(time(NULL));fx = rand() % 12;fy = rand() % 12;if (map[fy][fx] == ' ') {map[fy][fx] = '$';flag = 0;}if (edition_choose == 'p') {int i;for (i = 0; i< 4; i++)distance[i] = 9999;}}return;}void put_accelerate(void) {int x, y, flag = 1;while (flag) {srand(time(NULL));x = rand() % 12;y = rand() % 12;if (map[x][y] == ' ') {map[x][y] = '@';flag = 0;}}return;}ai辅助函数int dis(int dx, int dy) {return abs(fx - snakeX[snakeLength - 1] - dx) + abs(fy - snakeY[snakeLength - 1] - dy); }int judge(int dx, int dy) {return 1;else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$')return 1;else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@')return 1;elsereturn 0;}游戏over后的初始化函数:void initial_the_game(void) {int i, j, count = 1;snakeLength = 5;gamestate = 1;fx = fy = 6;current_speed = 600;for (i = 0; i < 5; i++)snakeY[i] = 1;for (i = 0; i < 5; i++) {snakeX[i] = count++;}for (j = 0; j < 12; j++) {map[0][j] = '*';map[11][j] = '*';}for (i = 1; i < 11; i++) {map[i][0] = map[i][11] = '*';for (j = 1; j < 11; j++)map[i][j] = ' ';}map[fy][fx] ='$';map[8][4] = '@';for (i = 0; i< 4; i++) {distance[i] = 9999;}for (i = 0; i < 4; i++)map[snakeY[i]][snakeX[i]] = 'X';map[snakeY[4]][snakeX[4]] = 'H';return;}⼩结:不难看出,c语⾔代码⽐较冗长,⽽且初始化的函数实现起来⼗分⿇烦,稍有不慎就会全部出错,导致游戏⽆法持续玩下去,博主当初写的时候就是被坑了很久=_=因⽽现在在学c++,希望以后把类的概念之类的东西都弄得更加熟练之后,可以去把这个冗长的c代码改成更加简洁,阅读性更强的c++代码。
贪吃蛇游戏代码(C语言编写)
贪吃蛇游戏代码(C语言编写)#include "graphics.h"#include "stdio.h"#define MAX 200#define MAXX 30#define MAXY 30#define UP 18432#define DOWN 20480#define LEFT 19200#define RIGHT 19712#define ESC 283#define ENTER 7181#define PAGEUP 18688#define PAGEDOWN 20736#define KEY_U 5749#define KEY_K 9579#define CTRL_P 6512#define TRUE 1#define FALSE 0#define GAMEINIT 1#define GAMESTART 2#define GAMEHAPPY 3#define GAMEOVER 4struct SPlace{int x;int y;int st;} place[MAX];int speed;int count;int score;int control;int head;int tear;int x,y;int babyx,babyy;int class;int eat;int game;int gamedelay[]={5000,4000,3000,2000,1000,500,250,100}; int gamedelay2[]={1000,1};static int hitme=TRUE,hit = TRUE; void init(void);void nextstatus(void);void draw(void);void init(void){int i;for(i=0;i<max;i++)< p="">{place[i].x = 0;place[i].y = 0;place[i].st = FALSE;}place[0].st = TRUE;place[1].st = TRUE;place[1].x = 1;speed = 9;count = 0;score = 0;control = 4;head = 1;tear = 0;x = 1;y = 0;babyx = rand()%MAXX;babyy = rand()%MAXY;eat = FALSE;game = GAMESTART;}void nextstatus(void){int i;int exit;int xx,yy;xx = x;yy = y;switch(control){case 1: y--; yy = y-1; break;case 2: y++; yy = y+1; break;case 3: x--; xx = x-1; break;case 4: x++; xx = x+1; break;}hit = TRUE;if ( ((control == 1) || (control ==2 )) && ( (y < 1) ||(y >= MAXY-1)) || (((control == 3) || (control == 4)) && ((x < 1) ||(x >= MAXX-1) ) ) ){}if ( (y < 0) ||(y >= MAXY) ||(x < 0) ||(x >= MAXX) ){game = GAMEOVER;control = 0;return;}for (i = 0; i < MAX; i++){if ((place[i].st) &&(x == place[i].x) &&(y == place[i].y) ){game = GAMEOVER;control = 0;return;}if ((place[i].st) &&(xx == place[i].x) &&(yy == place[i].y) ){hit = FALSE;goto OUT;}}OUT:if ( (x == babyx) && (y == babyy) ) {count ++;score += (1+class) * 10;}head ++;if (head >= MAX) head = 0;place[head].x = x;place[head].y = y;place[head].st= TRUE;if (eat == FALSE){place[tear].st = FALSE;tear ++;if (tear >= MAX) tear = 0;}else{eat = FALSE;exit = TRUE;while(exit){babyx = rand()%MAXX;babyy = rand()%MAXY;exit = FALSE;for( i = 0; i< MAX; i++ )if( (place[i].st)&&( place[i].x == babyx) && (place[i].y == babyy))exit ++;}}if (head == tear) game = GAMEHAPPY;}void draw(void){char temp[50];int i,j;for (i = 0; i < MAX; i++ ){setfillstyle(1,9);if (place[i].st)bar(place[i].x*15+1,place[i].y*10+1,place[i].x*15+14,place[i]. y*10+9);}setfillstyle(1,4);bar(babyx*15+1,babyy*10+1,babyx*15+14,babyy*10+9);setcolor(8);setfillstyle(1,8);bar(place[head].x*15+1,place[head].y*10+1,place[head].x*1 5+14,place[head].y*10+9); /* for( i = 0; i <= MAXX; i++ ) line( i*15,0, i*15, 10*MAXY);for( j = 0; j <= MAXY; j++ )line( 0, j*10, 15*MAXX, j*10); */rectangle(0,0,15*MAXX,10*MAXY);sprintf(temp,"Count: %d",count);settextstyle(1,0,2);setcolor(8);outtextxy(512,142,temp);setcolor(11);outtextxy(510,140,temp);sprintf(temp,"1P: %d",score);settextstyle(1,0,2);setcolor(8);outtextxy(512,102,temp); setcolor(12);outtextxy(510,100,temp); sprintf(temp,"Class: %d",class); setcolor(8);outtextxy(512,182,temp); setcolor(11);outtextxy(510,180,temp);}main(){int pause = 0;char temp[50];int d,m;int key;int p;static int keydown = FALSE; int exit = FALSE;int stchange = 0;d = VGA;m = VGAMED;initgraph( &d, &m, "" ); setbkcolor(3);class = 3;init();p = 1;while(!exit){if (kbhit()){key = bioskey(0);switch(key){case UP: if( (control != 2)&& !keydown)control = 1;keydown = TRUE;break;case DOWN: if( (control != 1)&& !keydown)control = 2;keydown = TRUE;break;case LEFT: if( (control != 4)&& !keydown)control = 3;keydown = TRUE;break;case RIGHT: if( (control != 3)&& !keydown)control = 4;keydown = TRUE;break;case ESC: exit = TRUE;break;case ENTER: init();break;case PAGEUP: class --; if (class<0) class = 0; break;case PAGEDOWN: class ++;if (class>7) class = 7; break;case KEY_U: if( ( (control ==1) ||(control ==2))&& !keydown) control = 3;else if(( (control == 3) || (control == 4))&& !keydown)control = 1;keydown = TRUE;break;case KEY_K: if( ( (control ==1) ||(control ==2))&& !keydown) control = 4;else if(( (control == 3) || (control == 4))&& !keydown)control = 2;keydown = TRUE;break;case CTRL_P:pause = 1 - pause; break;}}stchange ++ ;putpixel(0,0,0);if (stchange > gamedelay[class] + gamedelay2[hit]){stchange = 0;keydown = FALSE;p = 1 - p;setactivepage(p);cleardevice();if (!pause)nextstatus();else{settextstyle(1,0,4);setcolor(12);outtextxy(250,100,"PAUSE");}draw();if(game==GAMEOVER){settextstyle(0,0,6);setcolor(8);outtextxy(101,101,"GAME OVER"); setcolor(15);outtextxy(99,99,"GAME OVER"); setcolor(12);outtextxy(100,100,"GAME OVER"); sprintf(temp,"Last Count: %d",count); settextstyle(0,0,2);outtextxy(200,200,temp);}if(game==GAMEHAPPY){settextstyle(0,0,6);setcolor(12);outtextxy(100,300,"YOU WIN"); sprintf(temp,"Last Count: %d",count); settextstyle(0,0,2);outtextxy(200,200,temp);}setvisualpage(p);}}closegraph();}</max;i++)<>。
C语言实现贪吃蛇游戏代码
C语⾔实现贪吃蛇游戏代码本⽂实例为⼤家分享了C语⾔实现贪吃蛇游戏的具体代码,供⼤家参考,具体内容如下//------------------------------------------problm区------------------------------//①思考typedef 定义的变量如何利⽤fwrite进⾏存储//②典型可利⽤sleep()语句类实现控制移动速度//③BOOL PlaySoundW(LPCWSTR, HMODULE, DWORD)”: ⽆法将参数 1 从“const char[8]”转换为“LPCWSTR -->导致原因-->即原因vc2010开发环境中可能找不到字符串的⾳乐导致//④思考怎么消去不是这四个键的情况#include<stdio.h>#include<stdlib.h>#include<Windows.h>#include<conio.h>#include<string.h>#include<time.h>#include <MMSystem.h>//导⼊声⾳头⽂件-->即联合形成#pragma warning(disable:4996)//可以利⽤该代码消去警告类#pragma comment(lib, "Winmm.lib")//链接库//------------------------------------------变量区---------------------------------//---------------------------------------宏定义变量定义----------------------------#define H 24//定义⾼为24#define W 78//定义宽为78#define false 0#define true 1//-------------------------------------⾮宏定义变量定义----------------------------int n=0;//全局变量定⽤于写界⾯的状况int zpalyer=0;//记录总玩家的个数int fs;//⽤于记录玩家的分数int key=72;//⽤于控制玩家的移动⽅向的变量,且赋予初始化值为上int changeFlag = 0;//判断是否吃到了果实,⽤于确定是否需要擦除蛇尾int i;//⽤于函数中控制循环的变量char name[20];char name1[20];struct palyerinfo//定义玩家的名称与分数的结构体{char name[20];int palyefs;}player[100];struct //定义贪吃蛇的⾷物产⽣的坐标类{int x;int y;}food;struct //利⽤链表实现贪吃蛇的长度{int x[100];int y[100];int len;int zfs;int speed;}snake1;//------------------------------------------声明区---------------------------------void xj();void dq();void save();void ck();void xuanz();void jm();void phb();void fs1();int begin();void creatfood();void keyDown();bool sfjs();void getoxy(int x,int y);void ex();int yy();//------------------------------------------函数区---------------------------------//-----------------------------------------界⾯函数区------------------------------void menu1()//进⼊游戏后选择读取⽤户还是新建⽤户{int n;system("color 3e");//即加⼀个语句即可控制颜⾊,即与cmd中类似进⾏控制颜⾊-->控制的是控制台的颜⾊printf("====================================================\n");printf("# #\n");printf("# #\n");printf("# 1. 建⽴新玩家 #\n");printf("# 2. 读取存档 #\n");printf("# #\n");printf("# #\n");printf("====================================================\n");printf(" 选项:");scanf("%d", &n);if (n == 1){xj();}elseif (n == 2){dq();}else{printf("输⼊错误,请重新选择:\n");menu1();}}void menu2()//游戏⾥⾯的主菜单{int n;printf("====================================================\n");printf("# #\n");printf("# 贪吃蛇 Version goddemon #\n");printf("# #\n");printf("# 1. 开始游戏 #\n");printf("# 2. 查看排⾏榜 #\n");printf("# 3. 查看我的分数 #\n");printf("# 4. 退出游戏 #\n");printf("# #\n");printf("# #\n");printf("====================================================\n");printf(" 选项:\n");while (1){scanf_s("%d", &n);switch (n)//选择功能{case 1: begin(); break;case 2: phb(); break;case 3: fs1(); break;case 4: ex(); break;default: printf("输出错误,请重新输⼊:\n"); break;}}}void xj()//新建⽤户的名字{ck();++zpalyer; //注意如果是在退出的时候赋予的值,会出现只能读出两个值的状况特点-->即在⼦函数中赋予值,必须在读取值后进⾏赋予值加减才可,否则可能出现乱码状况 printf("\t\t输⼊⽤户名:\n");//注意利⽤\t\t进⾏控制界⾯-->很nicescanf("%s", name);strcpy(player[zpalyer].name,name);//注意赋值的先后menu2();}void dq()//读取存档⾥⾯的⽤户且进⾏选择{ck();printf("请输⼊读取的姓名:\n");scanf("%s", name1);for (i = 0; i <= zpalyer; i++){if ((strcmp(player[i].name, name1) == 0)){menu2();}elseif(i==zpalyer){printf("未找到该⽤户,请在次选择读取与创建功能\n");menu1();}}}//-----------------------------功能函数区---------------------------------int begin()//开始游戏{system("cls");jm();while (1){keyDown();if (!sfjs())break;creatfood();Sleep(snake1.speed);}player[zpalyer].palyefs = snake1.zfs;getoxy(W / 2, H / 2);printf("本次得分:%d\n",snake1.zfs);Sleep(3000);system("cls");menu2();Sleep(5000);return 0;}void phb()//排⾏榜{int i;printf("====================== 排⾏榜 ====================\n");for (i = 0; i <zpalyer; i++){printf("%s\t%d\n", player[i].name, player[i].palyefs);}printf("====================================================\n");}void fs1()//查看⾃⼰的分数{printf("你的分数为:\n");printf("%d", player[zpalyer].palyefs);}void ex()//退出功能{save();exit(0);}void save(){FILE *fp;fp = fopen("tcs.txt", "w+");fwrite(&zpalyer, 4, 1, fp);for (i = 0; i <= zpalyer; i++){fwrite(&player[i], sizeof(struct palyerinfo), 1, fp);}fclose(fp);}void ck()//读取⽂档中的数据状况{FILE *fp;int i;fp = fopen("tcs.txt", "r+");fread(&zpalyer, 4, 1, fp);for (i = 0; i <=zpalyer; i++){fread(&player[i], sizeof(struct palyerinfo), 1, fp);}fclose(fp);}void xuanz(){int j = 0, x = 1;menu2();}void getoxy(int x,int y)//定位坐标位置的函数{COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);}void jm()//贪吃蛇初始化界⾯{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY); system("color 3e");//打印上下边界的循环for (i = 0; i <= W; i+=2){getoxy(i, 0);printf("++");getoxy(i,H);//打印下边界printf("++");}for (i = 0; i < H; i++){getoxy(0, i);printf("++");getoxy(W, i);printf("++");//打印下边界}while (1)//⽣成初始化的⾷物{srand((unsigned int)time(NULL));food.x = rand() % (W - 4) + 2;food.y = rand() % (H - 2) + 1;if (food.x % 2 == 0){break;}}getoxy(food.x, food.y);printf("*");snake1.len = 3;snake1.speed = 200;snake1.x[0] = W / 2 + 1;//即在中间区域打印蛇头snake1.y[0] = H / 2;getoxy(snake1.x[0], snake1.y[0]);printf("★");for (i = 1; i < snake1.len; i++)//打印蛇头的状况特点-->利⽤getoxy(光标移动)+printf语句联合打印出蛇 {snake1.x[i] = snake1.x[i - 1] + 2;//即将坐标赋值加2的状况理解snake1.y[i] = snake1.y[i - 1];getoxy(snake1.x[i], snake1.y[i]);printf("★");}getoxy(W - 2,0);return;}void creatfood()//创建⾷物的函数{if (snake1.x[0] == food.x&&snake1.y[0] == food.y)//即蛇会吃掉这个⾷物{while (1){int flag = 1;srand((unsigned int)time(NULL));food.x = rand() % (W - 4) + 2;food.y = rand() % (H - 2) + 1;for (i = 0; i < snake1.len; i++){if (snake1.x[i] == food.x&&snake1.y[i] == food.y){flag = 0;break;}}if (flag&&food.x % 2 == 0)//⽤该语句进⾏判断是否该结束坐标赋值{break;}}getoxy(food.x, food.y);//即创建⾷物,每⼀次都进⾏创造printf("*");snake1.len++;//即蛇的长度加1,因为吃到了⾷物导致snake1.speed -= 5;snake1.zfs += 10;//即⼀个果实的分数等于10分changeFlag = 1;//即意味着吃到了⾷物,不需要擦除蛇尾的含义}return;//即return可以为空}void keyDown()//控制移动的函数{int pre_key = key;//记录前⼀个按键的⽅向if (_kbhit()){fflush(stdin);//getch()读取⽅向键的时候,会返回两次,第⼀次调⽤返回0或者224,第⼆次调⽤返回的才是实际值 key = _getch();//第⼀次调⽤返回的不是实际值key = _getch();//第⼆次调⽤返回实际值}if (changeFlag == 0){getoxy(snake1.x[snake1.len - 1], snake1.y[snake1.len - 1]);printf(" ");//在蛇尾处输出空格即擦去蛇尾}//将蛇的每⼀节依次向前移动⼀节(蛇头除外)for (i = snake1.len - 1; i > 0; i--){snake1.x[i] = snake1.x[i - 1];snake1.y[i] = snake1.y[i - 1];}if (pre_key == 72 && key == 80)key = 72;if (pre_key == 80 && key == 72)key = 80;if (pre_key == 75 && key == 77)key = 75;if (pre_key == 77 && key == 75)key = 77;switch (key){case 75:snake1.x[0] -= 2;//往左break;case 77:snake1.x[0] += 2;//往右break;case 72:snake1.y[0]--;//往上break;case 80:snake1.y[0]++;//往下break;}//打印出蛇头getoxy(snake1.x[0], snake1.y[0]);printf("★");getoxy(W - 2, 0);//由于⽬前没有吃到⾷物,changFlag值为0changeFlag = 0;return;}bool sfjs()//判断游戏是否结束的函数{if (snake1.y[0] == 0 || snake1.y[0] == H){return false;}if (snake1.x[0] == 0 || snake1.x[0] == W){return false;}for (i = 1; i < snake1.len; i++){if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0])//注意判断是否结束的函数需要注意{return false;}}return true;//即返回这个函数本⾝为真}int yy(){PlaySound(TEXT("F:\\⼩苹果.wav"), NULL, SND_NODEFAULT | SND_ASYNC | SND_LOOP);//即利⽤转换参数进⾏代//SND_LOOP-->//重复播放声⾳,必须与SND_ASYNC标志⼀块使⽤//SND_ASYNC-->//⽤异步⽅式播放声⾳,PlaySound函数在开始播放后⽴即返回//SND_NODEFAULT -->不播放缺省声⾳,若⽆此标志,则PlaySound在没找到声⾳时会播放缺省声⾳-->典型找⽂件⾳乐是⽤的格式查看⽅式进⾏找的 return 0;}//------------------------------------------主函数区-------------------------------int main(){yy();menu1();system("pause");return 0;}效果图:更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
纯C语言编写贪吃蛇(附源码,无EasyX、MFC)
纯C语⾔编写贪吃蛇(附源码,⽆EasyX、MFC)⼤⼀下学期,我所选的C语⾔⼯程实践是写⼀个贪吃蛇游戏。
那⼏天真的挺肝的,完成本专业的答辩之后就没怎么动过这程序了。
那时候写的贪吃蛇,还有⼀个栈溢出的问题没有解决,是因为当时所学知识有限,还没想到较好的解决⽅法。
现在⼤⼆上学期,在上了好⼏节数据结构之后,对栈有了⼀定的了解,随着对栈的学习,我想出了解决我写的贪吃蛇栈溢出的办法。
其实是前两天刚刚有这个想法,刚刚才测试并实现了,办法可⾏。
现在我加⼊了计算机学院的创新开放实验室,打算做的⼀个项⽬是微信⼩程序。
以后想记录⼀下我的开发过程和⼀些经历,⼜刚刚完善好贪吃蛇的代码,就简单记录⼀下吧。
因为代码⽐较长,先把参考资料写⼀下,想⾃⼰⼿写⼀遍的建议先看参考资料,再看这⾥的代码参考资料源代码/*预处理*/#include <windows.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <time.h>/*宏定义*/#define YES 1#define NO 0//蛇的移动⽅向#define U 1 //上#define D 2 //下#define L 3 //左#define R 4 //右#define RESPEED 250 //蛇的移动速度/*定义节点*/typedef struct SNAKE{int x;int y;struct SNAKE* next;}snake;/*全局变量*/snake* head, * food; //蛇头指针,⾷物指针snake* q; //遍历蛇的时候⽤到的指针/*【以下为所有函数的声明】*/void HideCursor(void); //隐藏光标void color(short int num); //颜⾊函数void StartWindow(void); //开始界⾯int gotoxy(int x, int y); //定位光标位置void creatMap(void); //创建地图void notice(int* score, int* highscore, int* Time, int* LongTime); //提⽰void initsnake(void); //初始化蛇⾝int biteself(unsigned long* sleeptime); //判断是否咬到了⾃⼰int createfood(void); //随机出现⾷物void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime); //结束游戏void pause(int* PauseBegin, int* PauseEnd); //暂停游戏void gamecontrol(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //控制游戏(包含蛇不能穿墙)void snakemove(unsigned long* sleeptime, int* count, int* score, int* status, int* endgamestatus); //蛇移动void gamestart(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime, int* TimeBegin); //游戏初始化void gamecontinue(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //再来⼀局void stop(unsigned long* sleeptime); //蛇停⽌移动void start(unsigned long* sleeptime); //蛇恢复移动void reset(int* count, int* score, int* Time, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //重置多项数据void updatescore(int* score, int* highscore, int* Time, int* LongTime); //更新多项数据int main(void){unsigned long sleeptime = RESPEED;int score = 0, highscore = 0, count = 0; //count是记录吃到⾷物的次数int status, endgamestatus = 0; //游戏结束情况,0未开始游戏前退出,1撞到墙,2咬到⾃⼰,3主动退出游戏,4通关HideCursor();gamestart(&score, &highscore, &endgamestatus, &Time, &LongTime, &TimeBegin);gamecontrol(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &Pa useBegin, &PauseEnd);endgame(&score, &highscore, &endgamestatus, &Time, &LongTime);gamecontinue(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &P auseBegin, &PauseEnd);return 0;}void HideCursor(void) //隐藏光标{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void color(short int num){HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));SetConsoleTextAttribute(hConsole, num);}void StartWindow(void){short int i;system("mode con cols=120 lines=30"); //设置窗⼝⼤⼩printf("温馨提⽰:请使⽤键盘操作(⿏标点击可能会导致程序出错)\n");printf("╔═══════════════════════════════════════════════════╗ \n");for (i = 0; i < 26; i++){printf("║ ║ \n");}printf("╚═══════════════════════════════════════════════════╝ \n");gotoxy(23, 2);color(3);printf("贪吃蛇");for (i = 15; ; i--){gotoxy(18, 4);color(i);printf("按任意键加载程序");Sleep(600);if (i == 1){i = 15;}if (kbhit()) //判断是否按键,等待输⼊按键为0,按键为1{break;}}gotoxy(10, 4);printf("1.开始游戏 2.退出游戏");getch();}int gotoxy(int x, int y){HANDLE handle; //定义句柄变量handle,创建⼀个句柄COORD pos; //定义结构体coord (坐标系coord)pos.X = x; //横坐标xpos.Y = y; //纵坐标yhandle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台输出句柄(值为-11)SetConsoleCursorPosition(handle, pos); //移动光标return YES;}void creatMap(void){int i;//地图⼤⼩:长24×宽20printf("■");gotoxy(i, 27);printf("■");}for (i = 7; i < 28; i++) //打印左右边框{gotoxy(2, i);printf("■");gotoxy(50, i);printf("■");}}void notice(int* score, int* highscore, int* Time, int* LongTime){system("title 2018051170 Project:贪吃蛇");gotoxy(4, 4);color(15);printf("得分:%3d 最⾼分:%3d ⽣存:%4ds 最久⽣存:%4ds", *score, *highscore, *Time, *LongTime); gotoxy(60, 7);printf("Author: 2018051170 Project: 贪吃蛇");gotoxy(60, 9);printf("游戏说明:");gotoxy(60, 10);printf("不能穿墙,不能咬到⾃⼰");gotoxy(60, 11);printf("↑↓←→控制蛇的移动");gotoxy(60, 12);printf("ESC:退出游戏空格:暂停游戏");}void initsnake(void){int i;snake* tail;tail = (snake*)malloc(sizeof(snake)); //从蛇尾开始,插头法,以x,y设定开始的位置tail->x = 26;tail->y = 14;tail->next = NULL;for (i = 1; i < 3; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 26 - 2 * i;head->y = 14;tail = head;}while (tail != NULL) //从头到为,输出蛇⾝{gotoxy(tail->x, tail->y);if (i == 3){color(2);printf("●");i++;}else if (tail != NULL){color(2);printf("■");}tail = tail->next;}}int biteself(unsigned long* sleeptime){snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y)self = self->next;}return NO;}int createfood(void){snake* food_1;food_1 = (snake*)malloc(sizeof(snake));srand((unsigned)time(NULL)); //产⽣⼀个随机数while ((food_1->x % 2) != 0) //保证其为偶数,使得⾷物能与蛇头对其{food_1->x = rand() % 50; //保证其在墙壁⾥X1 < X < X2if (food_1->x <= 4){food_1->x = food_1->x + 4;}}food_1->y = rand() % 27; //保证其在墙壁⾥Y1 < Y < Y2if (food_1->y < 7){food_1->y = food_1->y + 7;}q = head;while (q != NULL) //判断蛇⾝是否与⾷物重合{if (q->x == food_1->x && q->y == food_1->y){free(food_1);return 1;}if (q->next == NULL){break;}q = q->next;}gotoxy(food_1->x, food_1->y);food = food_1;color(3);printf("★");return 0;}void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime) {color(15);gotoxy(60, 14);if (*endgamestatus == 0){printf("您退出了游戏。
C语言实现贪吃蛇游戏演示
C语⾔实现贪吃蛇游戏演⽰本⽂实例为⼤家分享了C语⾔实现贪吃蛇游戏的具体代码,供⼤家参考,具体内容如下IDE⽤的是 VS2019先看效果代码全览game.h#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>#define PLATFORM 1 //运⾏的系统 1为win 0为linux#define MAPWIDTH 15 //地图宽度,包括墙#define MAPHEIGHT 15 //地图⾼度,包括墙#define SNAKELENGTH (MAPHEIGHT - 2) * (MAPWIDTH - 2)//结构体声明struct Body{int isExist;int x;int y;};struct Food {int x;int y;};void game();void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight);void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food);void clearScreen();void inputProcess(char* pinput);void initSnake(struct Body snake[SNAKELENGTH], int length);void generateFood(struct Food* food, struct Body snake[]);int isWall(int x, int y);int isSnake(int x, int y, struct Body snake[], int lengh);void control(char input, struct Body snake[]);void generateFood(struct Food* food, struct Body snake[]);int isFood(int x, int y, struct Food* food);int isEat(struct Body snake[], struct Food* pfood);void bodyMove(struct Body snake[], int* bodyLength);int isInBody(struct Body snake[], int lengh);GameStart.c#include "game.h"void displayMenu() {printf("########################\n");printf("###### 贪吃蛇游戏 #######\n");printf("########################\n");printf("------------------------\n");printf(" 1.开始游戏 \n");printf(" 0.退出游戏 \n");printf("------------------------\n");printf("请输⼊选项:>");char ch;scanf("%c", &ch);getchar();switch (ch){case '1': {game();break;}case '0': {exit(0);break;}default:printf("输⼊错误,请重新输⼊:>");break;}}int main(void) {while (1) {clearScreen();displayMenu();clearScreen();}return 0;}game.c#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h"//游戏逻辑void game() {//分数int score = 0;//游戏状态 0为胜利 1为咬到蛇⾝ 2为撞到墙上 int gameState = 0;//输⼊状态char input = 0;//墙char wall[MAPHEIGHT][MAPWIDTH];//创建蛇结构体数组struct Body snake[SNAKELENGTH];//创建⾷物结构体struct Food food = { 5,5 };//初始化蛇initSnake(snake, SNAKELENGTH);//初始化墙initWall(wall, MAPWIDTH, MAPHEIGHT);//⽣成⾷物generateFood(&food, snake);while (1){//清屏clearScreen();control(input, snake);//显⽰地图displayMap(MAPWIDTH, MAPHEIGHT, snake, SNAKELENGTH, food); printf("得分:%d\n", score);//printf("food:%d %d\n", food.x, food.y);//printf("snake:%d %d", snake[0].x, snake[0].y);//处理输⼊inputProcess(&input);//撞到蛇⾝,游戏失败if (isInBody(snake, SNAKELENGTH)) {gameState = 1;break;}//撞到墙上,游戏失败if (isWall(snake[0].x, snake[0].y)) {gameState = 2;break;}//吃到⾷物加分,蛇⾝加⼀if (isEat(snake, &food)) {score++;snake[score].isExist = 1;snake[score].x = snake[score - 1].x;snake[score].y = snake[score - 1].y;if (score == SNAKELENGTH - 1) {//游戏胜利gameState = 0;break;}generateFood(&food, snake);}//蛇⾝移动bodyMove(snake, &score);}//胜负显⽰switch (gameState){case 1: {printf("咬到蛇⾝,游戏结束!\n");break;}case 2: {printf("撞到墙上,游戏结束!\n");break;}case 0: {printf("游戏胜利!\n");break;}default:break;}printf("按回车键退出");getchar();}//清除屏幕void clearScreen() {if (PLATFORM) {system("cls");}else {system("clear");printf("\033c");}//输⼊处理void inputProcess(char* pinput) {int t = (int)time(NULL);while (1) {if (_kbhit()) {switch (getch()){case 'w': {if (*pinput != 's') {*pinput = 'w';}break;}case 's':{if (*pinput != 'w') {*pinput = 's';}break;}case 'a': {if (*pinput != 'd') {*pinput = 'a';}break;}case 'd': {if (*pinput != 'a') {*pinput = 'd';}break;}/* case ' ': {*pinput = ' ';break;}*/default:break;}}if ((int)time(NULL) - t == 1) {//printf("%c\n", *pinput);//⼀秒⼀帧break;}/*if (*pinput == ' ') {continue;}*/}}//初始化墙//'#'墙//' '空void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight) { for (int i = 0; i < mapHeight; i++) {for (int j = 0; j < mapWidth; j++) {if (i == 0 || i == mapHeight - 1) {wall[i][j] = '#';else if (j == 0 || j == MAPWIDTH - 1) {wall[i][j] = '#';}else {wall[i][j] = ' ';}}}}//初始化蛇状态,位置void initSnake(struct Body snake[SNAKELENGTH], int length) { for (int i = 0; i < length; i++) {if (i == 0){snake[i].x = MAPWIDTH / 2;snake[i].y = MAPHEIGHT / 2;//蛇出⽣位置,即蛇头初始位置snake[i].isExist = 1;}else {snake[i].isExist = 0;snake[i].x = 0;snake[i].y = 0;}}}//⽣成⾷物void generateFood(struct Food* food, struct Body snake[]) {int x;int y;srand((unsigned int)time(NULL));do {x = (rand() % MAPHEIGHT) + 1;y = (rand() % MAPWIDTH) + 1;} while (isSnake(x, y, snake, SNAKELENGTH) || isWall(x, y));(*food).y = y;(*food).x = x;}//判断是否是墙int isWall(int x, int y) {if (y <= 1 || y >= MAPHEIGHT || x <= 1 || x >= MAPWIDTH) {return 1;}return 0;}//判断是否是蛇int isSnake(int x, int y, struct Body snake[], int lengh) {for (int i = 0; i < lengh; i++) {if (snake[i].isExist == 1 && snake[i].x == x && snake[i].y == y) { return 1;}}return 0;}//判断是否撞到蛇⾝int isInBody(struct Body snake[], int lengh) {for (int i = 1; i < lengh; i++) {if (snake[i].isExist == 1 && snake[i].x == snake[0].x && snake[i].y == snake[0].y) {return 1;}}return 0;}//判断是否是⾷物int isFood(int x, int y, struct Food* food) {if ((*food).x == x && (*food).y == y) {return 1;}return 0;}//显⽰游戏地图void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food) { int x;int y;for (int i = 0; i < mapHeight; i++) {y = i + 1;for (int j = 0; j < mapWidth; j++) {x = j + 1;if (isWall(x, y)) {printf("# ");}else if (isSnake(x, y, snake, snakelength)) {if (snake[0].x == x && snake[0].y == y) {printf("@ ");//蛇头}else {printf("* ");//蛇⾝}}else if (isFood(x, y, &food)) {printf("+ ");}else {printf(" ");}}printf("\n");}}//⽅向控制void control(char input, struct Body snake[]) {switch (input) {case 'w': {snake[0].y -= 1;break;}case 'a': {snake[0].x -= 1;break;}case 's': {snake[0].y += 1;break;}case 'd': {snake[0].x += 1;break;}}}//判断是否吃到⾷物int isEat(struct Body snake[], struct Food* pfood) {if (isFood(snake[0].x, snake[0].y, pfood)) {return 1;}return 0;}//移动蛇⾝void bodyMove(struct Body snake[], int* bodyLength) {if (*bodyLength) {for (int i = *bodyLength; i >= 1; i--) {snake[i].x = snake[i - 1].x;snake[i].y = snake[i - 1].y;}}}相关思路有空再写。
贪吃蛇C语言代码实现(难度可选)
贪吃蛇C语⾔代码实现(难度可选)本⽂实例为⼤家分享了C语⾔实现贪吃蛇的具体代码,供⼤家参考,具体内容如下/*****************************************************************************贪吃蛇(难度可选)**********************************制作者:Xu Lizi ⽇期:2012/12/31****************************部分函数有借鉴**********************************************************************************/#include<stdio.h>#include<conio.h>#include<string.h>#include<stdlib.h>#include<time.h>int snakey[100]={5,4,3,2,1}; /*定义蛇的横坐标*/int snakex[100]={1,1,1,1,1}; /*定义蛇的纵坐标,蛇头起始位置为(5,1)*/int life=0; /*定义蛇的⽣命,0表⽰存活,1表⽰死亡*/int lenght=5; /*定义蛇的长度,初始为5节*/char map[12][24]={"***********************", /*y*/"* *","* *","* *","* *","* *","* *","* *","* *","* *","* *",/*x*/ "***********************"};void put_money(int i,int j) /*放钱函数,使⽤随机数,随机出现⾷物*/{int x=0,y=0;srand(time(NULL));while ( (map[y][x]==003) || (map[y][x]==002) || (map[y][x]=='*') || ((x==i)&&(y==j)) ){x=rand()%21+1;y=rand()%10+1;}map[y][x]='$';return;}void output() /*输出*/{system("cls");int i,j;for(i=0; i<12; i++){for(j=0; j<23; j++) printf("%c", map[i][j]);printf("\n");}return;}void gameover() /*游戏结束*/{life=1;printf("笨蛋,输了吧\n");return;}void turn_up() /*向上移动*/{system("cls");int i;if ( (snakex[0]==1) || (map[snakex[0]-1][snakey[0]]==003) ) gameover(); else { if (map[snakex[0]-1][snakey[0]]=='$'){put_money( snakey[0], snakex[0]-1 );lenght++;map[snakex[lenght-1]][snakey[lenght-1]]=003;}for(i=lenght; i>0; i--){snakex[i]=snakex[i-1];snakey[i]=snakey[i-1];}map[snakex[lenght]][snakey[lenght]]=' ';snakex[0]--;for(i=lenght-1; i>0; i--) map[snakex[i]][snakey[i]]=003;map[snakex[0]][snakey[0]]=002;output();}return;}void turn_down() /*向下*/{system("cls");int i;if ( (snakex[0]==10) || (map[snakex[0]+1][snakey[0]]==003) ) gameover();else { if (map[snakex[0]+1][snakey[0]]=='$'){put_money(snakey[0],snakex[0]+1);lenght++;map[snakex[lenght-1]][snakey[lenght-1]]=003;}for(i=lenght; i>0; i--){snakex[i]=snakex[i-1];snakey[i]=snakey[i-1];}snakex[0]++;map[snakex[lenght]][snakey[lenght]]=' ';for(i=lenght-1; i>0; i--) map[snakex[i]][snakey[i]]=003;map[snakex[0]][snakey[0]]=002;output();}return;}void turn_left() /*向左*/{system("cls");int i;if ( (snakey[0]==1) || (map[snakex[0]][snakey[0]-1]==003) ) gameover();else { if (map[snakex[0]][snakey[0]-1]=='$'){put_money(snakey[0]-1,snakex[0]);lenght++;map[snakex[lenght-1]][snakey[lenght-1]]=003;}for(i=lenght; i>0; i--){snakex[i]=snakex[i-1];snakey[i]=snakey[i-1];}map[snakex[lenght]][snakey[lenght]]=' ';snakey[0]--;for(i=lenght-1; i>0; i--) map[snakex[i]][snakey[i]]=003;map[snakex[0]][snakey[0]]=002;output();}return;}void turn_right() /*向右*/{system("cls");int i;if ( (snakey[0]==21) || (map[snakex[0]][snakey[0]+1]==003) ) gameover();else {if (map[snakex[0]][snakey[0]+1]=='$'){put_money(snakey[0]+1,snakex[0]);lenght++;map[snakex[lenght-1]][snakey[lenght-1]]=003;}for(i=lenght; i>0; i--){snakex[i]=snakex[i-1];snakey[i]=snakey[i-1];}map[snakex[lenght]][snakey[lenght]]=' ';snakey[0]++;for(i=lenght-1; i>0; i--) map[snakex[i]][snakey[i]]=003;map[snakex[0]][snakey[0]]=002;output();}return;}int main(){int i,timeover,hard;long start;char name , direcation;printf("\n 向上移动:W ;向下移动:S ; 向左移动:A ;向右移动:D \n");printf("\t请选择难度(数字)\n\t分1~5级,分别代表\n\t1难,2中上,3中,4中下5,易:\n");scanf("%d",&hard);system("cls");for(i=1;i<5;i++) map[1][i]=003; /*输出蛇⾝*/map[1][5]=002; /*输出蛇头*/put_money(0,0);output();while(life!=1) /*当蛇死亡时结束循环*/{/*让蛇⾃动运⾏的函数******有借鉴*/timeover=1;start=clock();while((timeover=(clock()-start<=hard*100))&&!kbhit()); //难度设定if(timeover){direcation=getch();}/*让蛇⾃动运⾏的函数******有借鉴*/switch(direcation){case 'w':turn_up();break;case 's':turn_down();break;case 'a':turn_left();break;case 'd':turn_right();break;}}return 0;}更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// (彩版——贪吃蛇代码)在vc++6.0 中运行通过~~ //以下为运行效果图://好了,现在上源文件,,哈哈# include <stdio.h># include <stdlib.h># include <malloc.h># include <windows.h># include <conio.h># include <time.h># define ESC 27# define SPACE 32# define MAX_X 25# define MAX_Y 50int max_food;// 食物总数int length = 0;// 蛇身长度char sna_dir = 'd';// 蛇头方向char temp;int snaDir_x, snaDir_y;// 蛇头方向坐标clock_t now_time;// 取系统时钟double wait_time = 300;// 限制蛇的速度typedef struct Node// 结构体{int x;int y;struct Node *pNext;}NODE, *PNODE;typedef struct Queue// queue 队列{PNODE front;PNODE rear;}QUEUE, *PQUEUE;PQUEUE pSnake = (PQUEUE)malloc(sizeof(QUEUE));// 全局HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄void hideCursor()// 隐藏光标{CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(hConsole, &cursor_info);}void Setcolor(int color)// 实现彩色的函数{SetConsoleTextAttribute(hConsole, color);}void gotoxy(int x, int y)// 确定坐标{COORD loc;loc.X = y;loc.Y = x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HAND LE), loc);}void destroy()// 销毁{PNODE p = pSnake->front;PNODE t = pSnake->front;while (NULL != p)//最后使pSnake->front 和p 都为NULL{p = p->pNext;free(t);t = p;}}void game_over()// 游戏结束{gotoxy(11, 20);destroy();printf("Game Over");system("pause>nul");exit(0);}void enqueue(int x, int y)// 进队{PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->x = x;pNew->y = y;pSnake->rear->pNext = pNew;pSnake->rear = pNew;pSnake->rear->pNext = NULL;length++;}void dequeue()// 出队{PNODE p = pSnake->front;pSnake->front = pSnake->front->pNext;pSnake->front->x = p->x;pSnake->front->y = p->y;free(p);length--;}void pri_sna_info()// 打印信息{int i;Setcolor(13);gotoxy(4, 58);printf("Length: %d",length);gotoxy(6, 58);printf("还差%d 就通关了~~!", max_food+1);for (i=51; i<80; i++){gotoxy(10, i);printf("-");}Setcolor(13);gotoxy(15, 58);printf("按1 加速");gotoxy(16, 58);printf("按2 减速");gotoxy(19, 58);printf("空格键暂停");gotoxy(20, 58);printf("ESC 退出");Setcolor(15);}void draw_wall()// 画墙{int i;for (i=1; i<MAX_Y; i++){gotoxy(0, i);printf("=");gotoxy(MAX_X, i);printf("=");}for (i=0; i<MAX_X+1; i++){gotoxy(i, 0);printf("|");gotoxy(i, MAX_Y);printf("|");}Setcolor(15);}void rand_food()// 随机产生食物并显示{PNODE p;while(1){pSnake->front->x = rand()%(MAX_X-1) + 1;pSnake->front->y = rand()%(MAX_Y-1) + 1;p = pSnake->front->pNext;while(NULL != p){if(pSnake->front->x==p->x && pSnake->front->y==p->y) break;elsep = p->pNext;}if(NULL == p)break;}max_food--;Setcolor(14);gotoxy(pSnake->front->x, pSnake->front->y);printf("@");fflush(stdout);Setcolor(15);}void judge()// 判断赢或继续或挂{PNODE p;p = pSnake->front->pNext;if (max_food+1 == 0){system("cls");Setcolor(13);gotoxy(11, 25);printf("==== 哈哈,你赢啦!!!====");system("pause>nul");exit(0);}while (pSnake->rear != p){if (pSnake->rear->x==p->x && pSnake->rear->y==p->y){game_over();}elsep = p->pNext;}if (p->x==pSnake->front->x && p->y==pSnake->front->y) {rand_food();pri_sna_info();}elsedequeue();}void clear_tail()// 清除蛇尾{PNODE p = pSnake->front->pNext;gotoxy(p->x, p->y);printf(" ");}void print_sna()// 打印蛇{PNODE p = pSnake->front->pNext;int color;Setcolor(0xe);gotoxy(p->x, p->y);printf("z");while (pSnake->rear != p){color = rand()%15 + 1;if(color == 14)color -= rand()%13 + 1;Setcolor(color);p = p->pNext;gotoxy(p->x, p->y);printf("r");}Setcolor(0xf);gotoxy(p->x, p->y);printf("o");Setcolor(15);}void head(char c)// 蛇头方向{int x;char ch = 0;PNODE p = pSnake->front->pNext;while (pSnake->rear != p)p = p->pNext;if (c == 32){x = 1;gotoxy(11, 20);printf("--Pause--");while (ch != 32){ch = getch();}c = temp;gotoxy(11, 20);printf(" ");}if (x == 1)c = temp;if (temp=='a'&&c=='d' || temp=='d'&&c=='a' || temp=='s'&&c=='w' || temp=='w'&&c=='s')// 避免按与当前方向相反的键而挂掉,也就是增强游戏健壮性了c = temp;if (c!='a' && c!='w' && c!='d' && c!='s' && c!=27)c = temp;switch (c){case 'a':sna_dir = 'a';snaDir_x = p->x;snaDir_y = p->y - 1;if (snaDir_y < 1)game_over();break;case 's':sna_dir = 's';snaDir_x = p->x + 1;snaDir_y = p->y;if (snaDir_x == MAX_X)game_over();break;case 'w':sna_dir = 'w';snaDir_x = p->x - 1;snaDir_y = p->y;if (snaDir_x < 1)game_over();break;case 'd':sna_dir = 'd';snaDir_x = p->x;snaDir_y = p->y + 1;if (snaDir_y == MAX_Y)game_over();break;default:break;}enqueue(snaDir_x, snaDir_y); if (c == 27){system("cls");gotoxy(11, 35);printf("退出成功");system("pause>nul");exit(0);}}void move_sna()// 蛇的移动,,{if (kbhit())//这个函数去百度下就知道了——判断键盘是否有输入{temp = sna_dir;sna_dir = getch();if (sna_dir == '1'){sna_dir = temp;if (wait_time >= 50)wait_time -= 50;}if (sna_dir == '2'){sna_dir = temp;if (wait_time <= 800)wait_time += 50;}head(sna_dir);}else{head(sna_dir);}judge();print_sna();}void con_sna()// 控制蛇{if (clock()-now_time >= wait_time) // 通过wait_time控制蛇的速度{clear_tail();move_sna();now_time = clock();}}void init() // 这个是初始化,大家都知道的{int i;int len;system("title orrrrrrrrrrrrz——膜拜");system("mode con: cols=80 lines=26");PNODE (pSnake->front) = (PNODE)malloc(sizeof(NODE));pSnake->rear = pSnake->front;Setcolor(13);gotoxy(11, 20);printf("You Can Set The Length Of Your Snake: ");scanf("%d", &len);system("cls");gotoxy(11, 10);printf("You Can Set The Number Of Customs Clearance Of Foods: ");scanf("%d", &max_food);system("cls");Setcolor(15);hideCursor();// 隐藏光标for (i=0; i<len; i++){enqueue(11, i+20);}draw_wall();rand_food();pri_sna_info();}int main(void){init();srand((unsigned)time(NULL));// 随机函数,为rand()函数服务的,一样的,去百度这个函数~~now_time = clock();while (1){con_sna();}return 0;}。