今天把C语言浅学完了!!!也顺便完成这个项目案例!
代码实现:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#define WIDE 60
#define HIGH 20
void InitWall();
struct BODY{
int x;
int y;
};
struct Snake{
int size;
struct BODY body[WIDE*HIGH];
}snake;
int food[2]={0};
int dx=0;//偏移坐标
int dy=0;
//蛇末尾坐标
int lx=0;
int ly=0;
int score=0;
void InitFood(){
food[0]=rand()%WIDE;
food[1]=rand()%HIGH;
}
void InitSnake(){
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;
}
void showUI(){
COORD coord;
coord.X=lx;
coord.Y=ly;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
putchar(' ');
for(int 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=food[0];
coord.Y=food[1];
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
putchar('#');
}
void playGame(){
char key='D';
while(snake.body[0].x>=0&&snake.body[0].x<WIDE&&snake.body[0].y>=0&&snake.body[0].y<HIGH){
showUI();
while(_kbhit()){
key=_getch();
}
switch(key){
case 'D': case 'd':dx=1;dy=0;break;
case 'A': case 'a':dx=-1;dy=0;break;
case 'W': case 'w':dx=0;dy=-1;break;
case 'S': case 's':dx=0;dy=1;break;
}
//是否与身体碰撞
for(int i=1;i<snake.size;i++){
if(snake.body[0].x==snake.body[i].x&&snake.body[0].y==snake.body[i].y){
COORD coord;
coord.X=WIDE/2*3;
coord.Y=HIGH;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
printf("分数:%d\n",score);
return;
}
}
if(snake.body[0].x==food[0]&&snake.body[0].y==food[1]){
InitFood();
snake.size++;
score+=10;
}
lx=snake.body[snake.size-1].x;
ly=snake.body[snake.size-1].y;
//更新蛇身
for(int 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;
if(score<=50){
Sleep(300);
}else if(score<=100){
Sleep(200);
}else if(score<=150){
Sleep(100);
}else{
Sleep(50);
}
// system("cls");
}
COORD coord;
coord.X=WIDE/2*3;
coord.Y=HIGH;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
printf("分数:%d\n",score);
}
void InitWall(){
for(int i=0;i<=HIGH;i++){
for(int j=0;j<=WIDE;j++){
if(i==HIGH){
putchar('=');
}else if(j==WIDE){
putchar('=');
}else putchar(' ');
}
putchar('\n');
}
}
int main(){
srand((size_t)time(NULL));
//去除光标
CONSOLE_CURSOR_INFO cci;
cci.dwSize=sizeof(cci);
cci.bVisible=FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
InitWall();
InitFood();
InitSnake();
playGame();
return 0;
}