欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用純C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲

 更新時(shí)間:2021年07月27日 09:13:31   作者:迪迪迪迪迪迪  
這篇文章主要為大家詳細(xì)介紹了用純C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下

在讀大學(xué)生一枚,五一期間用四天時(shí)間寫一個(gè)小游戲。

本貪吃蛇游戲代碼共計(jì)531行,開發(fā)環(huán)境是VS,游戲分為兩種模式,標(biāo)準(zhǔn)模式和超大地圖模式,詳細(xì)看以下源代碼,并進(jìn)入游戲體驗(yàn)具體內(nèi)容。

//貪吃蛇
 
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
//游戲窗口
#define FrameX 5
#define FrameY 5
#define Frame_width 20
#define Frame_height 20
#define FrameX2 3
#define FrameY2 3
#define Frame_width2 55
#define Frame_height2 47
//全局變量
int i, j, p, q, m;int a[2];
//蛇的結(jié)構(gòu)體
struct Snack{ 
int x[200];
//蛇的X坐標(biāo); 
int y[200];
//蛇的Y坐標(biāo); 
int count;
//蛇吃食物的數(shù)量; 
int length;
//蛇身體的長(zhǎng)度; 
int speed;
//蛇移動(dòng)的速度;
};
 
//食物的結(jié)構(gòu)
struct Food{ 
 int x;
//食物的X坐標(biāo);
    int y;
//食物的Y坐標(biāo);
};
 
//光標(biāo)的位置
void gotoxy(HANDLE hOut, int x, int y){ COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOut, pos);}
 
//游戲菜單
void menu(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
void over_game();
void start_game();
void start_game2(); 
int n; 
gotoxy(hOut, 50, 14);
printf(" 超貪吃的蛇"); 
gotoxy(hOut, 50, 16); 
printf("正常游戲模式【1】");
gotoxy(hOut, 50, 17);
printf("超大地圖模式【2】");
gotoxy(hOut, 50, 18);
printf(" 結(jié)束游戲【3】");
scanf_s("%d", &n); 
switch(n) 
{ 
case 1: 
 system("cls"); 
 start_game(); 
 over_game(); 
 break; 
case 2: 
 system("cls"); 
 start_game2(); 
 over_game();
 break; 
case 3: 
 system("cls"); 
 over_game();
 break; 
default: 
 printf("你的輸入有誤,請(qǐng)重新輸入!"); 
 menu(); 
 break;
}}
//制作游戲窗口2
void make_frame2()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 //定義顯示器句柄變量 
 gotoxy(hOut, 24, 13);
 //定義障礙物
 printf("#");
 gotoxy(hOut, 14, 23);
 printf("#");
 gotoxy(hOut, 35, 20);
 //定義障礙物 
 printf("#");
 gotoxy(hOut, 40, 35);
 printf("#");
 gotoxy(hOut, 70, 6);
 //定義障礙物 
 printf("#");
 gotoxy(hOut, 80, 16);
 printf("#");
 gotoxy(hOut, 60, 45);
 //定義障礙物
 printf("#");
 gotoxy(hOut, 28, 8);
 printf("#");
for (i = 0; i < 2*Frame_width2+1;i++) 
{ gotoxy(hOut, FrameX2 + i, FrameY2);
//上邊框
printf("-"); gotoxy(hOut, FrameX2 + i, Frame_height2+FrameY2);
//下邊框 
printf("-"); } 
for (i = 0; i < Frame_height2-1; i++) 
{ gotoxy(hOut, FrameX2, FrameY2 + i+1);
//左邊框 
printf("|"); 
gotoxy(hOut, FrameX2+2*Frame_width2, FrameY2 + i+1);
//右邊框
printf("|"); }}
//制作游戲窗口
void make_frame()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
 //定義顯示器句柄變量
 gotoxy(hOut, 24, 13); 
 //定義障礙物
 printf("#"); 
 gotoxy(hOut, 14, 23); 
 printf("#"); 
 for (i = 0; i < 2 * Frame_width + 1; i++)
 { gotoxy(hOut, FrameX + i, FrameY);
 //上邊框 
 printf("-");
 gotoxy(hOut, FrameX + i, Frame_height + FrameY);
 //下邊框
 printf("-"); } 
 for (i = 0; i < Frame_height - 1; i++)
 { gotoxy(hOut, FrameX, FrameY + i + 1);
 //左邊框
 printf("|");
 gotoxy(hOut, FrameX + 2 * Frame_width, FrameY + i + 1);
 //右邊框 
 printf("|"); }}
 
