1. 程式人生 > >用連結串列做控制檯下的貪吃蛇小遊戲

用連結串列做控制檯下的貪吃蛇小遊戲

本人大一學了C語言後的課程設計:

以下是大體流程圖:

這是我的執行程式碼:

#include<stdio.h>

#include<windows.h>

#include<time.h>

#include<conio.h>

#define X15//地圖長

#define Y10//地圖寬

/*  引用函式

system("cls");刷屏

kbhit()若有鍵盤輸入返回非0

Sleep();使程式停頓                                                     sleep函式和kbhit函式結合起來就可以實現鍵盤輸入改變蛇方向,否則蛇繼續執行的作用

HANDLEhOut; 控制游標位置

COORD pos={0,2}; /* 游標的起始位(第1列,第3行) 0是第1列 2是第3行0  

hOut =GetStdHandle(STD_OUTPUT_HANDLE);             通過改變COORD pos 的座標就可以自如的控制游標位置,非常好用

SetConsoleCursorPosition(hOut,pos);

*/

int Welcome(void);//使用者歡迎介面

void Map_border(int,int);//定義地圖邊境

int Death(struct Snake *);//判斷蛇是否死亡

void Body(struct Snake *);//顯示蛇形

void Move(struct Snake *,char,struct Food *);//移動每個節點

void food(struct Food*);//顯示食物

void Del_node(struct Snake *head);//清除連結串列

void End(void);//顯示結束介面

struct Snake{

         int x;

         int y;

         char direction;

         Snake *next;

};//定義蛇節點

struct Food{

         int x;

         int y;

};

int len=sizeof(struct Snake);

int score;//所吃食物個數

int main()

{

         HANDLE hOut;//游標的起始位(第1列,第1行) 0是第1列 2是第3行0  

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

         srand((unsigned)time(NULL));//產生隨機數以便產生食物和蛇頭

         char choice;

         char s='N';

         struct Snake *head;

         struct Food *F;

         int speed;//遊戲速度

         speed=Welcome()*100;

         do

         {

                   s='N';

                   score=0;

                   F=(struct Food*)malloc(sizeof(struct Food));

                   head=(struct Snake*)malloc(len);

                   head->x=rand()%X;

                   head->y=rand()%Y;

                   head->direction='e';

                   head->next=NULL;//初始化蛇頭

                   do

                   {

                            F->x=rand()%X;

                            F->y=rand()%Y;//初始化食物

                   }while((F->x==0)||(F->y==0)||(F->x==X-1)||(F->y==Y-1));

                   while(Death(head)!=0)//判斷死亡沒有

                   {

                            choice='\0';

                            Map_border(X,Y);//顯示地圖

                            Body(head);//顯示蛇身

                            food(F);//顯示食物

                            COORD pos={(head->x)*2,head->y};

                            SetConsoleCursorPosition(hOut,pos);

                            printf("⊙");//再次顯示蛇頭

                            Sleep(speed);//停頓程式

                            if(kbhit())//等待鍵盤輸入

                            {

                                     choice=getch();

                                     printf("\b");

                            }

                            system("cls");//清屏

                            Move(head,choice,F);//移動和增加節點

                   }

                   End();

                   Del_node(head);//清除蛇連結串列

                   free(F);//清除食物記憶體

                   s=getchar();

         }while(s=='Y');//判斷是否重新開始

         return 0;

}

void Map_border(int x,int y)//定義地圖邊境

{

         int i,j;

         for(i=0;i<y;i++)

         {

                   printf("■");

                   if(i==0||i==y-1)

                            for(j=1;j<x-1;j++)

                            {printf("■");}

                   else

                            for(j=1;j<x-1;j++)

                            {printf("  ");}

                   printf("■\n");

         }

         return;

}

int Death(struct Snake *head)//判斷蛇是否死亡

{

         struct Snake *ptr;

         if(head->x==X-1||head->y==Y-1||head->x==0||head->y==0)//不超界

                   return 0;

         for(ptr=head->next;ptr!=NULL;ptr=ptr->next)

         {

                   if((head->x==ptr->x)&&(head->y==ptr->y))//蛇頭不咬身子

                            return 0;

         }

         return 1;

}

void Move(struct Snake *head,char choice,struct Food *F)//移動每個節點

