貪吃蛇/C語言實現(課程設計)

貪吃蛇

課程設計:
我在原版的貪吃蛇加入了一點點創新。加入了用戶系統、背景音樂、和界面(開始和結束界面),有分數,提示性文字等。
玩家系統:

#include <stdio.h>
#include <string.h>
#include <windows.h>

//定義變量
char reg_name[30]="",reg_pwd[10]="";
char on_name[30],on_pwd[10];

//用戶註冊系統
void regist()
{
	//清屏
	system("pause");
	system("cls");

	printf("\n\n\t\t\t歡迎使用註冊系統\n\n");
	while(1)
	{
		//輸入用戶名
		printf("\t\t請輸入用戶名[不能大於10個字符]:");
		scanf("%s",reg_name);

		//判斷用戶名
		if(strlen(reg_name)<=10)
		{
			while(1)
			{
				//輸入密碼
				printf("\n\t\t請輸入密碼[密碼長度爲八位]:");
				scanf("%s",reg_pwd);

				//判斷密碼
				if(strlen(reg_pwd)==8)
				{
					printf("\n\n\t\t註冊成功,您的用戶名是%s,密碼是%s\n\n",reg_name,reg_pwd);
					break;
				}
				else
				{
					printf("\n\t\t密碼的長度爲%d,請重新輸入\n",strlen(reg_pwd));
				}
			}
			break;
		}
		else
		{
			printf("\n\t\t用戶名的長度爲%d,請重新輸入\n\n",strlen(reg_name));
		}
	}
}

//判斷是否註冊
int judge()
{
	if(strcmp(reg_name,"")==0&&strcmp(reg_pwd,"")==0)
	{
		printf("\n\n\t\t您尚未註冊,請先註冊!\n\n");
		return 0;
	}
	else
	{
		return 1;
	}
}

//用戶登錄
void dl()
{
	int i;
	system("pause");
	system("cls");

	printf("\n\n\t\t\t歡迎登錄系統\n\n");
	//三次登錄驗證
	for(i=1;i<=3;i++)
	{
		printf("\t\t請輸入用戶名:");
		scanf("%s",on_name);
		printf("\n\t\t請輸入密  碼:");
		scanf("%s",on_pwd);
		if(strcmp(reg_name,on_name)==0&&strcmp(reg_pwd,on_pwd)==0)
		{
			printf("\n\n\t\t登錄成功,祝您遊戲愉快\n\n");
			break;
		}
		else
		{
			printf("\n\n\t\t登錄失敗,請重新登錄,您還有%d次機會\n\n",3-i);
		}

	}

}
void main()//註冊登陸系統
{
	//定義變量
	int id;
	while(1)
	{
		system("pause");
		system("cls");
		//輸出界面
		printf("\n\n\t\t\t用戶管理系統\n\n");

		printf("\t\t\t1:註冊\n");
		printf("\t\t\t2:登錄\n");
		printf("\t\t\t0:退出\n\n");

		//輸入功能編號
		printf("\t\t請選擇功能編號:");
		scanf("%d",&id);

		//判斷
		switch(id)
		{
			case 1:regist();break;
			case 2:
				if(judge()==1)
				{
					dl();
				}
				break;
			case 0:exit(1);break;
			default:
				printf("\n\t\t您輸入的功能編號有誤,請重新輸入!\n");
		}

	}
}

音樂需要自己設置,需要下載音樂,把下好的音樂放在bin文件夾下的Debug文件夾下。新建一個文件夾,然後才能使用。而且音樂的格式要是wav格式,不能爲mp3格式,下載後看看文件格式。如果不是wav就轉換一下。

完整遊戲代碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<windows.h>    //光標設計API
#include<time.h>       //食物隨機
#include<conio.h>      //按鍵監控

//音樂
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")

//用戶系統
//定義變量
char reg_name[30]="",reg_pwd[10]="";
char on_name[30],on_pwd[10];


