学自{
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("操作说明:\n");
printf(" ‘w‘:向上\n ‘s‘:向下\n ‘a‘:向左\n ‘d‘:向右\n");
printf("感谢 yyfer\n");
system("pause");//停止
}
void showMap(){
gotoxy(1,1);
printf("score: %d\n",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("**********\n");
printf(" 恭喜您!\n");
printf(" 破了最高纪录\n");
printf("最高分: %d\n",max=score);
}else{
printf("游戏结束\n");
}
system("pause");
}
void start(){
while(1){
system("cls");
printf("******游戏选项******\n");
printf(" 0.退出\n");
printf(" 1.开始游戏\n");
printf(" 2.最高分\n");
printf(" 3.游戏说明\n");
switch(getch()){
case ‘0‘: exit(0);
case ‘1‘: return ;
case ‘2‘: system("cls");printf("最高分:%d\n",max);system("pause");break;
case ‘3‘: Game();break;
default:system("cls");printf("没有此选项\n");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;
}
原文:http://www.cnblogs.com/yyf573462811/p/6366078.html