最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)貪吃蛇小黑窗

 更新時間:2022年01月04日 14:45:22   作者:元靈石胎  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)貪吃蛇小黑窗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

思路:

1.利用整型二維數(shù)組保存顯示數(shù)據(jù),小蛇每移動一次清屏并便利數(shù)組做到動態(tài)效果。每次移動(清屏)的間隔時間控制了游戲難度,這個時間應(yīng)不斷縮減,直到游戲結(jié)束。

2.需要保存小蛇移動的方向,然后寫一個函數(shù)通過小蛇的移動方向去處理二維數(shù)組中的數(shù)據(jù),達(dá)到移動小蛇的目的。

3.小蛇的移動可分解為兩個過程:頭部像前方生長一格然后尾部消去一格。如果蛇頭吃到食物,尾部無需消去,此時應(yīng)立即隨機(jī)生成一個新的食物。

4.游戲開始時小蛇應(yīng)隨機(jī)生成在地圖某一位置,此時小蛇的默認(rèn)移動方向也應(yīng)該是隨機(jī)的。

5每次移動前應(yīng)接收玩家由鍵盤輸入的移動方向,如果接收到后,判斷合法后將其設(shè)為小蛇的默認(rèn)移動方向,如果玩家未進(jìn)行任何輸入,小蛇應(yīng)按照默認(rèn)方向移動。

個人難點(diǎn):

1.小蛇移動

該函數(shù)需要拿到蛇頭當(dāng)時所在的位置坐標(biāo)和小蛇的移動方向。隨后可由蛇頭位置往移動方向往前生長一格,即將二維數(shù)組中目標(biāo)移動位置的數(shù)據(jù)設(shè)置為小蛇的數(shù)據(jù)。消去蛇尾另寫一個函數(shù),調(diào)用前需先判斷是否吃到食物,是否撞到墻壁或者是自身,然后決定是否削去尾部。消去蛇尾需獲得蛇尾的位置,所以我們在該函數(shù)內(nèi)加入遞歸搜索蛇尾的算法:進(jìn)入函數(shù)后先判斷此時的位置是否為蛇尾,若不是就將自身位置往后移動一格(將蛇身往后一格的坐標(biāo)輸入給DeleteTail函數(shù),然后繼續(xù)此過程),直到遇到蛇尾,然后將其消去(置零)。

具體代碼實(shí)現(xiàn)如下:

int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t)
{
?? ?int ret = 1;//默認(rèn)前進(jìn)成功
?? ?//printf("trend=%d\n", trend);
?? ?switch (trend) {
?? ?case 1:*py -= 1; break;//向上
?? ?case 2:*px -= 1; break;//向左
?? ?case 3:*py += 1; break;//向下
?? ?case 4:*px += 1; break;//向右
?? ?}//找到即將前進(jìn)的坐標(biāo)
?? ?if (data[*py][*px] == 6) {
?? ??? ?data[*py][*px] = trend;
?? ??? ?CreatFood(data);
?? ??? ?*t *= 0.9;
?? ?}//如果蛇頭要前進(jìn)的格子是食物,向前長一格,尾部不變;
?? ?else if (data[*py][*px] == 0) {
?? ??? ?data[*py][*px] = trend;//向前長一格
?? ??? ?DeleteTail(*px, *py, data);//消去最后的尾巴
?? ?}
?? ?else {
?? ??? ?ret = 0;
?? ??? ?printf("前進(jìn)失敗\n");
?? ?}//前進(jìn)失敗
?? ?return ret;
}
?
int DeleteTail(int x, int y, int data[ROW][COL])
{
?? ?//PrintTest(data);
?? ?if (data[y][x] <= 4 && data[y][x] >= 1) {
?? ??? ?switch (data[y][x]) {
?? ??? ?case 1:
?? ??? ??? ?if (DeleteTail(x, y + 1, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?if (DeleteTail(x + 1, y, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?if (DeleteTail(x, y - 1, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?if (DeleteTail(x - 1, y, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?return 1;
?? ?}
?? ?else {
?? ??? ?return 0;
?? ?}
}

2.輸入

在實(shí)際代碼實(shí)現(xiàn)的過程中,我發(fā)現(xiàn)scanf函數(shù)無法實(shí)現(xiàn)需求,理由是程序執(zhí)行到scanf語句時,會停留在該位置,直到scanf函數(shù)掃描到輸入后,程序才會繼續(xù)進(jìn)行。經(jīng)學(xué)習(xí)查閱,決定使用kbhit函數(shù)掃描此時鍵盤緩沖區(qū)中是否有數(shù)據(jù):如果有就讀取第一個數(shù)據(jù),并將后面的數(shù)據(jù)清空,避免后面使用該數(shù)據(jù),若沒有數(shù)據(jù),緩沖區(qū)不做任何處理,程序也應(yīng)當(dāng)繼續(xù)執(zhí)行。

使用kbhit函數(shù)前應(yīng)“#include<conio.h>”。清理緩沖區(qū)運(yùn)用的是getch()循環(huán)。代碼如下:

int Input() {
?? ?int trend = 0;
?? ?if (kbhit()) {
?? ??? ?char trend_ = getch();
?? ??? ?while (kbhit()) {
?? ??? ??? ?getch();
?? ??? ?}//清空緩沖區(qū)
?? ??? ?//printf("已接收到%c ", trend_);
?? ??? ?switch (trend_) {
?? ??? ?case 'w':trend = 1; break;
?? ??? ?case 'a':trend = 2; break;
?? ??? ?case 's':trend = 3; break;
?? ??? ?case 'd':trend = 4; break;
?? ??? ?default:printf("請輸入w,a,s,d以控制前進(jìn)方向!!\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?else {
?? ??? ?printf("請輸入w,a,s,d以控制前進(jìn)方向!!\n");
?? ?}
?? ?return trend;
}

完整源代碼:

#pragma once
#pragma warning(disable : 4996)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>

#define ROW 30
#define COL 30
#define TIME 300

int Game();
int Menu();
int Input();
int CreatHead(int* px, int* py, int data[ROW][COL]);
void CreatFood(int data[ROW][COL]);
int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t);
int DeleteTail(int x, int y, int data[ROW][COL]);
void PrintShow(int data[ROW][COL]);
int GameOver(int score);
void PrintTest(int data[ROW][COL]);
#include"main.h"
int main()
{
?? ?int ret = 1;
?? ?while (ret) {
?? ??? ?int choose = Menu();
?? ??? ?int score = 0;
?? ??? ?switch (choose) {
?? ??? ?case 1:
?? ??? ??? ?score = Game();
?? ??? ??? ?ret = GameOver(score);
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?system("cls");
?? ??? ??? ?printf("==========================================================\n");
?? ??? ??? ?printf(" ? ? ? ? ? ? ? ? ? ? ?游戲說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ?\n");
?? ??? ??? ?printf(" ?1.輸入‘w'‘a(chǎn)'‘s'‘d'以控制小蛇的移動。\n");
?? ??? ??? ?printf(" ?2.小蛇在固定時間內(nèi)只移動一次,如一個時間段內(nèi)輸入多個方向\n則以第一次輸入為準(zhǔn)。\n");
?? ??? ??? ?printf(" ?3.不能撞到墻壁或者是自身。\n");
?? ??? ??? ?printf(" ?4.小蛇移動速度會在吃到食物后加快,直到游戲結(jié)束。\n");
?? ??? ??? ?printf(" ?輸入“1”繼續(xù)...........\n");
?? ??? ??? ?printf("==========================================================\n");
?? ??? ??? ?int ok = 0;
?? ??? ??? ?scanf("%d", &ok);
?? ??? ??? ?if (ok) {
?? ??? ??? ??? ?system("cls");
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?case 3:
?? ??? ??? ?ret = 0;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}
#include"main.h"

int Game()
{
?? ?int data[ROW][COL] = { 0 };
?? ?int time_ = TIME;
?? ?for (int i = 0; i < COL; i++) {
?? ??? ?for (int j = 0; j < ROW; j++) {
?? ??? ??? ?if (i == 0 || i == COL - 1) {
?? ??? ??? ??? ?data[i][j] = 5;//邊界墻
?? ??? ??? ?}
?? ??? ??? ?if (j == 0 || j == ROW - 1) {
?? ??? ??? ??? ?data[i][j] = 5;//邊界墻
?? ??? ??? ?}
?? ??? ?}

?? ?}//初始化數(shù)據(jù)存儲數(shù)組
?? ?//PrintShow(data);
?? ?int x = 0, y = 0;
?? ?int trend = CreatHead(&x, &y, data);
?? ?//生成蛇頭
?? ?CreatFood(data);//生成食物
?? ?int ret = 1;
?? ?while (ret) {
?? ??? ?system("cls");
?? ??? ?PrintShow(data);
?? ??? ?Sleep(time_);
?? ??? ?int trend_ = Input();
?? ??? ?if (trend_ != 0) {
?? ??? ??? ?trend = trend_;
?? ??? ?}
?? ??? ?ret = MoveSnake(trend, &x, &y, data, &time_);
?? ?}
?? ?int score = 0;
?? ?for (int i = 0; i < ROW; i++) {
?? ??? ?for (int j = 0; j < COL; j++) {
?? ??? ??? ?if (data[i][j] <= 4 && data[i][j] >= 1) {
?? ??? ??? ??? ?score++;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return score;
}

int Menu()
{
?? ?int choose = 0;
?? ?while (1) {
?? ??? ?printf("==========================\n");
?? ??? ?printf("===歡迎進(jìn)入貪吃蛇游戲!===\n");
?? ??? ?printf("=== ? 1、經(jīng)典模式 ? ? ?===\n");
?? ??? ?printf("=== ? 2、游戲說明 ? ? ?===\n");
?? ??? ?printf("=== ? 3、退出游戲 ? ? ?===\n");
?? ??? ?printf("=== 請輸入您的選項... ?===\n");
?? ??? ?printf("==========================\n");
?? ??? ?scanf("%d", &choose);
?? ??? ?if (choose == 1 || choose == 2 || choose == 3) {
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?return choose;
}

int MoveSnake(int trend, int* px, int* py, int data[ROW][COL], int* t)
{
?? ?int ret = 1;//默認(rèn)前進(jìn)成功
?? ?//printf("trend=%d\n", trend);
?? ?switch (trend) {
?? ?case 1:*py -= 1; break;//向上
?? ?case 2:*px -= 1; break;//向左
?? ?case 3:*py += 1; break;//向下
?? ?case 4:*px += 1; break;//向右
?? ?}//找到即將前進(jìn)的坐標(biāo)
?? ?if (data[*py][*px] == 6) {
?? ??? ?data[*py][*px] = trend;
?? ??? ?CreatFood(data);
?? ??? ?*t *= 0.9;
?? ?}//如果蛇頭要前進(jìn)的格子是食物,向前長一格,尾部不變;
?? ?else if (data[*py][*px] == 0) {
?? ??? ?data[*py][*px] = trend;//向前長一格
?? ??? ?DeleteTail(*px, *py, data);//消去最后的尾巴
?? ?}
?? ?else {
?? ??? ?ret = 0;
?? ??? ?printf("前進(jìn)失敗\n");
?? ?}//前進(jìn)失敗
?? ?return ret;
}

void CreatFood(int data[ROW][COL])
{
?? ?srand(time(NULL));
?? ?while (1) {
?? ??? ?int x = rand() % (COL - 2) + 1;
?? ??? ?int y = rand() % (ROW - 2) + 1;
?? ??? ?if (data[y][x] == 0) {
?? ??? ??? ?data[y][x] = 6;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}
?
int DeleteTail(int x, int y, int data[ROW][COL])
{
?? ?//PrintTest(data);
?? ?if (data[y][x] <= 4 && data[y][x] >= 1) {
?? ??? ?switch (data[y][x]) {
?? ??? ?case 1:
?? ??? ??? ?if (DeleteTail(x, y + 1, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?if (DeleteTail(x + 1, y, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?if (DeleteTail(x, y - 1, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?if (DeleteTail(x - 1, y, data) == 0) {
?? ??? ??? ??? ?data[y][x] = 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?return 1;
?? ?}
?? ?else {
?? ??? ?return 0;
?? ?}
}
int Input() {
?? ?int trend = 0;
?? ?if (kbhit()) {
?? ??? ?char trend_ = getch();
?? ??? ?while (kbhit()) {
?? ??? ??? ?getch();
?? ??? ?}//清空緩沖區(qū)
?? ??? ?//printf("已接收到%c ", trend_);
?? ??? ?switch (trend_) {
?? ??? ?case 'w':trend = 1; break;
?? ??? ?case 'a':trend = 2; break;
?? ??? ?case 's':trend = 3; break;
?? ??? ?case 'd':trend = 4; break;
?? ??? ?default:printf("請輸入w,a,s,d以控制前進(jìn)方向!!\n");
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?else {
?? ??? ?printf("請輸入w,a,s,d以控制前進(jìn)方向!!\n");
?? ?}
?? ?return trend;
}
?
void PrintShow(int data[ROW][COL])
{
?? ?for (int i = 0; i < ROW; i++) {
?? ??? ?for (int j = 0; j < COL; j++) {
?? ??? ??? ?if (data[i][j] == 0) {
?? ??? ??? ??? ?printf(" ?");
?? ??? ??? ?}
?? ??? ??? ?if (data[i][j] == 5) {
?? ??? ??? ??? ?printf("■");
?? ??? ??? ?}
?? ??? ??? ?if (data[i][j] >= 1 && data[i][j] <= 4) {
?? ??? ??? ??? ?printf("□");
?? ??? ??? ?}
?? ??? ??? ?if (data[i][j] == 6) {
?? ??? ??? ??? ?printf("●");
?? ??? ??? ?}
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
}
?
int CreatHead(int* px, int* py, int data[ROW][COL])
{
?? ?srand(time(NULL));
?? ?while (1) {
?? ??? ?*px = rand() % (COL - 8) + 4;
?? ??? ?*py = rand() % (ROW - 8) + 4;
?? ??? ?if (data[*py][*px] == 0) {
?? ??? ??? ?break;
?? ??? ?}
?? ?}//蛇頭只能刷新在空格位置
?? ?//x,y始終為蛇頭的坐標(biāo)
?? ?int trend = rand() % 4 + 1;//1:上,2:左,3:下,4:右
?? ?data[*py][*px] = trend;
?? ?switch (trend) {
?? ?case 1:data[*py + 1][*px] = 1;
?? ??? ?data[*py + 2][*px] = 1; break;
?? ?case 2:data[*py][*px + 1] = 2;
?? ??? ?data[*py][*px + 2] = 2; break;
?? ?case 3:data[*py - 1][*px] = 3;
?? ??? ?data[*py - 2][*px] = 3; break;
?? ?case 4:data[*py][*px - 1] = 4;
?? ??? ?data[*py][*px - 2] = 4; break;
?? ?}
?? ?return trend;
}
void PrintTest(int data[ROW][COL])
{
?? ?printf("\n");
?? ?for (int i = 0; i < ROW; i++) {
?? ??? ?for (int j = 0; j < COL; j++) {
?? ??? ??? ?printf("%d ", data[i][j]);
?? ??? ?}
?? ??? ?printf("\n");
?? ?}
}
?
int GameOver(int score)
{
?? ?system("cls");
?? ?printf("==============================================\n");
?? ?printf("游戲結(jié)束,您的小蛇最終長到了%d米長...\n", score);
?? ?printf("輸入1重新開始,輸入其它退出游戲...\n");
?? ?int ret = 0;
?? ?scanf("%d", &ret);
?? ?if (ret == 1) {
?? ??? ?return 1;
?? ?}
?? ?else {
?? ??? ?return 0;
?? ?}
}

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

相關(guān)文章

  • 淺析C++構(gòu)造函數(shù)虛擬化

    淺析C++構(gòu)造函數(shù)虛擬化

    這篇文章主要介紹了C++構(gòu)造函數(shù)虛擬化的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)c++構(gòu)造函數(shù),感興趣的朋友可以了解下
    2020-08-08
  • C語言中單目操作符++、–的實(shí)例講解

    C語言中單目操作符++、–的實(shí)例講解

    C語言的操作符共分為算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符,逗號表達(dá)式,下表引用、函數(shù)調(diào)用和結(jié)構(gòu)成員這10大類,這篇文章主要給大家介紹了關(guān)于C語言中單目操作符++、–的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • c++基礎(chǔ)語法:構(gòu)造函數(shù)與析構(gòu)函數(shù)

    c++基礎(chǔ)語法:構(gòu)造函數(shù)與析構(gòu)函數(shù)

    構(gòu)造函數(shù)用來構(gòu)造一個對象,主要完成一些初始化工作,如果類中不提供構(gòu)造函數(shù),編譯器會默認(rèn)的提供一個默認(rèn)構(gòu)造函數(shù)(參數(shù)為空的構(gòu)造函數(shù)就是默認(rèn)構(gòu)造函數(shù)) ;析構(gòu)函數(shù)是隱式調(diào)用的,delete對象時候會自動調(diào)用完成對象的清理工作
    2013-09-09
  • C語言實(shí)現(xiàn)動態(tài)版通訊錄的示例代碼

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

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實(shí)現(xiàn)一個簡單的動態(tài)版通訊錄,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定幫助,需要的可以參考一下
    2022-08-08
  • C語言實(shí)現(xiàn)共享單車管理系統(tǒng)

    C語言實(shí)現(xiàn)共享單車管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)共享單車管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 解析C語言中如何正確使用const

    解析C語言中如何正確使用const

    本篇文章是對C語言中如何正確使用const,進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C++ vector數(shù)組用法及解析

    C++ vector數(shù)組用法及解析

    這篇文章主要給大家分享的是C++ vector數(shù)組用法及解析,什么是什么是vector數(shù)組呢?下面文章將對打家做詳細(xì)介紹,感興趣的小伙伴可以參考一下
    2021-10-10
  • C++ Boost Optional示例超詳細(xì)講解

    C++ Boost Optional示例超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C++的std::vector<bool>轉(zhuǎn)儲文件問題

    C++的std::vector<bool>轉(zhuǎn)儲文件問題

    這篇文章主要介紹了C++的std::vector<bool>轉(zhuǎn)儲文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言限制鏈表最大長度的方法實(shí)現(xiàn)

    C語言限制鏈表最大長度的方法實(shí)現(xiàn)

    本文主要介紹了C語言中限制鏈表的長度,通過在添加新元素時檢查鏈表的當(dāng)前長度是否已經(jīng)達(dá)到預(yù)設(shè)的最大值來實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03

最新評論

五华县| 佳木斯市| 财经| 河南省| 大港区| 杭锦旗| 布拖县| 伊宁市| 肇庆市| 锦屏县| 肥城市| 科技| 福鼎市| 德令哈市| 陆良县| 隆化县| 金溪县| 资中县| 岚皋县| 军事| 兴海县| 专栏| 出国| 静乐县| 盐山县| 贺兰县| 武宣县| 筠连县| 梅州市| 德州市| 福安市| 航空| 阜康市| 桂平市| 加查县| 锦屏县| 建宁县| 威宁| 子洲县| 双辽市| 巴塘县|