//初始化蛇
void intt_snack(struct Snack* snack)
{ 
 snack->x[0] = FrameX + 5;
 //蛇的橫坐標(biāo);
 snack->y[0] = FrameY + 6;
 //蛇的縱坐標(biāo); 
 snack->speed = 200;
 //蛇的速度
 snack->length = 3;
 //蛇的長(zhǎng)度; 
 snack->count = 0; 
 for (i = 1; i < snack->length; i++) 
    { 
 snack->x[i] = snack->x[i - 1]+2; 
    snack->y[i] = snack->y[i - 1];
    }
}
 
//初始化蛇2
void intt_snack2(struct Snack* snack)
{ snack->x[0] = FrameX2 + 5;
//蛇的橫坐標(biāo); 
snack->y[0] = FrameY2 + 6;
//蛇的縱坐標(biāo);
snack->speed = 200;
//蛇的速度; 
snack->length = 3;
//蛇的長(zhǎng)度; 
snack->count = 0;
for (i = 1; i < snack->length; i++) 
{ snack->x[i] = snack->x[i - 1] + 2;
snack->y[i] = snack->y[i - 1]; }}
 
//移動(dòng)蛇
void move_snack(HANDLE hOut,struct Snack* snack)
{ gotoxy(hOut, snack->x[0], snack->y[0]); printf(" "); 
//清除蛇尾;
for (i = 1; i < snack->length; i++) 
{ 
  snack->x[i - 1] = snack->x[i];
  snack->y[i - 1] = snack->y[i]; 
}}
 
//打印蛇
void print_snack(HANDLE hOut, struct Snack* snack)
{ 
 for (i = 0; i < snack->length; i++) 
{ 
  gotoxy(hOut, snack->x[i], snack->y[i]); 
if (i == 0) 
{ 
 printf("*");
} 
else if 
(i < snack->length - 1) 
{
 printf("0"); 
} 
else 
{ 
 printf("@"); 
} 
 }
}
 
//打印食物
void print_food(HANDLE hOut, struct Snack*snack,struct Food* food){ srand((unsigned)time(0));
while (1) 
{ 
food->x = rand() % 2*Frame_width+1; food->y = rand() % Frame_height;
if (food->x == 0 || food->y == 0) { continue; }
food->x = food->x+FrameX;
food->y = food->y + FrameY;
for (i = 0; i < snack->length; i++) 
{ 
 if (food->x == snack->x[i] && food->y == snack->y[i]) 
{ 
  break;
 } 
} 
if (i == snack->length) 
{ 
 gotoxy(hOut, food->x, food->y);
printf("$"); 
break;
} 
}
}
 
//打印食物2
void print_food2(HANDLE hOut, struct Snack* snack, struct Food* food)
{ srand((unsigned)time(0));
while (1) 
{ 
 food->x = (rand() % (3*Frame_width2 + 1))+FrameX2;
food->y = (rand() % Frame_height2)+FrameY2; 
if (food->x == 0 || food->y == 0) 
{ 
 continue; 
} 
for (i = 0; i < snack->length; i++)
{ 
 if (food->x == snack->x[i] && food->y == snack->y[i])
{
  break; 
 } 
} 
if (i == snack->length)
{ 
 gotoxy(hOut, food->x, food->y); printf("$");
break; 
}
}
}
 
//吃食物
void eat_food(HANDLE hOut, struct Snack *snack, struct Food *food)
{ if (snack->x[snack->length-1] == food->x && snack->y[snack->length-1] == food->y)
{ snack->length++; 
for (i = snack->length; i >= 1; i--) 
{ snack->x[i] = snack->x[i - 1]; 
snack->y[i] =snack->y[i - 1]; } snack->x[0] = a[0]; 
snack->y[0] = a[1]; print_food(hOut,snack,food); 
snack->count++; if (snack->count % 5 == 0) snack->speed -= 20; }}
 
