柚子快報激活碼778899分享:開發(fā)語言 簡單的C語言貪吃蛇
柚子快報激活碼778899分享:開發(fā)語言 簡單的C語言貪吃蛇
一、源代碼
snake.h
#ifndef __SNAKE_H__
#define __SNAKE_H__
#include
#include
#include
#include
#include
#include
#include
#define WIDE 60 // 寬度
#define HIGH 20 // 高度
// 一個身體的對象
struct BODY {
int X;
int Y;
};
// 定義蛇對象
struct SNAKE {
struct BODY body[WIDE*HIGH];
int size;
}snake; // 一個蛇對象
// 定義食物對象
struct FOOD {
int X;
int Y;
}food; // 一個食物對象
int score = 0; // 分數(shù)
int kx = 0; // 用戶按下 asdw 任意一個按鍵所得到的 坐標值。
int ky = 0;
int lastX = 0; // 蛇尾的坐標。
int lastY = 0;
int sleepSecond = 400;
// 聲明函數(shù)
void initSnake(void);
void initFood(void);
void initUI(void);
void playGame(void);
void initWall(void);
void showScore(void);
#endif
main.c
#define _CRT_SECURE_NO_WARNINGS
#include "snake.h" // 引入自定義頭文件
int main(void)
{
// 去除光標。
CONSOLE_CURSOR_INFO cci; /*CONSOLE_CURSOR_INFO 是一個結(jié)
構(gòu)體類型,它定義在 wincon.h 頭
文件中,用來描述控制臺窗口光標的
信息。
dwSize:表示光標的大小,取值范圍為 1 到 100。
bVisible:表示光標是否可見,如果為 TRUE,則光標可見;
如果為 FALSE,則光標不可見。
*/
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE; // TRUE :
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); 設(shè)置控制臺窗口光標大小和可見性
srand(time(NULL)); // 播種隨機數(shù)種子。
initSnake(); // 初始化蛇
initFood(); // 初始化食物
initWall(); // 畫墻
initUI(); // 畫蛇和食物
playGame(); // 啟動游戲
showScore(); // 打印分數(shù)
system("pause");
return EXIT_SUCCESS;
}
void showScore(void)
{
// 將光標默認位置移動至 不干擾游戲的任意位置。
COORD coord;
coord.X = 0;
coord.Y = HIGH + 2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf("Game Over!!!\n");
printf("成績?yōu)椋?d\n\n\n", score);
}
/*
這段代碼使用嵌套的循環(huán),分別遍歷每一行和每一列,
根據(jù)位置情況輸出相應(yīng)的字符。如果到了最后一列,輸出一條豎線 |;
如果到了最后一行,輸出一條橫線 _;其他情況下,輸出一個空格。
最后,每輸出一行,就換一次行。
*/
void initWall(void)
{
for (size_t i = 0; i <= HIGH; i++) // 多行
{
for (size_t j = 0; j <= WIDE; j++) // 一行中的多列
{
if (j == WIDE) // 如果到了最后一列,輸出一條豎線
{
printf("|");
}
else if (i == HIGH) // 如果到了最后一行,輸出一條橫線
{
printf("_");
}
else // 其他情況下,輸出一個空格
{
printf(" ");
}
}
printf("\n"); // 每輸出一行,換行一次
}
}
void playGame(void)
{
char key = 'd'; // 定義一個字符變量 key,表示用戶的按鍵輸入,默認是向右移動。
while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH) // 判斷蛇是否撞墻
{
initUI(); // 更新蛇的位置,打印出貪吃蛇和食物
if (_kbhit()) // 檢測用戶是否有按鍵輸入
{
key = _getch(); // 獲取用戶按下的按鍵
}
switch (key)
{
case 'w': kx = 0; ky = -1; break; // 如果用戶按下 'w',向上移動
case 's': kx = 0; ky = +1; break; // 如果用戶按下 's',向下移動
case 'd': kx = +1; ky = 0; break; // 如果用戶按下 'd',向右移動
case 'a': kx = -1; ky = 0; break; // 如果用戶按下 'a',向左移動
default: break; // 如果用戶按下其他鍵,不進行移動
}
// 碰撞
// 判斷蛇頭是否撞到身體
for (size_t i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X
&& snake.body[0].Y == snake.body[i].Y)
{
return; // 如果蛇頭撞到身體,游戲結(jié)束
}
}
// 判斷蛇頭是否撞到食物
if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
{
initFood(); // 食物被吃掉了,重新生成一個食物
snake.size++; // 蛇的長度增加
score += 10; // 得分增加
sleepSecond -= 100; // 加速游戲
}
// 記錄蛇尾的位置
lastX = snake.body[snake.size - 1].X;
lastY = snake.body[snake.size - 1].Y;
// 更新蛇的位置
for (size_t i = snake.size - 1; i > 0; i--)
{
snake.body[i].X = snake.body[i - 1].X; // 后一節(jié)身體部位的 X 坐標等于前一節(jié)身體部位的 X 坐標
snake.body[i].Y = snake.body[i - 1].Y; // 后一節(jié)身體部位的 Y 坐標等于前一節(jié)身體部位的 Y 坐標
}
snake.body[0].X += kx; // 蛇頭的 X 坐標根據(jù)用戶按鍵修改
snake.body[0].Y += ky; // 蛇頭的 Y 坐標根據(jù)用戶按鍵修改
Sleep(sleepSecond); // 控制游戲速度,讓游戲不會太快。
}
return;
}
// 定義初始化蛇函數(shù)
void initSnake(void)
{
snake.size = 2;
snake.body[0].X = WIDE / 2; //蛇頭初始化
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDE / 2 - 1; // 蛇一節(jié)身體初始化
snake.body[1].Y = HIGH / 2;
return;
}
// 初始化界面控件
void initUI(void)
{
COORD coord = { 0 }; // 定義一個 COORD 類型的結(jié)構(gòu)體變量,用來表示光標移動的位置。
// 畫蛇
for (size_t i = 0; i < snake.size; i++) // 遍歷貪吃蛇的每個身體部位
{
coord.X = snake.body[i].X; // 獲取當前身體部位的 X 坐標
coord.Y = snake.body[i].Y; // 獲取當前身體部位的 Y 坐標
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 將光標移動到當前身體部位所在的位置
if (i == 0) // 如果當前身體部位是蛇頭
putchar('@'); // 打印出蛇頭
else
putchar('*'); // 否則打印出蛇身
}
// 去除蛇尾
coord.X = lastX; // 獲取蛇尾的 X 坐標
coord.Y = lastY; // 獲取蛇尾的 Y 坐標
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 將光標移動到蛇尾所在的位置
putchar(' '); // 打印一個空格,相當于去除了蛇尾
// 畫食物
coord.X = food.X; // 獲取食物的 X 坐標
coord.Y = food.Y; // 獲取食物的 Y 坐標
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // 將光標移動到食物所在的位置
putchar('#'); // 打印出食物
}
// 食物的初始化函數(shù)
void initFood(void)
{
food.X = rand() % WIDE; // 0-59
food.Y = rand() % HIGH; // 0-59
return;
}
?
二、運行結(jié)果截圖
?
柚子快報激活碼778899分享:開發(fā)語言 簡單的C語言貪吃蛇
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。