//宏定義屬性
//窗口屬性
#define SNAKESIZE 100   //蛇的最大節數
#define MAPHEIGHT 40    //地圖高度
#define MAPWIDTH  70    //地圖寬度


void gotoxy(int x,int y);//1.輔助函數:光標移動
void drawMap();//2.畫地圖
void keyDown();//3.按鍵操作
void creatFood();//4.食物的產生
int  snakeStatus();//5.蛇的狀態:判斷是否結束遊戲
void welcometogame();//6.開始界面
void gamecircle();//7.控制遊戲
void endgame();//8.遊戲結束界面
//9.背景音樂
void bgm1();//音樂1
void bgm2();//音樂2
void bgm3();//音樂3
void regist();//10.用戶註冊系統
void dl();//11.用戶登錄
void HideCursor();//12.隱藏光標


//1.輔助函數:光標移動
void gotoxy(int x,int y)
{
    //光標結構體
    COORD coord;
    //設置座標
    coord.X=x;
    coord.Y=y;
    //同步到控制檯/設置控制檯光標位置
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
//食物結構體
struct
{
    int x;
    int y;
} food;
//蛇結構體
struct
{
    int speed;          //蛇的速度
    int len;            //蛇的長度
    //記錄每一節蛇的座標
    //一條蛇有多少節
    int x[SNAKESIZE];
    int y[SNAKESIZE];
} snake;

//全局變量
int i;
int key=72;         //初始化移動方向,表示蛇移動的方向,72爲按下“↑”所代表的數字
int changeFlag=0;   //蛇變化標記,判斷蛇是否吃掉了食物
int score=0;        //記錄玩家的得分
//2.畫地圖
void drawMap()
{
    //左右邊框
    for(i=1; i<=MAPHEIGHT; i++)
    {
        gotoxy(0,i);
        printf("■");
        gotoxy(MAPWIDTH,i);
        printf("■");
    }
    //上下邊框
    for(i=0; i<=MAPWIDTH; i+=2)
    {
        gotoxy(i,0);
        printf("■");
        gotoxy(i,MAPHEIGHT);
        printf("■");
    }


    //食物刷新,畫食物
    while(1)

    {
        srand((unsigned int)time(NULL));
        food.x=rand()%(MAPWIDTH-4)+2;
        food.y=rand()%(MAPHEIGHT-2)+1;
        if(food.x%2==0) break;
    }

    //產生新的食物
    gotoxy(food.x,food.y);      //食物的光標
    printf("●");
    snake.len=3;                //蛇初始長度
    snake.speed=200;            //蛇初始速度
    snake.x[0]=MAPWIDTH/2+1;
    snake.y[0]=MAPHEIGHT/2;
    gotoxy(snake.x[0],snake.y[0]);
    printf("■");
    for(i=1; i<snake.len; i++)
    {
        snake.x[i]=snake.x[i-1]+2;
        snake.y[i]=snake.y[i-1];
        gotoxy(snake.x[i],snake.y[i]);
        printf("■");
    }
    gotoxy(MAPWIDTH-2,0);
    return ;
}
//3.按鍵操作
void keyDown()
{
    //無按鍵操作,緩衝
    int pre_key=key;
    if(_kbhit())
    {
        //有按鍵接收
        fflush(stdin);
        key=_getch();
        key=_getch();
    }
    //擦除
    if(changeFlag==0)
    {
        gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
        printf("  ");
    }

    //後面蛇身的結束
    for(i=snake.len-1; i>0; i--)
    {
        snake.x[i]=snake.x[i-1];
        snake.y[i]=snake.y[i-1];
    }


    /*
	*控制檯按鍵所代表的數字
	*“↑”:72
	*“↓”:80
	*“←”:75
	*“→”:77
	*/



    //移動方向處理
    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:
        snake.x[0]-=2 ;
        break;
    case 77:
        snake.x[0]+=2;
        break;
    case 72:
        snake.y[0]--;
        break;
    case 80:
        snake.y[0]++;
        break;
    }
    gotoxy(snake.x[0],snake.y[0]);
    printf("■");
    gotoxy(MAPWIDTH-2,0);       //移動不能一直看着光標
    changeFlag=0;
    return ;

}
//4.食物的產生
void creatFood()
{
    //蛇把食物吃了
    if(snake.x[0]==food.x && snake.y[0]==food.y)
    {
        //產生的食物不能在蛇身上
        while(1)
        {
            int flag=1;
            srand((unsigned int)time(NULL));
            food.x=rand()%(MAPWIDTH-4)+2;
            food.y=rand()%(MAPHEIGHT-2)+1;
            //產生的食物不能在蛇身上
            for(i=0; i<snake.len; i++)
            {
                if(snake.x[i]==food.x && snake.y[i]==food.y)
                {
                    flag=0;
                    break;
                }
            }
            if(flag && food.x%2==0)
                break;
        }
        //產生新的食物
        gotoxy(food.x,food.y);
        printf("●");

        snake.len++;
        score += 10;      //每個食物得10分

        changeFlag=1;   //很重要,因爲吃到了食物,就不用再擦除蛇尾的那一節,以此來造成蛇身體增長的效果
    }
    return ;
}
//5.蛇的狀態:判斷是否結束遊戲
int  snakeStatus()
{
    if(snake.y[0]==0 || snake.y[0]==MAPHEIGHT)
        return 0;
    if(snake.x[0]==0 || snake.x[0]==MAPWIDTH)
        return 0;

    //蛇頭不能撞自己
    for(i=1; i<snake.len; i++)
    {
        if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
            return 0;
    }
    return 1;
}
//6.開始界面
void welcometogame()
{

    gotoxy(45,12);
    printf("歡迎來到貪吃蛇遊戲\n");
    gotoxy(45,25);
    system("pause");
    system("cls");
    gotoxy(30,12);
    printf("請用↑ ↓ ← → 分別控制蛇的移動\n");
    gotoxy(30,13);
    system("pause");
    system("cls");
}
//7.控制遊戲
void gamecircle()//控制遊戲
{

    gotoxy(90,7);
    printf("蛇吃得越長,遊戲結束後的得分越高。");
    gotoxy(90,20);
    printf("遊戲小提示:");
    gotoxy(90,22);
    printf("1.蛇不能穿牆,也不能咬到自己哦。");
    gotoxy(90,23);
    printf("2.如果撞牆或者咬到自己遊戲會失敗哦。");
    gotoxy(90,24);
    printf("3.請用↑ ↓ ← → 分別控制蛇的移動。");
    /*gotoxy(64,18)
    printf("F1 爲加速,F2 爲減速\n");*/
    gotoxy(90,25);
    printf("4.鼠標點擊暫停遊戲。");
}
//8.遊戲結束界面
void endgame()//遊戲結束
{

    system("cls");
    system("color 8E");
    gotoxy(4,2);
    printf("玩家需要多加練習才能得到更高的分數啊,加油哦!!!\n");
    gotoxy(18,7);
    printf("遊戲結束。");
    gotoxy(17,8);
    printf("Game Over!!!");
    gotoxy(14,10);
    printf("本次遊戲的得分爲: %d",score);

    exit(0);
}