//穿墻
void through_wall(HANDLE hOut, struct Snack* snack, char ch)
{ if (ch == 72 && snack->y[snack->length - 1] == FrameY) 
{ snack->y[snack->length - 1] =Frame_height+4; 
//如果蛇在上框且向上移動(dòng),穿墻 
} if (ch == 80 && snack->y[snack->length - 1] == FrameY + Frame_height)
{ snack->y[snack->length - 1] = FrameY+1; 
//如果蛇在下框且向下移動(dòng),穿墻
} if (ch == 75 && snack->x[snack->length - 1] == FrameX-1) 
{ snack->x[snack->length - 1] =2*Frame_width + FrameX-1;
//如果蛇在左框且向左移動(dòng),穿墻 
} if (ch == 77 && snack->x[snack->length - 1] == 2*Frame_width+FrameX+1)
{ snack->x[snack->length - 1] = FrameX+1; 
//如果蛇在右框且向右移動(dòng),穿墻
}}
 
//穿墻2
void through_wall2(HANDLE hOut, struct Snack* snack, char ch)
{ if (ch == 72 && snack->y[snack->length - 1] == FrameY2) 
{ snack->y[snack->length - 1] = Frame_height2 + 4;
//如果蛇在上框且向上移動(dòng),穿墻 
} if (ch == 80 && snack->y[snack->length - 1] == FrameY2 + Frame_height2)
{ snack->y[snack->length - 1] = FrameY2 + 1; 
//如果蛇在下框且向下移動(dòng),穿墻 
} if (ch == 75 && snack->x[snack->length - 1] == FrameX2 - 1) 
{ snack->x[snack->length - 1] = 2 * Frame_width2 + FrameX2 - 1; 
//如果蛇在左框且向左移動(dòng),穿墻 
} if (ch == 77 && snack->x[snack->length - 1] == 2 * Frame_width2 + FrameX2 + 1) 
{ snack->x[snack->length - 1] = FrameX2 + 1;
//如果蛇在右框且向右移動(dòng),穿墻 
}}
 
//判斷蛇是否死亡
int snack_die(struct Snack *snack){ 
 for (i = 0; i < snack->length - 1; i++) 
 { if (snack->x[snack->length - 1] == snack->x[i] && snack->y[snack->length - 1] == snack->y[i]) 
  return 0; 
 if (snack->x[snack->length - 1] == 24 && snack->y[snack->length - 1] == 13) 
  return 0;
 if (snack->x[snack->length - 1] == 14 && snack->y[snack->length - 1] == 23)
  return 0; } 
 return 1;}
 
//判斷蛇是否死亡2
int snack_die2(struct Snack* snack)
{ for (i = 0; i < snack->length - 1; i++) 
{ if (snack->x[snack->length - 1] == snack->x[i] && snack->y[snack->length - 1] == snack->y[i]) 
return 0;
if (snack->x[snack->length - 1] == 24 && snack->y[snack->length - 1] == 13) 
return 0;
if (snack->x[snack->length - 1] == 14 && snack->y[snack->length - 1] == 23) 
return 0; 
if (snack->x[snack->length - 1] == 35 && snack->y[snack->length - 1] == 20) 
return 0;
if (snack->x[snack->length - 1] == 40 && snack->y[snack->length - 1] == 35) 
return 0;
if (snack->x[snack->length - 1] == 70 && snack->y[snack->length - 1] == 6) 
return 0; 
if (snack->x[snack->length - 1] == 80 && snack->y[snack->length - 1] == 16) 
return 0; 
if (snack->x[snack->length - 1] == 60 && snack->y[snack->length - 1] == 45) 
return 0;
if (snack->x[snack->length - 1] == 28 && snack->y[snack->length - 1] == 8) 
return 0; } 
return 1;}
 
