C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(命令行)
這是一個(gè)純C語(yǔ)言寫(xiě)的貪吃蛇游戲,供大家參考,具體內(nèi)容如下
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
#define SNAKE_LENGTH 100//定義蛇的最大長(zhǎng)度
#define SCREEN_WIDETH 80
#define SCREEN_HEIGHT 30
//定義每一節(jié)蛇的坐標(biāo)
struct coor{
int x;
int y;
};
//枚舉方向
enum CH {
right = VK_RIGHT,
left = VK_LEFT,
up = VK_UP,
down = VK_DOWN
};
//定義蛇的屬性
struct snake{
int len;//當(dāng)前蛇的長(zhǎng)度
struct coor coord[SNAKE_LENGTH];//每一節(jié)蛇的坐標(biāo)
enum CH CH;//定義蛇的方向
int SPEED;
int flag;//定義蛇的狀態(tài) 1表示存活 0表示死亡
}snake;
//光標(biāo)移動(dòng)函數(shù)
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
//初始化游戲界面
void init_sence()
{
//初始化上下墻
for (int i = 0; i < SCREEN_WIDETH; i += 2)
{
gotoxy(i,0);
printf("■");
gotoxy(i, SCREEN_HEIGHT);
printf("■");
}
//初始化左右墻
for (int i = 0; i <=SCREEN_HEIGHT; i++)
{
gotoxy(0, i);
printf("■");
gotoxy(SCREEN_WIDETH,i);
printf("■");
}
//打印提示信息
gotoxy(SCREEN_WIDETH + 5, 2);
printf("\t\t貪吃蛇");
gotoxy(SCREEN_WIDETH + 5, 6);
printf("2018//12//1");
gotoxy(SCREEN_WIDETH + 5, 8);
printf("作者:小豆芽");
gotoxy(SCREEN_WIDETH + 5, 10);
printf("F1:加速\tF2:減速");
gotoxy(SCREEN_WIDETH + 5, 12);
printf("CTRL:繼續(xù)\t空格:暫停");
gotoxy(SCREEN_WIDETH + 5, 14);
printf("ESC:退出游戲");
gotoxy(SCREEN_WIDETH + 5, 28);
printf("建議:QQ:2862841130:::");
}
struct foodcoord {
int x;
int y;
int flag;//定義食物的狀態(tài)
}food;
//**這是c程序**
#include"snake.h"
//蛇的移動(dòng)
void move_snake();
//畫(huà)出蛇
void draw_snake();
//產(chǎn)生食物
void creatfood();
//判斷蛇是否吃到食物
void eatfood();
//判斷蛇是否死掉
void SnakeState();
int main()
{
//設(shè)置窗口大小
system("mode con cols=110 lines=31");
//設(shè)置標(biāo)題
SetConsoleTitleA("貪吃蛇");
//初始化蛇
begin:
snake.CH = VK_RIGHT;//初始化方向
snake.len = 5; //初始化長(zhǎng)度
snake.SPEED = 300;//初始化蛇的移動(dòng)速度
snake.coord[1].x = SCREEN_WIDETH / 2;//初始化蛇頭的坐標(biāo)
snake.coord[1].y = SCREEN_HEIGHT / 2;
snake.coord[2].x = SCREEN_WIDETH / 2-2;//初始化蛇頭的坐標(biāo)
snake.coord[2].y = SCREEN_HEIGHT / 2;
snake.coord[3].x = SCREEN_WIDETH / 2-4;//初始化蛇頭的坐標(biāo)
snake.coord[3].y = SCREEN_HEIGHT / 2;
//初始化食物狀態(tài)
food.flag = 1;//1表示吃到食物 0表示沒(méi)有吃到食物
//初始化食物狀態(tài)
snake.flag = 1;//1活 0死
init_sence();//初始化游戲界面
while (1)
{
draw_snake();//畫(huà)蛇
Sleep(snake.SPEED);//蛇的移動(dòng)速度
move_snake();//移動(dòng)蛇
if(food.flag)
creatfood();//產(chǎn)生食物
eatfood();//判斷是否吃到食物
SnakeState();//判斷蛇是否死亡
if (!snake.flag)break;
}
system("cls");
gotoxy(SCREEN_WIDETH/2, SCREEN_HEIGHT/2-4);
printf(" GAME OVER!!!");
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+2);
printf("你的得分是:\t\t\t%d ",snake.len-1);
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+4);
printf("我不服再來(lái):\t\t\tCTRL ");
gotoxy(SCREEN_WIDETH / 2-6, SCREEN_HEIGHT / 2+6);
printf("算了垃圾游戲毀我青春:\t\tESC");
while (1)
{
if (GetAsyncKeyState(VK_CONTROL))
{
system("cls");
goto begin;
}
else if (GetAsyncKeyState(VK_ESCAPE))
return 0;
}
}
//蛇的移動(dòng)
void move_snake()
{
//判斷是否有按鍵操作
if (GetAsyncKeyState(up))
{
if(snake.CH!=down)snake.CH = up;
}
else if (GetAsyncKeyState(down))
{
if (snake.CH != up)snake.CH = down;
}
else if (GetAsyncKeyState(right))
{
if (snake.CH != left)snake.CH = right;
}
else if (GetAsyncKeyState(left))
{
if (snake.CH != right)snake.CH = left;
}
else if (GetAsyncKeyState(VK_F1))
{
if(snake.SPEED>=100)snake.SPEED -= 50;
}
else if (GetAsyncKeyState(VK_F2))
{
if (snake.SPEED <= 3000)snake.SPEED += 100;
}
//根據(jù)檢測(cè)到的方向改變蛇頭的位置
switch (snake.CH)
{
case right:snake.coord[1].x += 2; break;
case left:snake.coord[1].x -= 2; break;
case up:snake.coord[1].y -= 1; break;
case down:snake.coord[1].y += 1; break;
}
}
//畫(huà)出蛇
void draw_snake()
{
//畫(huà)出蛇頭
gotoxy(snake.coord[1].x, snake.coord[1].y);
printf("□");
//畫(huà)出蛇身,直接一個(gè)for循環(huán)實(shí)現(xiàn)
for (int i = 2; i <= snake.len; i++)
{
gotoxy(snake.coord[i].x, snake.coord[i].y);
printf("□");
}
//擦掉尾巴
gotoxy(snake.coord[snake.len].x, snake.coord[snake.len].y);
printf(" ");
//遍歷每一節(jié)蛇
for (int i = snake.len; i >1; i--)
{
snake.coord[i].x = snake.coord[i - 1].x;
snake.coord[i].y = snake.coord[i - 1].y;
}
gotoxy(0, 0);
printf("■");
gotoxy(85, 25);
printf("得分:%d ", snake.len-1);
}
//產(chǎn)生食物
void creatfood()
{
//隨機(jī)種子生成
srand((unsigned)time(NULL));
if(food.flag)
while (1)
{
food.x = rand() % 80;
food.y = rand() % 30;
if (food.x % 2 == 0 && food.x >= 2 && food.x <= 78 && food.y > 1 && food.y < 30)
{
int flag = 0;
//判斷產(chǎn)生的食物可不可能在蛇的身體上
for (int i = 1; i <= snake.len; i++)
{
if (snake.coord[i].x == food.x&&snake.coord[i].y == food.y)
{
flag = 1;
break;
}
}
if (flag)continue;
//繪制食物
else
{
gotoxy(food.x, food.y);
printf("⊙");
food.flag = 0;
break;
}
}
}
food.flag = 0;
}
//判斷蛇是否吃到食物
void eatfood()
{
//只需要判斷蛇頭是否與食物重合
if (food.x == snake.coord[1].x&&food.y == snake.coord[1].y)
{
snake.len+=1;
food.flag = 1;
}
}
//判斷蛇是否死掉
void SnakeState()
{
if (snake.coord[1].x < 2 || snake.coord[1].x>78 || snake.coord[1].y < 1 || snake.coord[1].y>29)
snake.flag = 0;
for (int i = 2; i <= snake.len; i++)
{
if (snake.coord[1].x == snake.coord[i].x&&snake.coord[1].y == snake.coord[i].y)
snake.flag = 0;
}
}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲
- C語(yǔ)言開(kāi)發(fā)實(shí)現(xiàn)貪吃蛇游戲
- C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì)
- C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲(單人版)
- C語(yǔ)言實(shí)現(xiàn)鏈表貪吃蛇
- C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲
- C語(yǔ)言手把手教你實(shí)現(xiàn)貪吃蛇AI(下)
- C語(yǔ)言手把手教你實(shí)現(xiàn)貪吃蛇AI(中)
- 基于C語(yǔ)言實(shí)現(xiàn)的貪吃蛇游戲完整實(shí)例代碼
- C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲代碼
相關(guān)文章
C和MFC巧妙獲取外網(wǎng)IP的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了C和MFC巧妙獲取外網(wǎng)IP的兩種實(shí)現(xiàn)方法,功能非常的實(shí)用,需要的朋友可以參考下2014-07-07
c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算
這篇文章主要介紹了c++將引用或者是指針作為函數(shù)參數(shù)實(shí)現(xiàn)實(shí)參的運(yùn)算,需要的朋友可以參考下2014-05-05
C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過(guò)程
C語(yǔ)言是在國(guó)內(nèi)外廣泛使用的一種計(jì)算機(jī)語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)的思路與詳細(xì)過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串
這篇文章主要介紹了C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串,實(shí)例分析了C語(yǔ)言操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
C語(yǔ)言詳細(xì)講解if語(yǔ)句與switch語(yǔ)句的用法
用 if 語(yǔ)句可以構(gòu)成分支結(jié)構(gòu),它根據(jù)給的條件進(jìn)行判定,以決定執(zhí)行哪個(gè)分支程序段,C 語(yǔ)言中還有另外一種分支語(yǔ)句,就是 switch 語(yǔ)句2022-05-05
C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-12-12