//9.BGM
//9.1
void bgm1()
{
    //播放音樂
    PlaySound(TEXT("sounds\\bgm.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
}
//9.2
void bgm2()
{
    //播放音樂
    PlaySound(TEXT("sounds\\b我是小綠.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
}

//9.3
void bgm3()
{
    //播放音樂
    PlaySound(TEXT("sounds\\a賽車.wav"),NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
}

//10.用戶註冊系統
void regist()
{
	//清屏
	system("pause");
	system("cls");

	printf("\n\n\t\t\t歡迎使用註冊系統\n\n");
	while(1)
	{
		//輸入用戶名
		printf("\t\t請輸入用戶名[不能大於10個字符]:");
		scanf("%s",reg_name);

		//判斷用戶名
		if(strlen(reg_name)<=10)
		{
			while(1)
			{
				//輸入密碼
				printf("\n\t\t請輸入密碼[密碼長度爲八位]:");
				scanf("%s",reg_pwd);

				//判斷密碼
				if(strlen(reg_pwd)==8)
				{
					printf("\n\n\t\t註冊成功,您的用戶名是%s,密碼是%s\n\n",reg_name,reg_pwd);
					break;
				}
				else
				{
					printf("\n\t\t密碼的長度爲%d,請重新輸入\n",strlen(reg_pwd));
				}
			}
			break;
		}
		else
		{
			printf("\n\t\t用戶名的長度爲%d,請重新輸入\n\n",strlen(reg_name));
		}
	}
}

//判斷是否註冊
int judge()
{
	if(strcmp(reg_name,"")==0&&strcmp(reg_pwd,"")==0)
	{
		printf("\n\n\t\t您尚未註冊,請先註冊!\n\n");
		return 0;
	}
	else
	{
		return 1;
	}
}

//11.用戶登錄
void dl()
{
	int i;
	system("pause");
	system("cls");

	printf("\n\n\t\t\t歡迎登錄系統\n\n");
	//三次登錄驗證
	for(i=1;i<=3;i++)
	{
		printf("\t\t請輸入用戶名:");
		scanf("%s",on_name);
		printf("\n\t\t請輸入密  碼:");
		scanf("%s",on_pwd);
		if(strcmp(reg_name,on_name)==0&&strcmp(reg_pwd,on_pwd)==0)
		{
			printf("\n\n\t\t登錄成功,祝您遊戲愉快\n\n");
			break;
		}
		else
		{
			printf("\n\n\t\t登錄失敗,請重新登錄,您還有%d次機會\n\n",3-i);
		}

	}

}

//12隱藏光標
void HideCursor()  //隱藏光標,防止干擾視線
{
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
}



int main()
{

    SetConsoleTitle("貪吃蛇小遊戲");  //編譯控制欄信息

    HideCursor();//隱藏光標

    //用戶系統
    system("color 70");
    bgm2();
    //定義變量
	int id;
	while(1)
	{
	    HideCursor();//隱藏光標
		system("pause");
		system("cls");
		//輸出界面
		printf("\n\n\t\t\t用戶管理系統\n\n");

		printf("\t\t\t1:註冊賬號\n");
		printf("\t\t\t2:登錄賬號\n");
		printf("\t\t\t0:退出遊戲\n\n");

		//輸入功能編號
		printf("\t\t請選擇功能編號:");
		scanf("%d",&id);

		//判斷
		switch(id)
		{
			case 1:regist();break;
			case 2:
				if(judge()==1)
				{
					dl();
					goto skip;
				}
				break;
			case 0:exit(1);break;
			default:
				printf("\n\t\t您輸入的功能編號有誤,請重新輸入!\n");
		}

	}




    //貪吃蛇遊戲
    skip:;
    system("pause");
    system("cls");

    system("color 70");
    bgm3();
    welcometogame();
    gamecircle();

    drawMap();
    while(1)
    {
        HideCursor();//隱藏光標
        keyDown();
        if(!snakeStatus()) break;
        creatFood();
        Sleep(snake.speed);
    }
    endgame();
    Sleep(5000);
    return 0;
}

我備註寫的挺詳細的,每個函數的用途,定義的參數的意義什麼的。所以就不多加贅述了。

課程設計主要是爲了練習自己的能力,自己的思考能力和對C語言的掌握,代碼能力。同時平時要養成寫註釋的好習慣,以防到時候出錯的時候不知道自己寫的都是什麼意思。儘量自己寫一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章