//開始游戲
void start_game(){ unsigned char ch = 77;
//定義用于接收鍵盤輸入的字符變量
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
//定義顯示器句柄變量 
struct Snack s, * snack = &s;
struct Food f, * food = &f; make_frame(); intt_snack(snack);
print_food(hOut,snack, food);
while (1) 
{ a[0] = snack->x[0]; 
//記住蛇尾的橫坐標(biāo)
a[1] = snack->y[0];
//記住蛇尾的豎坐標(biāo)
 j = 0; 
if (_kbhit()) 
{
 /* 判斷是否按下鍵盤,如果按下,ch接收鍵盤輸入 */ 
ch = _getch(); 
if (_kbhit()) 
{
/* 如果長(zhǎng)按鍵盤,則加速 */
 Sleep(20); 
j = 1; } }
 switch (ch) 
 { 
 case 72:
 {
  /* 向上移動(dòng) */
  move_snack(hOut, snack); 
  //移動(dòng)蛇
  snack->y[snack->length - 1] -= 1; 
  //蛇頭的豎坐標(biāo)向上移,即減1
 break;
 }
 case 80: 
 {
  /* 向下移動(dòng) */
  move_snack(hOut, snack); 
  //移動(dòng)蛇 
  snack->y[snack->length - 1] += 1; 
  //蛇頭的豎坐標(biāo)向下移,即加1
 break; 
 } 
 case 75: {
  /* 向左移動(dòng) */ 
  move_snack(hOut, snack); 
  //移動(dòng)蛇 
  snack->x[snack->length - 1] -= 2;
  //蛇頭的橫坐標(biāo)向左移,即減2 
 break;
 } 
 case 77: 
 {
  /* 向右移動(dòng) */
  move_snack(hOut, snack); 
  //移動(dòng)蛇 
  snack->x[snack->length - 1] += 2;
  //蛇頭的橫坐標(biāo)向右移,即加2 
  break; } } 
 through_wall(hOut, snack, ch); 
 eat_food(hOut, snack, food); 
 //吃食物 
 print_snack(hOut, snack); 
 //打印蛇
 if (snack_die(snack) == 0) 
 {
  /* 游戲結(jié)束條件:1.蛇碰到自身 2.按Esc鍵 3.速度為50ms */
  gotoxy(hOut, 15, 15); 
  printf("Game Over"); Sleep(1000); 
  break; 
 }
 if(j == 0) 
 { 
  Sleep(snack->speed); 
 //延遲時(shí)間 
 } 
 else 
 {
  Sleep(10);
 } 
}
}
 
void start_game2(){ unsigned char ch = 77; 
//定義用于接收鍵盤輸入的字符變量 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//定義顯示器句柄變量 
struct Snack s, * snack = &s; struct Food f, * food = &f; 
make_frame2();
intt_snack2(snack);
print_food(hOut, snack, food);
while (1) { a[0] = snack->x[0]; 
//記住蛇尾的橫坐標(biāo) 
a[1] = snack->y[0];
//記住蛇尾的豎坐標(biāo) 
j = 0; if (_kbhit()) 
{
 /* 判斷是否按下鍵盤,如果按下,ch接收鍵盤輸入 */ 
 ch = _getch(); 
 if (_kbhit()) {
 /* 如果長(zhǎng)按鍵盤,則加速 */
 Sleep(20); j = 1; } } 
switch (ch) { 
case 72: {
 /* 向上移動(dòng) */
 move_snack(hOut, snack);
 //移動(dòng)蛇
 snack->y[snack->length - 1] -= 1; 
 //蛇頭的豎坐標(biāo)向上移,即減1
break;
} case 80: {
 /* 向下移動(dòng) */
 move_snack(hOut, snack);
 //移動(dòng)蛇 
 snack->y[snack->length - 1] += 1; 
 //蛇頭的豎坐標(biāo)向下移,即加1 
break; } case 75: {
 /* 向左移動(dòng) */ 
 move_snack(hOut, snack);
 //移動(dòng)蛇
 snack->x[snack->length - 1] -= 2; 
 //蛇頭的橫坐標(biāo)向左移,即減2
break; } case 77: {
 /* 向右移動(dòng) */ 
 move_snack(hOut, snack);
 //移動(dòng)蛇 
 snack->x[snack->length - 1] += 2;
 //蛇頭的橫坐標(biāo)向右移,即加2 
 break; } } 
through_wall2(hOut, snack, ch); 
eat_food(hOut, snack, food); 
//吃食物 
print_snack(hOut, snack); 
//打印蛇 
if (snack_die2(snack) == 0) 
{
 /* 游戲結(jié)束條件:1.蛇碰到自身 2.按Esc鍵 3.速度為50ms */ 
 gotoxy(hOut, 30, 18); 
 printf("Game Over"); 
 Sleep(1000);
 break; } 
if (j == 0) { Sleep(snack->speed); 
//延遲時(shí)間 
}
else { Sleep(10); } }}
void choose()
{ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
void start_game();
 void start_game2();
 void over_game();
 int n; 
gotoxy(hOut, 10, 20); 
printf("Continue [1]");
gotoxy(hOut, 30, 20);
 printf("Continue [2]");
gotoxy(hOut, 50, 20);
 printf("Exit [3]");
 gotoxy(hOut, 70, 20); 
printf("選擇:"); 
scanf_s("%d", &n); 
switch (n) 
{ case 1: system("cls"); 
start_game(); 
over_game();
break; 
case 2: 
system("cls"); 
start_game2(); 
over_game(); 
break; 
case 3:
exit(0); 
break;
default:
 printf("※※您的輸入有誤,請(qǐng)重新輸入※※");
 system("pause >nul"); over_game(); 
 choose(); break; }}
 