{

         int x,m;

         int y,n;

         struct Snake *p,*ptr;

         struct Snake *last=NULL;

         ptr=head;

         x=head->x;

         y=head->y;

         if((F->x==head->x)&&(F->y==head->y))//如果吃到食物增加節點

         {

                   score+=1;

                   last=(struct Snake*)malloc(len);

                   do

                   {

                            F->x=rand()%X;

                            F->y=rand()%Y;

                   }while((F->x==0)||(F->y==0)||(F->x==X-1)||(F->y==Y-1));

                   last->next=NULL;

         }

         if(choice=='w'||choice=='a'||choice=='s'||choice=='d')

                   head->direction=choice;//改變蛇頭方向

         switch(head->direction)//移動頭節點

         {

         case 'w':head->y=head->y-1;break;

         case 's':head->y=head->y+1;break;

         case 'a':head->x=head->x-1;break;

         case 'd':head->x=head->x+1;break;

         }

         for(p=head->next;p!=NULL;p=p->next)//頭節點以後的每個節點繼承上一個節點的座標

         {

                   m=p->x;

                   n=p->y;

                   p->x=x;

                   p->y=y;

                   x=m;

                   y=n;

                   ptr=p;

         }

         if(last!=NULL)//吃到食物後增加的節點繼承上個狀態的尾節點座標

         {

                   ptr->next=last;

                   last->x=x;

                   last->y=y;

         }

         return;

}

void food(struct Food *F)//根據食物座標顯示食物

{

         HANDLE hOut;

    hOut = GetStdHandle(STD_OUTPUT_HANDLE);

         COORD pos= {(F->x)*2,F->y};

         SetConsoleCursorPosition(hOut, pos);

         printf("ff");

         return;

}

void Body(struct Snake *head)//根據蛇每個節點座標顯示蛇身

{

         HANDLE hOut;    

         hOut = GetStdHandle(STD_OUTPUT_HANDLE);

         struct Snake *p;

         for(p=head->next;p!=NULL;p=p->next)

         {

                   COORD pos={(p->x)*2,p->y};

                   SetConsoleCursorPosition(hOut,pos);

                   printf("□");

         }

         return;

}

void Del_node(struct Snake *head)//清除連結串列

{

         struct Snake *p1,*p2;

         p2=head;

         for(p1=head->next;p1!=NULL;p1=p1->next)

         {

                   free(p2);

                  p2=p1;

         }

         return;

}

void End(void)//顯示積分

{

         printf("**********************************************\n");

         printf("*                                           *\n");

         printf("*                                           *\n");

         printf("*                  Game Over                 *\n");

         printf("*             Your score is %d               *\n",score);

         printf("*                                           *\n");

         printf("*              enter Y play again            *\n");

         printf("*              else enter any key            *\n");

         printf("*                                           *\n");

         printf("*                                           *\n");

         printf("*                                           *\n");

         printf("*                                            *\n");

         printf("**********************************************\n");

}

int Welcome(void)//顯示歡迎介面

{

         int sum;

         printf("**********************************************\n");

         printf("*                                           *\n");

         printf("*                                            *\n");

         printf("*            歡迎使用貪吃蛇遊戲              *\n");

         printf("*                                           *\n");

         printf("*                                           *\n");

         printf("*             W鍵:上   S鍵:下              *\n");

         printf("*             A鍵:左  D鍵:右              *\n");

         printf("*                                           *\n");

         printf("*                                           *\n");

         printf("*          選擇遊戲速度後開始遊戲            *\n");

         printf("*    1~3:困難    4~7:中等    7~10:緩慢   *\n");

         printf("**********************************************\n");

         scanf("%d",&sum);

         getchar();

         return sum;

}

這是遊戲執行的圖文:


請大家廣泛留言哈!嘻嘻~~~~~~


相關推薦

連結串列控制檯貪吃遊戲

本人大一學了C語言後的課程設計: 以下是大體流程圖: 這是我的執行程式碼: #include<stdio.h> #include<windows.h> #include&

PTA 兩個有序連結串列序列的交集 (很簡單 不是連結串列的)

 兩個有序連結串列序列的交集 (20 分) 已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2的交集新連結串列S3。 輸入格式: 輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−1表示序列的結尾(−1不屬於這個序列)。數字用空格間隔。 輸出格式:

JavaScript貪吃遊戲

<body>         <h1 >貪吃蛇</h1>         <h2 id="score">0</h2>      

arduino編寫貪吃遊戲(完整程式碼)

