基于C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.目標(biāo)要求:
1.上下左右控制蛇頭轉(zhuǎn)向
2.若蛇頭碰到食物,長(zhǎng)度加一
3.若蛇頭碰到邊框、碰到自身或蛇回頭,游戲結(jié)束
2.C語(yǔ)言代碼:
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #define interface_x 19//畫(huà)布行數(shù) #define interface_y 60//畫(huà)布列數(shù)? /* ? ? ??? ?《貪吃蛇》?? ?by:你最珍貴 ?? ? ---------------------------------------? ?? ?|控制信號(hào): | 向上 | 向下 | 向左 | 向右 | ?? ? ---------------------------------------? ?? ?| ? ?鍵盤: | ?'i' | ?'k' | ?'j' | ?'l' |? ?? ? ---------------------------------------? ?? ?? ?? ? 1.上下左右控制蛇頭轉(zhuǎn)向 ? ?? ? 2.若蛇頭碰到食物,長(zhǎng)度加一? ?? ? 3.若蛇頭碰到邊框或自身,游戲結(jié)束? */ void HideCursor(){?? ?//隱藏光標(biāo)位置 ,這個(gè)函數(shù)復(fù)制代碼就行? ?? ?CONSOLE_CURSOR_INFO cursor_info={1,0};? ?? ?SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } void gotoxy(int x,int y){?? ?//把光標(biāo)放在(0,0)位置 ,這個(gè)函數(shù)復(fù)制代碼就行 ?? ?HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); ?? ?COORD pos; ?? ?pos.X = x; ?? ?pos.Y = y; ?? ?SetConsoleCursorPosition(handle,pos); }? int IsEnd;//是否結(jié)束? int canvas[interface_x+1][interface_y+1]={0};//畫(huà)布行數(shù)、列數(shù)? int scores;//分?jǐn)?shù)? int slow_v,slow_v_num;//移動(dòng)變慢的值(越大速度越慢),移動(dòng)變慢的變量 int food_x,food_y;//實(shí)物位置? int snakeH_x,snakeH_y;//蛇頭位置? int snake_direction; //蛇的方向? void startup(){?? ?//【數(shù)據(jù)初始化】? ?? ?int i,j;? ?? ?HideCursor();//不顯示光標(biāo)? ?? ?IsEnd = 0;? ?? ?scores=0;?? ? ?? ?slow_v=2; ?? ?slow_v_num=1;? ?? ?for(i=1;i<=interface_x;i++){//設(shè)置邊框? ?? ??? ?canvas[i][1]=-1; ?? ??? ?canvas[i][interface_y]=-1; ?? ?}? ?? ?for(i=1;i<=interface_y;i++){//設(shè)置邊框? ?? ??? ?canvas[1][i]=-1; ?? ??? ?canvas[interface_x][i]=-1; ?? ?} ?? ?food_x=rand()%(interface_x-2)+2;//設(shè)置食物位置? ?? ?food_y=rand()%(interface_y-2)+2; ?? ?canvas[food_x][food_y]=-2;//設(shè)置食物? ?? ?snakeH_x=(interface_x/2);//設(shè)置蛇頭位置? ?? ?snakeH_y=3; ?? ?canvas[snakeH_x][snakeH_y]=1;//設(shè)置蛇頭? ?? ?snake_direction=4; } void show_begin(){//【初始頁(yè)面展示】? ?? ?int i,j; ?? ?int start=0; ?? ?char input; ??? ?while(!start){ ??? ??? ?gotoxy(0,0);//每次輸出頁(yè)面把鼠標(biāo)放回(0,0)? ??? ??? ?for(i=1;i<=24/2-4;i++) printf("\n");? ?? ??? ?for(i=1;i<80/2-5;i++) printf(" "); ?? ??? ?printf("《貪吃蛇》\n\n");? ?? ??? ?for(i=1;i<80/2-9;i++) printf(" "); ?? ??? ?printf("請(qǐng)按任意鍵開(kāi)始游戲\n\n"); ?? ??? ?for(i=1;i<=24/2-6;i++) printf("\n"); ?? ??? ?if(kbhit()){ ?? ??? ??? ?input = getch(); ?? ??? ??? ?if(input) start=1; ?? ??? ?} ?? ?} }? void show(){?? ?//【顯示畫(huà)面】? ?? ?gotoxy(0,0);//每次輸出頁(yè)面把鼠標(biāo)放回(0,0)? ?? ?int i,j,k;?? ? ?? ?for(i=1;i<=(80-interface_y)/2+interface_y/2-10;i++) printf(" "); ?? ?printf("《貪吃蛇》") ; ?? ?for(i=1;i<=interface_y/2-8-8;i++) printf(" "); ?? ?printf("分?jǐn)?shù):%3d\n",scores); ?? ?for(i=1;i<=interface_x;i++){ ?? ??? ?for(k=1;k<=(80-interface_y)/2;k++) printf(" ");//使屏幕對(duì)稱加的空格? ?? ??? ?for(j=1;j<=interface_y;j++){?? ??? ??? ? ?? ??? ??? ?if(canvas[i][j]==-1){//值為-1輸出邊框#? ?? ??? ??? ??? ?printf("#"); ?? ??? ??? ?}else if(canvas[i][j]==-2){//值為-2輸出實(shí)物M? ?? ??? ??? ??? ?printf("M"); ?? ??? ??? ?}else if(canvas[i][j]==1){//值為1輸出蛇頭@? ?? ??? ??? ??? ?printf("@"); ?? ??? ??? ?}else if(canvas[i][j]>1){//值>1輸出蛇尾*? ?? ??? ??? ??? ?printf("*"); ?? ??? ??? ?}else printf(" ");//值為0輸出空白? ?? ??? ?} ?? ??? ?printf("\n"); ?? ?} ?? ? } void move_snake(){ ?? ?int i,j; ?? ?int max=0;//最大值? ?? ?int max_x,max_y;//最大值位置 ?? ?for(i=2;i<=interface_x-1;i++){ ?? ??? ?for(j=2;j<=interface_y-1;j++){ ?? ??? ??? ?if(canvas[i][j]>max){//尋找最大值? ?? ??? ??? ??? ?max=canvas[i][j]; ?? ??? ??? ??? ?max_x=i;max_y=j; ?? ??? ??? ?} ?? ??? ??? ?if(canvas[i][j]>0){//把蛇頭蛇尾每一個(gè)值加1? ?? ??? ??? ??? ?canvas[i][j]++; ?? ??? ??? ?}?? ??? ??? ?? ?? ??? ?} ?? ?} ?? ?if(snake_direction==1){//上? ?? ??? ?snakeH_x--;? ?? ?}else if(snake_direction==2){//下? ?? ??? ?snakeH_x++;? ?? ?}else if(snake_direction==3){//左? ?? ??? ?snakeH_y--;? ?? ?}else if(snake_direction==4){//右? ?? ??? ?snakeH_y++;? ?? ?}?? ?? ?? ?if(canvas[snakeH_x][snakeH_y]==-1||canvas[snakeH_x][snakeH_y]>1){ ?? ??? ?exit(1);//碰到邊界或自身,游戲結(jié)束? ?? ?}else if(canvas[snakeH_x][snakeH_y]==-2){//吃到食物? ?? ??? ?canvas[snakeH_x][snakeH_y]=1;//添加新蛇頭? ?? ??? ?food_x=rand()%(interface_x-2)+2;//設(shè)置新食物位置? ?? ??? ?food_y=rand()%(interface_y-2)+2; ?? ??? ?canvas[food_x][food_y]=-2; ?? ??? ?printf("\a") ; ?? ??? ?scores++; ?? ?}else{//什么都沒(méi)有碰到則移動(dòng)? ?? ??? ?canvas[snakeH_x][snakeH_y]=1;//添加新蛇頭? ?? ??? ?canvas[max_x][max_y]=0;//去掉蛇尾? ?? ?}? } void update_outinput(){?? ?//【與輸入無(wú)關(guān)的更新】? ?? ?int i; ?? ?slow_v_num=(slow_v_num==slow_v)? 1:slow_v_num+1; ?? ?if(slow_v_num==slow_v){//每隔slow_v次運(yùn)行一次?? ??? ? ?? ??? ?move_snake();? ?? ?}? ?? ? } void update_input(){//【與輸入有關(guān)的更新】? ?? ?char input; ?? ?if(kbhit()){ ?? ??? ?input = getch(); ?? ??? ?if(input=='i'){//上? ?? ??? ??? ?if(snake_direction==1){//如果輸入與原來(lái)方向一致是加速功能,否則為轉(zhuǎn)向? ?? ??? ??? ??? ?move_snake();//加速? ?? ??? ??? ?}else snake_direction=1;//轉(zhuǎn)向? ?? ??? ?}else if(input=='k'){//下? ?? ??? ??? ?if(snake_direction==2){ ?? ??? ??? ??? ?move_snake(); ?? ??? ??? ?}else snake_direction=2; ?? ??? ?}else if(input=='j'){//左? ?? ??? ??? ?if(snake_direction==3){ ?? ??? ??? ??? ?move_snake(); ?? ??? ??? ?}else snake_direction=3; ?? ??? ?}else if(input=='l'){//右? ?? ??? ??? ?if(snake_direction==4){ ?? ??? ??? ??? ?move_snake(); ?? ??? ??? ?}snake_direction=4; ?? ??? ?}?? ? ?? ?} } void show_end(){//【顯示失敗界面】? ?? ?system("cls");? ?? ?int i; ?? ?for(i=1;i<24/2-2;i++) putchar('\n'); ?? ?for(i=1;i<80/2-5;i++) putchar(' '); ?? ?printf("game over!\n\n"); ?? ?for(i=1;i<80/2-7;i++) putchar(' '); ?? ?printf("您的分?jǐn)?shù)是:%3d分\n",scores); ?? ?for(i=1;i<24/2-3;i++) putchar('\n');?? ? ?? ?system("pause");//暫停? ?? ?system("pause");//暫停 } int main(){ ?? ?startup();?? ?//數(shù)據(jù)初始化 ?? ?show_begin();//初始頁(yè)面? ?? ?while(!IsEnd){?? ?//游戲循環(huán)執(zhí)行? ?? ??? ?show();?? ?// 顯示畫(huà)面? ?? ??? ?update_outinput();?? ?//與輸入無(wú)關(guān)的更新? ?? ??? ?update_input();?? ?//與輸入有關(guān)的更新? ?? ?} ?? ?show_end(); //顯示失敗界面? ?? ?return 0; }
3.運(yùn)行結(jié)果:
小游戲玩法:
《貪吃蛇》by:你最珍貴
---------------------------------------
|控制信號(hào): | 向上 | 向下 | 向左 | 向右 |
---------------------------------------
| 鍵盤: | 'i' | 'k' | 'j' | 'l' |
---------------------------------------
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++如何將二叉搜索樹(shù)轉(zhuǎn)換成雙向循環(huán)鏈表(雙指針或數(shù)組)
這篇文章主要介紹了C++如何將二叉搜索樹(shù)轉(zhuǎn)換成雙向循環(huán)鏈表(雙指針或數(shù)組),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12c語(yǔ)言:基于函數(shù)指針的兩個(gè)示例分析
本篇文章是對(duì)c語(yǔ)言中函數(shù)指針的兩個(gè)示例做了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)
通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07