/******結(jié)束菜單*******************************************************************/
void over_game()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 system("cls");
 printf("\n\n\n\n\n\n\n\n\t\t\t\t游戲結(jié)束\n\n\n");
 choose();
 system("pause");
}
void main(){
 menu(); 
 start_game(); 
 //開始游戲 
 start_game2();
 //開始游戲 
 over_game();
 //結(jié)束游戲
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++設(shè)計(jì)模式之建造者模式(Builder)

    C++設(shè)計(jì)模式之建造者模式(Builder)

    這篇文章主要介紹了C++設(shè)計(jì)模式之建造者模式Builder的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++ 前置聲明詳解及實(shí)例

    C++ 前置聲明詳解及實(shí)例

    這篇文章主要介紹了C++ 前置聲明詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++雙向循環(huán)列表用法實(shí)例

    C++雙向循環(huán)列表用法實(shí)例

    這篇文章主要介紹了C++雙向循環(huán)列表,實(shí)例分析了C++雙向循環(huán)列表的創(chuàng)建、輸出、添加、刪除、移動(dòng)的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié)

    C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié)

    今天小編就為大家分享一篇關(guān)于C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的示例代碼

    C語(yǔ)言實(shí)現(xiàn)靜態(tài)版通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的靜態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-08-08
  • C++?STL容器適配器使用指南

    C++?STL容器適配器使用指南

    C++?STL(標(biāo)準(zhǔn)模板庫(kù))是一套功能強(qiáng)大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實(shí)現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊(duì)列、棧,今天我們來(lái)探究一下stl容器適配器的使用吧
    2021-11-11
  • C++如何切割String對(duì)象的方法

    C++如何切割String對(duì)象的方法

    C++相較于Java,Python 并沒有提供的字符串分割的函數(shù)split,因此需要自己進(jìn)行編寫,本文主要介紹了C++如何切割String對(duì)象的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 深入探討C語(yǔ)言中局部變量與全局變量在內(nèi)存中的存放位置

    深入探討C語(yǔ)言中局部變量與全局變量在內(nèi)存中的存放位置

    本篇文章是對(duì)在C語(yǔ)言中局部變量與全局變量在內(nèi)存中的存放位置進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 利用C++編寫一個(gè)Json解析器

    利用C++編寫一個(gè)Json解析器

    這篇文章主要為大家詳細(xì)介紹了如何利用C++編寫一個(gè)簡(jiǎn)單又好用的Json解析器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • C語(yǔ)言實(shí)現(xiàn)掃雷OvO(完整代碼)

    C語(yǔ)言實(shí)現(xiàn)掃雷OvO(完整代碼)

    相信大家都玩過掃雷游戲,因?yàn)樗?jīng)典了,今天我們用C語(yǔ)言來(lái)模擬實(shí)現(xiàn)掃雷游戲,結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2022-04-04

最新評(píng)論