C語言實現(xiàn)貪吃蛇游戲演示
更新時間:2021年10月08日 17:33:47 作者:Lucinhu
這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇游戲演示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
IDE用的是 VS2019
先看效果
代碼全覽
game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define PLATFORM 1 //運行的系統(tǒng) 1為win 0為linux
#define MAPWIDTH 15 //地圖寬度,包括墻
#define MAPHEIGHT 15 //地圖高度,包括墻
#define SNAKELENGTH (MAPHEIGHT - 2) * (MAPWIDTH - 2)
//結構體聲明
struct Body
{
int isExist;
int x;
int y;
};
struct Food {
int x;
int y;
};
void game();
void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight);
void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food);
void clearScreen();
void inputProcess(char* pinput);
void initSnake(struct Body snake[SNAKELENGTH], int length);
void generateFood(struct Food* food, struct Body snake[]);
int isWall(int x, int y);
int isSnake(int x, int y, struct Body snake[], int lengh);
void control(char input, struct Body snake[]);
void generateFood(struct Food* food, struct Body snake[]);
int isFood(int x, int y, struct Food* food);
int isEat(struct Body snake[], struct Food* pfood);
void bodyMove(struct Body snake[], int* bodyLength);
int isInBody(struct Body snake[], int lengh);
GameStart.c
#include "game.h"
void displayMenu() {
printf("########################\n");
printf("###### 貪吃蛇游戲 #######\n");
printf("########################\n");
printf("------------------------\n");
printf(" 1.開始游戲 \n");
printf(" 0.退出游戲 \n");
printf("------------------------\n");
printf("請輸入選項:>");
char ch;
scanf("%c", &ch);
getchar();
switch (ch)
{
case '1': {
game();
break;
}
case '0': {
exit(0);
break;
}
default:
printf("輸入錯誤,請重新輸入:>");
break;
}
}
int main(void) {
while (1) {
clearScreen();
displayMenu();
clearScreen();
}
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戲邏輯
void game() {
//分數(shù)
int score = 0;
//游戲狀態(tài) 0為勝利 1為咬到蛇身 2為撞到墻上
int gameState = 0;
//輸入狀態(tài)
char input = 0;
//墻
char wall[MAPHEIGHT][MAPWIDTH];
//創(chuàng)建蛇結構體數(shù)組
struct Body snake[SNAKELENGTH];
//創(chuàng)建食物結構體
struct Food food = { 5,5 };
//初始化蛇
initSnake(snake, SNAKELENGTH);
//初始化墻
initWall(wall, MAPWIDTH, MAPHEIGHT);
//生成食物
generateFood(&food, snake);
while (1)
{
//清屏
clearScreen();
control(input, snake);
//顯示地圖
displayMap(MAPWIDTH, MAPHEIGHT, snake, SNAKELENGTH, food);
printf("得分:%d\n", score);
//printf("food:%d %d\n", food.x, food.y);
//printf("snake:%d %d", snake[0].x, snake[0].y);
//處理輸入
inputProcess(&input);
//撞到蛇身,游戲失敗
if (isInBody(snake, SNAKELENGTH)) {
gameState = 1;
break;
}
//撞到墻上,游戲失敗
if (isWall(snake[0].x, snake[0].y)) {
gameState = 2;
break;
}
//吃到食物加分,蛇身加一
if (isEat(snake, &food)) {
score++;
snake[score].isExist = 1;
snake[score].x = snake[score - 1].x;
snake[score].y = snake[score - 1].y;
if (score == SNAKELENGTH - 1) {
//游戲勝利
gameState = 0;
break;
}
generateFood(&food, snake);
}
//蛇身移動
bodyMove(snake, &score);
}
//勝負顯示
switch (gameState)
{
case 1: {
printf("咬到蛇身,游戲結束!\n");
break;
}
case 2: {
printf("撞到墻上,游戲結束!\n");
break;
}
case 0: {
printf("游戲勝利!\n");
break;
}
default:
break;
}
printf("按回車鍵退出");
getchar();
}
//清除屏幕
void clearScreen() {
if (PLATFORM) {
system("cls");
}
else {
system("clear");
}
printf("\033c");
}
//輸入處理
void inputProcess(char* pinput) {
int t = (int)time(NULL);
while (1) {
if (_kbhit()) {
switch (getch())
{
case 'w': {
if (*pinput != 's') {
*pinput = 'w';
}
break;
}
case 's':
{
if (*pinput != 'w') {
*pinput = 's';
}
break;
}
case 'a': {
if (*pinput != 'd') {
*pinput = 'a';
}
break;
}
case 'd': {
if (*pinput != 'a') {
*pinput = 'd';
}
break;
}
/* case ' ': {
*pinput = ' ';
break;
}*/
default:
break;
}
}
if ((int)time(NULL) - t == 1) {
//printf("%c\n", *pinput);
//一秒一幀
break;
}
/*if (*pinput == ' ') {
continue;
}*/
}
}
//初始化墻
//'#'墻
//' '空
void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight) {
for (int i = 0; i < mapHeight; i++) {
for (int j = 0; j < mapWidth; j++) {
if (i == 0 || i == mapHeight - 1) {
wall[i][j] = '#';
}
else if (j == 0 || j == MAPWIDTH - 1) {
wall[i][j] = '#';
}
else {
wall[i][j] = ' ';
}
}
}
}
//初始化蛇狀態(tài),位置
void initSnake(struct Body snake[SNAKELENGTH], int length) {
for (int i = 0; i < length; i++) {
if (i == 0)
{
snake[i].x = MAPWIDTH / 2;
snake[i].y = MAPHEIGHT / 2;//蛇出生位置,即蛇頭初始位置
snake[i].isExist = 1;
}
else {
snake[i].isExist = 0;
snake[i].x = 0;
snake[i].y = 0;
}
}
}
//生成食物
void generateFood(struct Food* food, struct Body snake[]) {
int x;
int y;
srand((unsigned int)time(NULL));
do {
x = (rand() % MAPHEIGHT) + 1;
y = (rand() % MAPWIDTH) + 1;
} while (isSnake(x, y, snake, SNAKELENGTH) || isWall(x, y));
(*food).y = y;
(*food).x = x;
}
//判斷是否是墻
int isWall(int x, int y) {
if (y <= 1 || y >= MAPHEIGHT || x <= 1 || x >= MAPWIDTH) {
return 1;
}
return 0;
}
//判斷是否是蛇
int isSnake(int x, int y, struct Body snake[], int lengh) {
for (int i = 0; i < lengh; i++) {
if (snake[i].isExist == 1 && snake[i].x == x && snake[i].y == y) {
return 1;
}
}
return 0;
}
//判斷是否撞到蛇身
int isInBody(struct Body snake[], int lengh) {
for (int i = 1; i < lengh; i++) {
if (snake[i].isExist == 1 && snake[i].x == snake[0].x && snake[i].y == snake[0].y) {
return 1;
}
}
return 0;
}
//判斷是否是食物
int isFood(int x, int y, struct Food* food) {
if ((*food).x == x && (*food).y == y) {
return 1;
}
return 0;
}
//顯示游戲地圖
void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food) {
int x;
int y;
for (int i = 0; i < mapHeight; i++) {
y = i + 1;
for (int j = 0; j < mapWidth; j++) {
x = j + 1;
if (isWall(x, y)) {
printf("# ");
}
else if (isSnake(x, y, snake, snakelength)) {
if (snake[0].x == x && snake[0].y == y) {
printf("@ ");//蛇頭
}
else {
printf("* ");//蛇身
}
}
else if (isFood(x, y, &food)) {
printf("+ ");
}
else {
printf(" ");
}
}
printf("\n");
}
}
//方向控制
void control(char input, struct Body snake[]) {
switch (input) {
case 'w': {
snake[0].y -= 1;
break;
}
case 'a': {
snake[0].x -= 1;
break;
}
case 's': {
snake[0].y += 1;
break;
}
case 'd': {
snake[0].x += 1;
break;
}
}
}
//判斷是否吃到食物
int isEat(struct Body snake[], struct Food* pfood) {
if (isFood(snake[0].x, snake[0].y, pfood)) {
return 1;
}
return 0;
}
//移動蛇身
void bodyMove(struct Body snake[], int* bodyLength) {
if (*bodyLength) {
for (int i = *bodyLength; i >= 1; i--) {
snake[i].x = snake[i - 1].x;
snake[i].y = snake[i - 1].y;
}
}
}
相關思路有空再寫。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Clion-MinGW編譯后的exe文件添加ico圖標的操作方法
這篇文章主要介紹了Clion-MinGW編譯后的exe文件添加ico圖標的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
深入C語言內(nèi)存區(qū)域分配(進程的各個段)詳解
一般情況下,一個可執(zhí)行二進制程序(更確切的說,在Linux操作系統(tǒng)下為一個進程單元,在UC/OSII中被稱為任務)在存儲(沒有調(diào)入到內(nèi)存運行)時擁有3個部分,分別是代碼段(text)、數(shù)據(jù)段(data)和BSS段。這3個部分一起組成了該可執(zhí)行程序的文件2013-07-07
字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較
以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進行了比較,需要的朋友可以過來參考下2013-07-07
c語言?數(shù)據(jù)存儲與原碼?反碼?補碼詳細解析
不知道你是否和我一樣好奇,學習編程語言的同時想,各個數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲存的呢,如果你仔細深入了解的話,你會了解其中的樂趣,了解科學家們的偉大,了解c語言2022-02-02
C++ opencv圖像處理實現(xiàn)圖片幾何變換示例
這篇文章主要為大家介紹了C++ opencv圖像處理實現(xiàn)圖片幾何變換示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