用arduino編寫貪吃蛇小遊戲 裡面有大量的程式碼註釋,希望能真的幫助到電子愛好者。 工具 : 硬體:arduino UNO 、搖桿模組(控制貪吃蛇前後左右移動、 OLED 螢幕 軟體:arduino IDE1.8.2版本(基本上大於1.6版本,就能使用) 咱

如何用python一個貪吃遊戲並給遊戲加上背景音樂(pygame的應用)

匯入模組 import pygame import sys import time import random from pygame.locals import * 定義顏色變數 redColour = pygame.Color(255, 0, 0) bla

c++經典專案控制檯貪吃遊戲詳細教程

貪吃蛇GreedySnake 本文將講解如何使用c++面向物件方法編寫控制檯版貪吃蛇小遊戲,專案github地址:silence1772/GreedySnake 遊戲下載:GreedySnake 本人屬初學者,水平所限,難免有所錯誤及不妥之處,勞請指出或發

Java寫貪吃遊戲

1 package snake; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.event.ActionEvent; 7 impor

c語言控制檯的一個貪吃遊戲

#include<stdio.h> #include<Windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define HEAD 1

C++控制檯貪吃遊戲詳細教程

遊戲截圖     開始動畫:    遊戲過程:  遊戲架構設計 該遊戲的玩法簡單,玩家通過鍵盤方向鍵控制蛇上下左右移動,吃到食物得分並增長,碰到牆或者自己的身體則死亡,遊戲結束。  整個遊戲其實就是一個無窮的迴圈,直到退出遊戲時退出迴圈

js-->貪吃遊戲,能成功玩

function 小遊戲 absolute images 貪吃蛇 <!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>貪吃蛇小遊戲</tit

使用前端原生 js,貪吃遊戲

oct 新的 生成 方便 描述 logs turn asc 轉動 好久好久,真的是好久好久沒來寫過了,因為最近有點小忙。不過即使是忙,也也還是寫了兩個小遊戲,其中一個就是這個,貪吃蛇啦。 算是一個小練手了,這個是在有點太簡單了,只是第一次寫這種小遊戲,還是零零星星花了三

貪吃遊戲

C/C++MOVE__BOX部分:代碼如下#include<iostream>#include<Windows.h>#include <conio.h>using namespace std;void PutPlace(int x,int y);//設定輸出位置void c

JS貪吃遊戲

ttr etime opened IE title 跨瀏覽器 tac 再次 key 效果圖展示: 具體實現代碼如下: (1)html部分 1 !DOCTYPE html> 2 <html> 3 <head> 4

Android-貪吃遊戲-分析與實現-Kotlin語言描述

otl bject vid oid 小遊戲 同時 們的 http 畫布 Android-貪吃蛇小遊戲-分析與實現-Kotlin語言描述 Overview 本章的主要的內容是貪吃蛇小遊戲的分析和實現,關於實現的具體代碼可以在,文章底部的github的鏈接中找到。 整個遊戲通過

Java實現貪吃遊戲(附完整原始碼)

今天我就從零開始來完成這個小遊戲,完成的方式也是一步一步的新增功能這樣的方式來實現。 第一步完成的功能:寫一個介面 大家見到的貪吃蛇小遊戲,介面肯定是少不了的。因此,第一步就是寫一個小介面。 實現程式碼如下: 第二步完成的功能:在介面上畫成一格一格的 我們見過的貪吃蛇遊戲

C語言編寫貪吃遊戲

**遊戲結構**       1.知道怎麼控制終端上游標的位置。 #include<stdio.h> #inc

js貪吃遊戲(相容ie8)DOM,BOM操作

效果圖 本篇將使用JavaScript 編寫一個貪吃蛇的小遊戲,採用OOP(面向物件)程式設計 基本沒有CSS樣式和HTML結構,主要是體會js操作 HTML程式碼 <div class="map"></div> &

java 貪吃遊戲效果圖加原始碼

今天寫了一個貪吃蛇的小遊戲用來練手,在流程控制方面也沒有封裝方法進行簡化,不過作為鍛鍊流程控制是很好的。 下面附上自己的原始碼 package com.oracle; import java.awt.Graphics; import java.awt.Image

使用opengl製作簡易貪吃遊戲

#include<iostream> #include<algorithm> #include<functional> #include<cstdlib> #include<cstdio> #include<g

好玩的貪吃遊戲,有趣極了!

(function ($) { $.fn.game1 = function (options) { var mainDiv = $(this); var defaults = { speed:150,//速度 leftSteps:50, topSteps:30 }; var opts = $.extend(d