学自{
http://download.csdn.net/download/l04205613/3656909
}
C好搓哟~ 一些窗口操作都不会,参考下学长的学习下.
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <conio.h> #define NN 200 int score, max, speed=300;//当前得分,最高分,速度 int map[22][22];//地图 char key;//开始游戏后输入值 1234对应上下左右 struct Food{ int x,y;//食物的坐标 int is_need;//是否需要生成食物 }food; struct Snack{ int x[NN],y[NN];//蛇的位置 int len;//长度 int dir; //l234对应上下左右 int life;//是否存活 0存货 1死亡 }snack; void gotoxy(int x,int y){ COORD c;//定义一个坐标 c.X = x-1; c.Y = y-1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);//设置窗口句柄并定义窗口的位置 //GetStdHandle(STD_OUTPUT_HANDLE) 获取窗口标准输出的句柄 //通过句柄可以对窗口进行一些操作 } void Game(){ system("cls");//清屏 printf("操作说明: "); printf(" 'w':向上 's':向下 'a':向左 'd':向右 "); printf("感谢 yyfer "); system("pause");//停止 } void showMap(){ gotoxy(1,1); printf("score: %d ",score); for(int i=0;i<22;i++){ for(int j=0;j<22;j++){ if(i==0||j==0||i==21||j==21) printf("※"); else if(map[i][j]==0) printf(" "); else if(map[i][j]==3) printf("★");//食物 else if(map[i][j]==2) printf("●");//蛇头 else printf("¤"); }puts(""); } } void endGame(){ system("cls"); if(score>max){ printf("********** "); printf(" 恭喜您! "); printf(" 破了最高纪录 "); printf("最高分: %d ",max=score); }else{ printf("游戏结束 "); } system("pause"); } void start(){ while(1){ system("cls"); printf("******游戏选项****** "); printf(" 0.退出 "); printf(" 1.开始游戏 "); printf(" 2.最高分 "); printf(" 3.游戏说明 "); switch(getch()){ case '0': exit(0); case '1': return ; case '2': system("cls");printf("最高分:%d ",max);system("pause");break; case '3': Game();break; default:system("cls");printf("没有此选项 ");system("pause"); } } } void Gameplay(){ //初始化 food.is_need=1; snack.life=0; snack.dir=4; snack.x[0]=5; snack.y[0]=5;//初始值 蛇头 map[snack.x[0]][snack.y[0]]=2; snack.x[1]=5; snack.y[1]=6;//蛇身 map[snack.x[1]][snack.y[1]]=1; snack.len=2; score=0; while(1){ while(!kbhit()){//kbhit检测键盘是否有输入 if(food.is_need==1){ while(1){ food.x=rand()%20+1; food.y=rand()%20+1; if(map[food.x][food.y]==0){ map[food.x][food.y]=3; break; } } food.is_need=0; } //蛇前进的逻辑: 蛇最后一节消失,第2节前进到第1节的位置,以此类推, 除蛇头外所有位置的坐标变为前一节的坐标 map[snack.x[snack.len-1]][snack.y[snack.len-1]] = 0; for(int i=snack.len-1;i>0;i--){ snack.x[i] = snack.x[i-1]; snack.y[i] = snack.y[i-1]; } map[snack.x[1]][snack.y[1]] = 1;//第2节为蛇身 switch(snack.dir){ case 1: snack.x[0]-=1;if(snack.x[0]==0)snack.x[0]=20;break; case 2: snack.x[0]+=1;if(snack.x[0]==21)snack.x[0]=1;break; case 3: snack.y[0]-=1;if(snack.y[0]==0)snack.y[0]=20;break; case 4: snack.y[0]+=1;if(snack.y[0]==21)snack.y[0]=1;break; } if(map[snack.x[0]][snack.y[0]]==1){//蛇头碰到蛇身GG snack.life=1; break; } map[snack.x[0]][snack.y[0]]=2;//第一节为蛇头 //map[snack.x[snack.len-1]][snack.y[snack.len-1]]=1; if(snack.x[0]==food.x&&snack.y[0]==food.y){ snack.len++;//吃到食物,蛇身+1 food.is_need=1; score+=10; if(score%100==0&&speed!=50){//加速 speed-=50; } } showMap(); Sleep(speed); } if(snack.life==1)break; key = getch(); if(key=='w'&&snack.dir!=2)snack.dir=1; else if(key=='s'&&snack.dir!=1)snack.dir=2; else if(key=='a'&&snack.dir!=4)snack.dir=3; else if(key=='d'&&snack.dir!=3)snack.dir=4; } } int main() { system("title 贪吃蛇"); system("mode con cols=51 lines=26"); system("color 00"); start(); system("cls"); Gameplay(); endGame(); return 0; }