c語言貪吃蛇

c語言貪吃蛇

平臺用戶的互動中精選與c語言貪吃蛇相關的:1、c語言 貪吃蛇 程序 2、C語言的貪吃蛇源代碼 3、C語言編寫貪吃蛇需要用哪些函數?? 4、貪吃蛇怎么用C語言編寫 5、c語言貪吃蛇怎么讓蛇自己動起來? 6、用c語言編寫的貪食蛇游戲 7、求C語言貪吃蛇代碼能在DEV上運行通過的貪吃蛇,不要TC上的啊我們老師上課給在DEV我們運行了一次 8、求 貪吃蛇C語言代碼 9、c語言貪吃蛇的速度控制程序怎么編 10、c語言貪吃蛇源代碼怎么用?
c語言貪吃蛇
平臺用戶 2018-06-06 16:49:07

下面是精選平臺用戶互動時的最佳討論

匿名
匿名


匿名:c語言 貪吃蛇 程序

主要內容: 設計并實現一個類似于手機游戲“貪吃蛇”的程序。一條蛇在密閉的圍墻內運動,通過鍵盤上的四個箭頭鍵控制蛇向上下左右四個方向移動。在圍墻內隨機出現一個食物,蛇頭撞到食物,則表示食物被蛇吃掉,這時蛇的身體長一節,同時加分,接著又出現食物... 主要內容:
設計并實現一個類似于手機游戲“貪吃蛇”的程序。一條蛇在密閉的圍墻內運動,通過鍵盤上的四個箭頭鍵控制蛇向上下左右四個方向移動。在圍墻內隨機出現一個食物,蛇頭撞到食物,則表示食物被蛇吃掉,這時蛇的身體長一節,同時加分,接著又出現食物,等待被蛇吃掉。如果蛇在移動過程中,撞到墻壁、身體交叉或蛇頭撞到自己的身體則游戲結束。

基本要求:
課程設計中要求掌握和實現如下功能和方法:
1、掌握基本繪圖原理和圖形函數的使用方法;
2、掌握游戲中基本的動畫實現方法;
3、掌握鍵盤響應的主要函數和方法;
4、了解游戲中碰撞檢測的方法;
5、實現游戲加速功能,包括加速鍵功能和逐步加速功能;

擴展要求:
1、 實現隨機出現障礙物功能;
2、 實現迷宮式圍墻;
3、 實現過關式的游戲方式;

文檔要求:
系統完成后,要提交格式規范的文檔,包含如下內容:
1、 程序的功能;
2、 游戲界面設計和圖形函數的使用;
3、 整體設計思路;
4、 程序中的數據結構;
5、 程序中碰撞檢測的實現方法;
6、 程序核心算法的流程圖;
7、 程序改進的設想;
8、 總結。
1、 程序的功能
設計并實現一個類似于手機游戲“貪吃蛇”的程序。一條蛇在密閉的圍墻內運動,通過鍵盤上的四個箭頭鍵控制蛇向上下左右四個方向移動。在圍墻內隨機出現一個食物,蛇頭撞到食物,則表示食物被蛇吃掉,這時蛇的身體長一節,同時加分,接著又出現食物,等待被蛇吃掉。如果蛇在移動過程中,撞到墻壁或蛇頭撞到自己的身體則游戲結束。

2、 游戲界面設計和圖形函數的使用
/* 參考指導書中1.3.1和畫界面函數部分 */
3、 整體設計思路
/* 參考指導書中1.3.2部分 */
4、 程序中的數據結構
/* 參考指導書中1.3.2部分 */
5、 程序中碰撞檢測的實現方法
/* 參考指導書中游戲具體過程函數部分 */
6、 程序核心算法的流程圖
/* 參考別人的 囧 */
7、 程序改進的設想
/* 自己瞎琢磨吧! */
8、 總結
通過本次課程設計,強化了我對C語言相關知識的掌握,學會了基本的游戲編程方法,加深了我復雜程序設計的能力,初步掌握了高級語言程序調試技能 ......(此處刪節三百字,你就隨便編吧。
下面的解答已被5107人點贊
/* 貪吃蛇程序 by champking */

#define N 200

#include <graphics.h>
#include <stdlib.h>
#include <dos.h>

#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b

int i,key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戲速度自己調整*/

struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變量*/
}food;/*食物的結構體*/

struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;

void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/

/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}

/*圖形驅動*/
void Init(void)
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "c:\\tc");
cleardevice();
}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*設置線型*/

for(i = 50; i <= 600; i += 10)/*畫圍墻*/
{
rectangle(i, 40, i + 10, 49); /*上邊*/
rectangle(i, 451, i + 10, 460);/*下邊*/
}

for(i = 40; i <= 450; i += 10)
{
rectangle(50, i, 59, i + 10); /*左邊*/
rectangle(601, i, 610, i + 10);/*右邊*/
}
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機數發生器*/
food.yes = 1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life = 0;/*活著*/
snake.direction = 1;/*方向往右*/
snake.x[0] = 100; snake.y[0] = 100;/*蛇頭*/
snake.x[1] = 110; snake.y[1] = 100;
snake.node = 2;/*節數*/
PrScore();/*輸出得分*/

while(1)/*可以重復玩游戲,壓ESC鍵結束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/
{
if(food.yes == 1)/*需要出現新食物*/
{
food.x = rand() % 400 + 60;
food.y = rand() % 350 + 60;

while(food.x % 10 != 0)/*食物隨機出現后必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y % 10 != 0)
food.y++;
food.yes = 0;/*畫面上有食物了*/
}

if(food.yes == 0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x + 10, food.y - 10);
}

for(i = snake.node - 1; i > 0; i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵算法*/
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction)
{
case 1: snake.x[0] += 10; break;
case 2: snake.x[0] -= 10; break;
case 3: snake.y[0] -= 10; break;
case 4: snake.y[0] += 10; break;
}

for(i = 3; i < snake.node; i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life = 1;
break;
}
}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墻壁*/
{
GameOver();/*本次游戲結束*/
snake.life=1; /*蛇死*/
}

if(snake.life == 1)/*以上兩種判斷以后,如果蛇死就跳出內循環,重新開始*/
break;

if(snake.x[0] == food.x && snake.y[0] == food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x, food.y, food.x + 10, food.y - 10);
snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes = 1;/*畫面上需要出現新的食物*/
score += 10;
PrScore();/*輸出新得分*/
}

setcolor(4);/*畫出蛇*/

for(i = 0; i < snake.node; i++)
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
snake.y[i] - 10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一節*/
rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
} /*endwhile(!kbhit)*/

if(snake.life == 1)/*如果蛇死就跳出循環*/
break;

key = bioskey(0);/*接收按鍵*/

if(key == ESC)/*按ESC鍵退出*/
break;
else
if(key == UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key == RIGHT &&snake.direction != 2)
snake.direction=1;
else
if(key == LEFT && snake.direction != 1)
snake.direction = 2;
else
if(key == DOWN && snake.direction != 3)
snake.direction = 4;
}/*endwhile(1)*/
}

/*游戲結束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}

/*輸出成績*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}

/*圖形結束*/
void Close(void)
{
getch();
closegraph();
}

最后一次編輯時間 推薦于2017-09-18 05:24:38
7302159
7302159


7302159:C語言的貪吃蛇源代碼

可以的話追加55分。。我最后的分數~~希望以前自己寫過程序的朋友發個給我,時間不多了 我有用! 郵箱[email protected] 百度很多的那種不用發來了~~
下面的解答已被4014人點贊

 
//******友情提示:如想速度快點,請改小_sleep(500)函數中參數*****  

#include <stdio.h>  
#include <stdlib.h>  
#include <conio.h>  
#include <string.h>  
#include <time.h>  
const int H = 8;   //地圖的高  
const int L = 16;  //地圖的長  
char GameMap[H][L];   //游戲地圖  
int  key;  //按鍵保存  
int  sum = 1, over = 0;  //蛇的長度, 游戲結束(自吃或碰墻)  
int  dx[4] = {0, 0, -1, 1};  //左、右、上、下的方向  
int  dy[4] = {-1, 1, 0, 0};  
struct Snake   //蛇的每個節點的數據類型  
{  
 int x, y;  //左邊位置  
 int now;   //保存當前節點的方向, 0,1,2,3分別為左右上下  
}Snake[H*L];  
const char Shead = '@';  //蛇頭  
const char Sbody = '#';  //蛇身  
const char Sfood = '*';  //食物  
const char Snode = '.';  //'.'在地圖上標示為空  
void Initial();  //地圖的初始化  
void Create_Food(); //在地圖上隨機產生食物  
void Show();   //刷新顯示地圖  
void Button();  //取出按鍵,并判斷方向  
void Move();   //蛇的移動  
void Check_Border();  //檢查蛇頭是否越界  
void Check_Head(int x, int y);   //檢查蛇頭移動后的位置情況  
int main()   
{  
 Initial();  
 Show();  
 return 0;  
}  
void Initial()  //地圖的初始化  
{  
 int i, j;  
 int hx, hy;  
 system("title 貪吃蛇");  //控制臺的標題  
 memset(GameMap, '.', sizeof(GameMap));  //初始化地圖全部為空'.'  
 system("cls");  
 srand(time(0));   //隨機種子  
 hx = rand()%H;    //產生蛇頭  
 hy = rand()%L;  
 GameMap[hx][hy] = Shead;  
 Snake[0].x = hx;  Snake[0].y = hy;  
 Snake[0].now = -1;  
 Create_Food();   //隨機產生食物  
 for(i = 0; i < H; i++)   //地圖顯示  
 {   
  for(j = 0; j < L; j++)  
   printf("%c", GameMap[i][j]);  
  printf("\n");  
 }  
     
 printf("\n小小C語言貪吃蛇\n");  
 printf("按任意方向鍵開始游戲\n");  
    
 getch();   //先接受一個按鍵,使蛇開始往該方向走  
 Button();  //取出按鍵,并判斷方向  
}  
void Create_Food()  //在地圖上隨機產生食物  
{  
 int fx, fy;  
 while(1)  
 {  
  fx = rand()%H;  
     fy = rand()%L;  
     
  if(GameMap[fx][fy] == '.')  //不能出現在蛇所占有的位置  
  {   
   GameMap[fx][fy] = Sfood;  
      break;  
  }  
 }  
}  
void Show()  //刷新顯示地圖  
{  
 int i, j;  
 while(1)  
 {    
  _sleep(500); //延遲半秒(1000為1s),即每半秒刷新一次地圖  
  Button();   //先判斷按鍵在移動  
  Move();  
  if(over)  //自吃或碰墻即游戲結束  
  {   
   printf("\n**游戲結束**\n");  
   printf("     >_<\n");  
   getchar();  
      break;  
  }  
  system("cls");   //清空地圖再顯示刷新吼的地圖  
  for(i = 0; i < H; i++)   
  {   
   for(j = 0; j < L; j++)  
    printf("%c", GameMap[i][j]);  
   printf("\n");  
  }  
     
  printf("\n小小C語言貪吃蛇\n");  
  printf("按任意方向鍵開始游戲\n");  
 }  
}  
void Button()  //取出按鍵,并判斷方向  
{  
 if(kbhit() != 0) //檢查當前是否有鍵盤輸入,若有則返回一個非0值,否則返回0  
 {   
  while(kbhit() != 0)  //可能存在多個按鍵,要全部取完,以最后一個為主  
      key = getch(); //將按鍵從控制臺中取出并保存到key中  
  switch(key)  
  {   //左  
   case 75:  Snake[0].now = 0;  
          break;  
            //右  
            case 77:  Snake[0].now = 1;       
          break;  
            //上  
   case 72:  Snake[0].now = 2;  
          break;  
            //下  
   case 80:  Snake[0].now = 3;  
          break;  
  }  
 }  
}  
void Move()   //蛇的移動  
{  
 int i, x, y;  
    int t = sum;  //保存當前蛇的長度  
 //記錄當前蛇頭的位置,并設置為空,蛇頭先移動  
 x = Snake[0].x;  y = Snake[0].y;  GameMap[x][y] = '.';  
 Snake[0].x = Snake[0].x + dx[ Snake[0].now ];  
 Snake[0].y = Snake[0].y + dy[ Snake[0].now ];  
 Check_Border();   //蛇頭是否越界  
 Check_Head(x, y);  //蛇頭移動后的位置情況,參數為: 蛇頭的開始位置  
 if(sum == t)  //未吃到食物即蛇身移動哦  
    for(i = 1; i < sum; i++)  //要從蛇尾節點向前移動哦,前一個節點作為參照  
 {  
  if(i == 1)   //尾節點設置為空再移動  
   GameMap[ Snake[i].x ][ Snake[i].y ] = '.';  
     
  if(i == sum-1)  //為蛇頭后面的蛇身節點,特殊處理  
  {  
   Snake[i].x = x;  
         Snake[i].y = y;  
      Snake[i].now = Snake[0].now;  
  }  
  else   //其他蛇身即走到前一個蛇身位置  
  {  
   Snake[i].x = Snake[i+1].x;  
         Snake[i].y = Snake[i+1].y;  
      Snake[i].now = Snake[i+1].now;  
  }  
      
  GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移動后要置為'#'蛇身   
 }  
}  
void Check_Border()  //檢查蛇頭是否越界  
{  
 if(Snake[0].x < 0 || Snake[0].x >= H  
 || Snake[0].y < 0 || Snake[0].y >= L)  
     over = 1;  
}  
void Check_Head(int x, int y)  //檢查蛇頭移動后的位置情況  
{  
    
 if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')  //為空  
  GameMap[ Snake[0].x ][ Snake[0].y ] = '@';  
 else 
  if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*')  //為食物  
  {  
   GameMap[ Snake[0].x ][ Snake[0].y ] = '@';    
   Snake[sum].x = x;   //新增加的蛇身為蛇頭后面的那個  
      Snake[sum].y = y;  
      Snake[sum].now = Snake[0].now;  
         GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';   
   sum++;  
   Create_Food();  //食物吃完了馬上再產生一個食物  
  }  
  else 
   over = 1;  
}

最后一次編輯時間 推薦于2017-11-17 20:26:41
平凡的白I光
平凡的白I光


平凡的白I光:C語言編寫貪吃蛇需要用哪些函數??

不要源代碼,不要思路,只要告訴我需要用到哪些知道就行了,謝謝了。
下面的解答已被9171人點贊
先寫個
#include <stdio.h>

int main(void)
{
return 0;
}
然后考慮接下來該怎么填這個空
你的控制:左右上下
狀態:整條蛇的全體所占坐標排成一個向量,蛇當前方向
矩形坐標范圍
障礙坐標
死亡條件:當蛇頭超過矩形坐標范圍或者撞擊障礙、蛇身
加長條件:吃到食物的時候,蛇全身其他坐標不變,只是尾巴上長了一個。
定時:每當定時時間到,尾巴上的蛇身那一格消失,其他坐標不變,多了一個格,為頭部坐標+方向,此為新的蛇頭。
再組織成一個程序就可以了
echo '++++++++++[>++++++++++[>+<-]<-]>>-.+++++++.---------.++++++++.>>++++[<++++[<+>-]>-]<<+.-------..' | sed '
s/\([-+]\)/\1\1*p;/g
s/</p--;/g
s/>/p++;/g
s/\./putchar(*p);/g
s/\[/while(*p){/g
s/\]/}/g
1s/^/main(){char*p=calloc(1,6);/
$s/$/}/
/./!d'|gcc -xc - 2>/dev/null&&./a.out
最后一次編輯時間 2015-07-04
°迷島0RM
°迷島0RM


°迷島0RM:貪吃蛇怎么用C語言編寫

下面的解答已被2383人點贊
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h> /*引用的庫函數*/
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b/*宏定義鍵名*/
#define N 200
int i,key;
int level;/*游戲等級*/
int score=0;/*得分*/
int gamespeed;/*游戲速度*/
struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變量*/
}food;/*食物的結構體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;/*蛇的結構體*/
void Choicelevle(void);/*選擇游戲等級*/
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DRAW(void);/*游戲區域*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
Choicelevle();/*選擇游戲等級*/
DRAW();/*游戲區域*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}

/*圖形驅動*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"\\turboc2"); /*初始化圖形系統*/
cleardevice(); /*清除圖形界面*/
}
/*選擇游戲等級*/
void Choicelevle(void)
{char name[20];setcolor(YELLOW);settextstyle(0,0,6);outtextxy(150,150,"Snake");setcolor(GREEN);settextstyle(0,0,1);outtextxy(200,250,"please put in your English name:");outtextxy(200,270,"Choice levle from 1-9.");outtextxy(300,320,"name:yangzilong");/*制作人姓名*/outtextxy(300,350,"number:0902060226");/*制作人學號*/outtextxy(300,380,"class:computer science 0602");/*制作人班級*/getch();printf("please putin your name:");gets(name);printf("please choice levle:");scanf("%d",&level);gamespeed=100000-400*level-300*level*level;if(level>9||level<1){cleardevice(); /*清除圖形界面*/setcolor(YELLOW); /*設置字體顏色*/settextstyle(0,0,2); /*設置字體類型*/outtextxy(150,200,"level input error"); /*顯示文本*/getch();level=1;}
}
void DRAW(void)
{cleardevice(); /*清屏*/setcolor(2);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/rectangle(45,45,465,325);}
/*玩游戲具體過程*/
void GamePlay(void)
{setcolor(5);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/randomize();/*隨機數發生器*/food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/snake.life=0;/*活著*/snake.direction=1;/*方向往右*/snake.x[0]=320;snake.y[0]=240;/*蛇頭*/snake.x[1]=330;snake.y[1]=240; /*蛇的第二節位置*/snake.node=3;/*節數*/PrScore();/*輸出得分*/while(1)/*可以重復玩游戲,壓ESC鍵結束*/{while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/{if(food.yes==1)/*需要出現新食物*/{food.x=rand()%360+70;food.y=rand()%250+60;while(food.x%10!=0)/*食物隨機出現后必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/food.x++;while(food.y%10!=0)food.y++;food.yes=0;/*畫面上有食物了*/}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個方向,通過這個控制來移動蛇頭*/
switch(snake.direction)
{
case 1: snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1; /*蛇死*/
break;
}
}

/*如果蛇頭碰到墻壁,蛇頭從對面墻出來*/
if(snake.x[0]<50)
{snake.x[0]=450;/*如果蛇頭越過左邊界,則從右邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}
{
setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數*/
}
}
else
if(snake.x[0]>450)
{snake.x[0]=50;/*如果蛇頭越過右邊界,則蛇頭從左邊界進入*/snake.y[0]=snake.y[0];/*縱坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}
{
setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數*/
}
}
else
if(snake.y[0]<60)
{snake.y[0]=320;/*如果蛇頭越過上邊界,則從下邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}
{
setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數*/
}
}
else
if(snake.y[0]>320)
{snake.y[0]=60;/*如果蛇頭越過下邊界,則從上邊界進入*/snake.x[0]=snake.x[0];/*橫坐標不變*/for(i=snake.node-1;i>0;i--){snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1]; /*蛇的其他節數向前推進*/}
{
setfillstyle(SOLID_FILL,0); /*設置填充模式和顏色,0表示黑色*/
bar(50,55,455,315);/*bar是表示填充的范圍的函數*/
}
}
if(snake.life==1)/*如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10); /*用當前線型和顏色畫一矩形*/
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10; /*每吃掉一食物,得分累加10分*/
if(score%100==0)
{level++;gamespeed=100000-400*level-300*level*level;/*每吃掉10食物提升一級,速度加快*/PrScore();/*輸出新得分*/setcolor(YELLOW); /*設置字體顏色*/settextstyle(0,0,4); /*設置字體類型*/outtextxy(150,200,"LEVEL UP"); /*顯示文本*/if(level==10){level=1,gamespeed=100000-400*level-300*level*level;}
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
delay(6000000);
bar(50,55,455,315);/*bar是表示填充的范圍的函數*/
}
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed); /*控制游戲速度*/
setcolor(0);
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/ /*用黑色去除蛇的的最后一節*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結束*/
void GameOver(void)
{
cleardevice(); /*清屏*/
PrScore();
setcolor(RED); /*設置字體顏色*/
settextstyle(0,0,4); /*設置字體類型*/
outtextxy(200,200,"GAME OVER"); /*顯示文本*/
getch();
}
/*輸出成績及游戲等級*/
void PrScore(void)
{
char str1[20];/*設置字符型數組*/
setfillstyle(SOLID_FILL,0);
bar(50,15,390,35); /*填充矩形框*/
setcolor(6); /*設置文本顏色*/
settextstyle(0,0,2); /*設置數組顯示位置*/
sprintf(str1,"score %d level %d",score,level);/*顯示數組內容*/
outtextxy(55,20,str1);
setcolor(YELLOW); /*設置字體顏色*/
settextstyle(0,0,2); /*設置字體類型*/
outtextxy(250,400,"EXIT=ESC ");/*顯示文本*/
}
void Close(void)
{
closegraph();
}
最后一次編輯時間 推薦于2017-09-15 03:14:25
li455381165
li455381165


li455381165:c語言貪吃蛇怎么讓蛇自己動起來?

剛學完譚浩強的c語言
盡量詳細點
下面的解答已被3683人點贊
死循環+Sleep可以完成這個功能的
比如說我現在定義了一個小方塊,讓他自動移動
int i,j;
int a[25][80]={0};
//用數組來覆蓋整個運行界面
int x=10,y=0;
//定義一個x,y表示方塊當前的位置
while(1)
{
//清楚之前的輸出信息
system("cls");//這是調用的命令行,作用是清屏
a[x][y]=1;
//數組元素為1就表示在界面上的這個位置顯示方塊
//在屏幕上相應位置輸出方塊
for( i = 0; i<25 ; i++)
for( j=0; j<80 ;j++)
if(a[i][j]==0) printf(" ");
//等于0就表示該位置不是方塊,輸出一個空格
else printf("%c",2);
//否則就輸出這個方塊
//然后重置這個數組,這個可以和上一個循環合并在一起
for( i = 0; i<25 ; i++)
for( j=0; j<80 ;j++)
a[i][j]=0;
// 更改方塊所在的位置
//向上 x=x-1;
//向下 x=x+1;
//向左 y=y-1;
//向右 y=y-1;
//上面的四句保留一句就可以了
//然后休息休息
Sleep(300);
}
基本算法就如代碼所示
具體的肯定和你向做的效果不一樣
比如說你要控制蛇的方向
那改變位置的時候就需要判斷
而且,改變一條蛇和改變一個方塊也不一樣
不過總體思路是這樣子的
僅作參考
注意一點,Sleep函數是window頭文件里面的
需要導入window頭文件
如果不是Windows系統,請替換為相應的函數
最后一次編輯時間 推薦于2017-09-30 10:23:06
bianchenggaosh
bianchenggaosh


bianchenggaosh:用c語言編寫的貪食蛇游戲

麻煩你注釋詳細點,最好注明每一句話的意思
下面的解答已被4041人點贊
這是一個成功的貪吃蛇代碼(c語言編寫的),希望你能看懂!慢慢看:
#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戲速度自己調整*/
struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變量*/
}food;/*食物的結構體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}
/*圖形驅動*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i<=600;i+=10)/*畫圍墻*/
{
rectangle(i,40,i+10,49); /*上邊*/
rectangle(i,451,i+10,460);/*下邊*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/
}
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機數發生器*/
food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節數*/
PrScore();/*輸出得分*/
while(1)/*可以重復玩游戲,壓ESC鍵結束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/
{
if(food.yes==1)/*需要出現新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機出現后必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/
}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墻壁*/
{
GameOver();/*本次游戲結束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一節*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*圖形結束*/
void Close(void)
{
getch();
closegraph();
}
最后一次編輯時間 推薦于2017-09-18 11:51:53
爹你爸來了
爹你爸來了


爹你爸來了:求C語言貪吃蛇代碼能在DEV上運行通過的貪吃蛇,不要TC上的啊我們老師上課給在DEV我們運行了一次

求C語言貪吃蛇代碼能在DEV上運行通過的貪吃蛇,不要TC上的啊我們老師上課給在DEV我們運行了一次跪求跪求😭😭😭😭😭
下面的解答已被7378人點贊

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


#define U 1
#define D 2
#define L 3
#define R 4       //蛇的狀態,U:上 ;D:下;L:左 R:右

typedef struct SNAKE { //蛇身的一個節點
    int x;
    int y;
    struct SNAKE *next;
} snake;

//全局變量//
int score=0,add=10;//總得分與每次吃食物得分。
int status,sleeptime=200;//每次運行的時間間隔
snake *head, *food;//蛇頭指針,食物指針
snake *q;//遍歷蛇的時候用到的指針
int endgamestatus=0; //游戲結束的情況,1:撞到墻;2:咬到自己;3:主動退出游戲。

//聲明全部函數//
void Pos();
void creatMap();
void initsnake();
int biteself();
void createfood();
void cantcrosswall();
void snakemove();
void pause();
void gamecircle();
void welcometogame();
void endgame();
void gamestart();

void Pos(int x,int y)//設置光標位置
{
    COORD pos;
    HANDLE hOutput;
    pos.X=x;
    pos.Y=y;
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput,pos);
}

void creatMap()//創建地圖
{
    int i;
    for(i=0; i<58; i+=2) { //打印上下邊框
        Pos(i,0);
        printf("■");
        Pos(i,26);
        printf("■");
    }
    for(i=1; i<26; i++) { //打印左右邊框
        Pos(0,i);
        printf("■");
        Pos(56,i);
        printf("■");
    }
}

void initsnake()//初始化蛇身
{
    snake *tail;
    int i;
    tail=(snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設定開始的位置//
    tail->x=24;
    tail->y=5;
    tail->next=NULL;
    for(i=1; i<=4; i++) {
        head=(snake*)malloc(sizeof(snake));
        head->next=tail;
        head->x=24+2*i;
        head->y=5;
        tail=head;
    }
    while(tail!=NULL) { //從頭到為,輸出蛇身
        Pos(tail->x,tail->y);
        printf("■");
        tail=tail->next;
    }
}

int biteself()//判斷是否咬到了自己
{
    snake *self;
    self=head->next;
    while(self!=NULL) {
        if(self->x==head->x && self->y==head->y) {
            return 1;
        }
        self=self->next;
    }
    return 0;
}

void createfood()//隨機出現食物
{
    snake *food_1;
    srand((unsigned)time(NULL));
    food_1=(snake*)malloc(sizeof(snake));
    while((food_1->x%2)!=0) {  //保證其為偶數,使得食物能與蛇頭對其
        food_1->x=rand()%52+2;
    }
    food_1->y=rand()%24+1;
    q=head;
    while(q->next==NULL) {
        if(q->x==food_1->x && q->y==food_1->y) { //判斷蛇身是否與食物重合
            free(food_1);
            createfood();
        }
        q=q->next;
    }
    Pos(food_1->x,food_1->y);
    food=food_1;
    printf("■");
}

void cantcrosswall()//不能穿墻
{
    if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) {
        endgamestatus=1;
        endgame();
    }
}

void snakemove()//蛇前進,上U,下D,左L,右R
{
    snake * nexthead;
    cantcrosswall();

    nexthead=(snake*)malloc(sizeof(snake));
    if(status==U) {
        nexthead->x=head->x;
        nexthead->y=head->y-1;
        if(nexthead->x==food->x && nexthead->y==food->y) { //如果下一個有食物//
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                                           //如果沒有食物//
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==D) {
        nexthead->x=head->x;
        nexthead->y=head->y+1;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                           //沒有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==L) {
        nexthead->x=head->x-2;
        nexthead->y=head->y;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                            //沒有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(status==R) {
        nexthead->x=head->x+2;
        nexthead->y=head->y;
        if(nexthead->x==food->x && nexthead->y==food->y) { //有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            score=score+add;
            createfood();
        } else {                                     //沒有食物
            nexthead->next=head;
            head=nexthead;
            q=head;
            while(q->next->next!=NULL) {
                Pos(q->x,q->y);
                printf("■");
                q=q->next;
            }
            Pos(q->next->x,q->next->y);
            printf("  ");
            free(q->next);
            q->next=NULL;
        }
    }
    if(biteself()==1) {     //判斷是否會咬到自己
        endgamestatus=2;
        endgame();
    }
}

void pause()//暫停
{
    while(1) {
        Sleep(300);
        if(GetAsyncKeyState(VK_SPACE)) {
            break;
        }

    }
}

void gamecircle()//控制游戲
{

    Pos(64,15);
    printf("不能穿墻,不能咬到自己\n");
    Pos(64,16);
    printf("用↑.↓.←.→分別控制蛇的移動.");
    Pos(64,17);
    printf("F1 為加速,F2 為減速\n");
    Pos(64,18);
    printf("ESC :退出游戲.space:暫停游戲.");
    Pos(64,20);
    //
    status=R;
    while(1) {
        Pos(64,10);
        printf("得分:%d  ",score);
        Pos(64,11);
        printf("每個食物得分:%d分",add);
        if(GetAsyncKeyState(VK_UP) && status!=D) {
            status=U;
        } else if(GetAsyncKeyState(VK_DOWN) && status!=U) {
            status=D;
        } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) {
            status=L;
        } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) {
            status=R;
        } else if(GetAsyncKeyState(VK_SPACE)) {
            pause();
        } else if(GetAsyncKeyState(VK_ESCAPE)) {
            endgamestatus=3;
            break;
        } else if(GetAsyncKeyState(VK_F1)) {
            if(sleeptime>=50) {
                sleeptime=sleeptime-30;
                add=add+2;
                if(sleeptime==320) {
                    add=2;//防止減到1之后再加回來有錯
                }
            }
        } else if(GetAsyncKeyState(VK_F2)) {
            if(sleeptime<350) {
                sleeptime=sleeptime+30;
                add=add-2;
                if(sleeptime==350) {
                    add=1;  //保證最低分為1
                }
            }
        }
        Sleep(sleeptime);
        snakemove();
    }
}

void welcometogame()//開始界面
{
    Pos(40,12);

    //
    printf("歡迎來到貪食蛇游戲!");
    Pos(40,25);
    //
    system("pause");
    system("cls");
    Pos(25,12);
    printf("用↑.↓.←.→分別控制蛇的移動, F1 為加速,2 為減速\n");
    Pos(25,13);
    printf("加速將能得到更高的分數。\n");
    system("pause");
    system("cls");
}

void endgame()//結束游戲
{

    system("cls");
    Pos(24,12);
    if(endgamestatus==1) {
        printf("對不起,您撞到墻了。游戲結束.");
    } else if(endgamestatus==2) {
        printf("對不起,您咬到自己了。游戲結束.");
    } else if(endgamestatus==3) {
        printf("您的已經結束了游戲。");
    }
    Pos(24,13);
    printf("您的得分是%d\n",score);
    exit(0);
}

void gamestart()//游戲初始化
{
    system("mode con cols=100 lines=30");
    welcometogame();
    creatMap();
    initsnake();
    createfood();
}

int main()
{
    gamestart();
    gamecircle();
    endgame();
    return 0;
}

最后一次編輯時間 推薦于2017-11-22 20:12:24
lck32578
lck32578


lck32578:求 貪吃蛇C語言代碼

求大神給我一份貪吃蛇的代碼,不要用到圖形庫函數的,只用time,stlib,stdio就好了,謝謝!
下面的解答已被6960人點贊
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 21

int apple[3],num;
char score[3];
char tail[3];

void gotoxy(int x, int y) //輸出坐標
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void color(int b) //顏色函數
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,b) ;
}

int Block(char head[2]) //判斷出界
{
if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))
return 1;
return 0;
}

int Eat(char snake[2]) //吃了蘋果
{
if ((snake[0] == apple[0]) && (snake[1] == apple[1]))
{
apple[0] = apple[1] = apple[2] = 0;
gotoxy(N+44,10);
color(13);
printf("%d",score[0]*10);
color(11);
return 1;
}
return 0;
}

void Draw(char **snake, int len) //蛇移動
{
if (apple[2])
{
gotoxy(apple[1] * 2, apple[0]);
color(12);
printf("●");
color(11);
}
gotoxy(tail[1] * 2, tail[0]);
if (tail[2])
{
color(num);
printf("★");
color(num);
}
else
printf("■");
gotoxy(snake[0][1] * 2, snake[0][0]);
color(num);
printf("★");
color(num);
putchar('\n');
}

char** Move(char **snake, char dirx, int *len) //控制方向
{
int i, full = Eat(snake[0]);
memcpy(tail, snake[(*len)-1], 2);
for (i = (*len) - 1; i > 0; --i)
memcpy(snake[i], snake[i-1], 2);
switch (dirx)
{
case 'w': case 'W': --snake[0][0]; break;
case 's': case 'S': ++snake[0][0]; break;
case 'a': case 'A': --snake[0][1]; break;
case 'd': case 'D': ++snake[0][1]; break;
default: ;
}
if (full)
{
snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));
snake[(*len)] = (char *)malloc(sizeof(char) * 2);
memcpy(snake[(*len)], tail, 2);
++(*len);
++score[0];
if(score[3] < 16)
++score[3];
tail[2] = 1;
}
else
tail[2] = 0;
return snake;
}

void init(char plate[N+2][N+2], char ***snake_x, int *len) //初始化
{
int i, j;
char **snake = NULL;

*len = 3;
score[0] = score[3] =3;
snake = (char **)realloc(snake, sizeof(char *) * (*len));
for (i = 0; i < *len; ++i)
snake[i] = (char *)malloc(sizeof(char) * 2);

for (i = 0; i < 3; ++i)
{
snake[i][0] = N/2 + 1;
snake[i][1] = N/2 + 1 + i;
}

for (i = 1; i <= N; ++i)
for (j = 1; j <= N; ++j)
plate[i][j] = 1;

apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;
apple[2] = 1;

for (i = 0; i < N + 2; ++i)
{
gotoxy(0, i);
for (j = 0; j < N + 2; ++j)
{
switch (plate[i][j])
{
case 0:
color(12);printf("□");color(11); continue;
case 1: printf("■"); continue;
default: ;
}
}
putchar('\n');
}
for (i = 0; i < (*len); ++i)
{
gotoxy(snake[i][1] * 2, snake[i][0]);
printf("★");
}
putchar('\n');
*snake_x = snake;
}

void Manual()
{
gotoxy(N+30,2);
color(10);
printf("按 W S A D 移動方向");
gotoxy(N+30,4);
printf("按 space 鍵暫停");
gotoxy(N+30,8);
color(11);
printf("歷史最高分為: ");
color(12);
gotoxy(N+44,8);
printf("%d",score[1]*10);
color(11);
gotoxy(N+30,12);
printf("你現在得分為: 0");
}

int File_in() //取記錄的分數
{
FILE *fp;
if((fp = fopen("C:\\tcs.txt","a+")) == NULL)
{
gotoxy(N+18, N+2);
printf("文件不能打開\n");
exit(0);
}
if((score[1] = fgetc(fp)) != EOF);
else
score[1] = 0;
return 0;
}

int File_out() //存數據
{

FILE *fp;
if(score[1] > score[0])
{gotoxy(10,10);
color(12);
puts("闖關失敗 加油耶");
gotoxy(0,N+2);
return 0;
}
if((fp = fopen("C:\\tcs.txt","w+")) == NULL)
{
printf("文件不能打開\n");
exit(0);
}
if(fputc(--score[0],fp)==EOF)
printf("輸出失敗\n");
gotoxy(10,10);
color(12);
puts("恭喜您打破記錄");
gotoxy(0,N+2);
return 0;
}

void Free(char **snake, int len) //釋放空間
{
int i;
for (i = 0; i < len; ++i)
free(snake[i]);
free(snake);
}

int main(void)
{
int len;
char ch = 'g';
char a[N+2][N+2] = {{0}};
char **snake;
srand((unsigned)time(NULL));
color(11);
File_in();
init(a, &snake, &len);
Manual();
while (ch != 0x1B) // 按 ESC 結束
{
Draw(snake, len);
if (!apple[2]) {
apple[0] = rand()%N + 1;
apple[1] = rand()%N + 1;
apple[2] = 1;
num++;
if(num>8)
num=0;
}
Sleep(200-score[3]*10);
setbuf(stdin, NULL);
if (kbhit())
{
gotoxy(0, N+2);
ch = getche();
}
snake = Move(snake, ch, &len);
if (Block(snake[0])==1)
{
gotoxy(N+2, N+2);
puts("你輸了");
File_out();
Free(snake, len);
getche();
exit(0);
}
}
Free(snake, len);
exit(0);
}

追問

這個在DEV可以編譯,但打字出來文件不能打開
而且我想只用三個庫文件

最后一次編輯時間 推薦于2017-09-16 17:48:18
小燕子非非
小燕子非非


小燕子非非:c語言貪吃蛇的速度控制程序怎么編

麻煩快些給我答案,謝謝了
下面的解答已被3985人點贊

  1. 可以Sleep函數設置延時來控制貪吃蛇的速度。

    函數名: Sleep
    功 能: 執行掛起一段時間
    用 法: void Sleep(DWORD dwMilliseconds);
    在VC中使用帶上頭文件
    #include <windows.h>
    ( Sleep函數存放頭文件:WinBase.h)
    在gcc編譯器中,使用的頭文件因gcc版本的不同而不同
    #include <unistd.h>
    Sleep()單位為毫秒,sleep()單位為秒(如果需要更精確可以用usleep單位為微秒)
    返回值
    若進程/線程掛起到參數所指定的時間則返回0,若有信號中斷則返回剩余秒數。

  2. 例程:

    / *--------------------snake.h --------------------*/
    #ifndef SNAKE_H
    #define SNAKE_H
     
    #define LEFT 'a'
    #define RIGHT 'd'
    #define DOWN 's'
    #define UP 'w'
    #define ESC 27
     
    #define N 200               /*蛇的最大長度*/
     
    char key;                   /*控制按鍵*/
     
    struct Food
    {
         int x;                   /*食物的橫坐標*/
         int y;                   /*食物的縱坐標*/
         int yes;                 /*判斷是否要出現食物的變量*/
    }food;                        /*食物的結構體*/
     
    struct Snake
    {
         int x[N];
         int y[N];
         int node;                /*蛇的節數*/
         int direction;           /*蛇移動方向*/
         int life;                /* 蛇的生命,0活著,1死亡*/
    }snake;
    #endif



    / *--------------------snake.c --------------------*/
    #include <graphics.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <time.h>
    #include <stdio.h>
    #include "snake.h"
     
    int score = 0;
    int gamespeed = 100;                //蛇運行速度
     
    static void Init(void);             /*圖形驅動*/
    static void Close(void);            /*圖形結束*/
    static void Game_interface(void);   /*游戲界面*/
    static void GameOver(void);         /*結束游戲*/
    static void GamePlay(void);         /*游戲過程*/
    static void PrScore(void);          /*輸出成績*/
     
    /*主函數*/
    int main(void)
    {
         Init();                
         Game_interface();                
         GamePlay();             
         Close();                
         return 0;
    }
     
    /*圖形驅動*/
    static void Init(void)
    {
        int gd=9,gm=2;
     
        initgraph(&gd,&gm," ");
        cleardevice();
    }
     
    /* 開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍墻 */
    static void Game_interface(void)
    {
         int i;
     
         setcolor(LIGHTCYAN);                           /*setbkcolor(LIGHTGREEN);*/
         setlinestyle(PS_SOLID,0,1);                    /*設置線型*/
         for(i=50;i<=600;i+=10)                          /*畫邊框*/
         {
             rectangle(i,40,i+10,49);                   /*上邊框*/
             rectangle(i,451,i+10,460);                 /*下邊框*/
         }
         for(i=40;i<=450;i+=10)
         {
             rectangle(50,i,59,i+10);                   /*左邊框*/
             rectangle(601,i,610,i+10);                 /*右邊框*/
         }
    }
     
    /* 游戲主函數 */
    static void GamePlay(void)
    {
         int i;
          
         srand(time(NULL));                             /*隨機數發生器*/
         food.yes = 1;                                  /*1表示需要出現新食物,0表示已經存在食物*/
         snake.life = 0;                                /*活著*/
         snake.direction = 1;                           /*方向往右*/
         snake.x[0] = 100;
         snake.y[0] = 100;                             
         snake.x[1] = 110;
         snake.y[1] = 100;
         snake.node = 2;                                /*節數*/
     
         PrScore();                                     /*輸出得分*/
         while(1)                                       /*可以重復玩游戲,壓ESC鍵結束*/
         {
             while( !kbhit() )                          /*在沒有按鍵的情況下,蛇自己移動*/
             {
                 if(food.yes == 1)                      /*需要出現新食物*/
                 {
                     food.x = rand()%400 + 60;
                     food.y = rand()%350 + 60;
                     while(food.x%10 != 0)              /*食物隨機出現后必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
                         food.x++;
                     while(food.y%10 != 0)
                         food.y++;
                     food.yes = 0;                      /*畫面上有食物了*/
                 }
                 if(food.yes == 0)                      /*畫面上有食物了就要顯示*/
                 {
                     setcolor(GREEN);
                     rectangle(food.x,food.y,food.x + 10,food.y - 10);
                 }
     
     
                 for(i=snake.node-1;i>0;i--)          /*蛇的每個環節往前移動,也就是貪吃蛇的關鍵算法*/
                 {
                     snake.x[i] = snake.x[i-1];
                     snake.y[i] = snake.y[i-1];
                 }
                 /*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
                 switch(snake.direction)
                 {
                     case 1:
                         snake.x[0] += 10;
                         break;
                     case 2:
                         snake.x[0] -= 10;
                         break;
                     case 3:
                         snake.y[0] -= 10;
                         break;
                     case 4:
                         snake.y[0] += 10;
                         break;
                 }
                 /* 從蛇的第四節開始判斷是否撞到自己 */
                 for(i=3;i<snake.node;i++)
                 {
                     if((snake.x[i] == snake.x[0]) && (snake.y[i] == snake.y[0]))
                     {
                         GameOver();                  /*顯示失敗*/
                         snake.life = 1;
                         break;
                     }
                 }
                 if((snake.x[0] < 55) || (snake.x[0] > 595) || (snake.y[0] < 55) || (snake.y[0] > 455))     /*蛇是否撞到墻壁*/
                 {
     
     
                     GameOver();                                            /*本次游戲結束*/
                     snake.life = 1;                                        /*蛇死*/
                 }
                 if(snake.life == 1)                                        /*以上兩種判斷以后,如果蛇死就跳出內循環,重新開始*/
                     break;
                 if((snake.x[0] == food.x) && (snake.y[0] == food.y))       /*吃到食物以后*/
                 {
                     setcolor(BLACK);                                       /*把畫面上的食物東西去掉*/
                     rectangle(food.x,food.y,food.x+10,food.y-10);
                     snake.x[snake.node] = -20;
                     snake.y[snake.node] = -20;
     
                     /* 新的一節先放在看不見的位置,下次循環就取前一節的位置 */
     
                     snake.node++;                      /*蛇的身體長一節*/
                     food.yes = 1;                      /*畫面上需要出現新的食物*/
                     score += 10;
                     PrScore();                         /*輸出新得分*/
                 }
                 setcolor(RED);                         /*畫出蛇*/
     
     
                 for(i=0;i<snake.node;i++)
                     rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
                 Sleep(gamespeed);                        /*用延遲控制貪吃蛇速度*/                
                 setcolor(BLACK);                        /*用黑色去除蛇的的最后一節*/
                 rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
                           snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
             }        /*endwhile(!kbhit)*/
              
             if(snake.life == 1)                        /*如果蛇死就跳出循環*/
                 break;
              
             key=getch();                          /*接收按鍵*/
             if (key == ESC) break;                  /*按ESC鍵退出*/
              
             switch(key)
             {                                
                 case UP:
                     if(snake.direction != 4)           /*判斷是否往相反的方向移動*/
                         snake.direction = 3;
                     break;
                 case RIGHT:
                     if(snake.direction != 2)
                         snake.direction = 1;
                     break;
                 case LEFT:
                     if(snake.direction != 1)
                         snake.direction = 2;
                     break;
                 case DOWN:
                     if(snake.direction != 3)
                         snake.direction = 4;
                     break;
             }
     
         }/*endwhile(1)*/
    }
     
    /*游戲結束*/
    static void GameOver(void)
    {
         cleardevice();
         PrScore();
         setcolor(RED);
         setfont(56,0,"黑體");
         outtextxy(200,200,"GAME OVER");
         getch();
    }
     
    /*輸出成績*/
    static void PrScore(void)
    {
         char str[10];
     
         setfillstyle(YELLOW);
         bar(50,15,220,35);
         setcolor(BROWN);
         setfont(16,0,"宋體");
         sprintf(str,"score:%d",score);
         outtextxy(55,16,str);
    }
     
    static void Close(void)
    {
         closegraph();
    }

最后一次編輯時間 推薦于2017-09-01 20:05:54
j78903
j78903


j78903:c語言貪吃蛇源代碼怎么用?

下面的解答已被1144人點贊

    C語言貪吃蛇源代碼必須經過相應的C/C++編譯器編譯成EXE文件后才能運行。

    由于我們通常使用的操作系統是Windows系統,而在該系統下最長用的C/C++編譯器是VC++編譯器,目前在大專院校常用的版本還是VC++6.0

   下面就以VC++6.0來說明編譯過程:

1.在VC++6.0中通過“File”菜單下的 “Open”子菜單打開貪吃蛇代碼

 

2.在VC++6.0中通過“Build”菜單下的 “Compile xxxx.xx”子菜單編譯貪吃蛇代碼

 

3.在VC++6.0中通過“Build”菜單下的 “Execute xxxx.exe”子菜單運行貪吃蛇程序

 

 

    附:在VC++6環境下可運行的C/C++貪吃蛇源代碼(無版權,自己編寫,歡迎任意修改拷貝)

/*
C/C++貪吃蛇游戲,zjlj,2015.3.16
*/
#define DEBUG 0 //當程序在調試階段時 DEBUG為 1
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
void readini(FILE **fphead, int *score, char *argv[]) //創建或打開一個和運行文件對應的ini文件,讀取最高紀錄
{
 char filename[200],*pfilename;
 int flag=-1,i;
    
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
 
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "rb+"))==NULL)
 {
        if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
  {
    printf("無法創建或打開\"%s\"文件\n",pfilename);
    system("pause");
       exit(0);
  }
    }
 else
 {
  fread(score,sizeof(int),1,*fphead);
 }
}
void writeini(FILE **fphead, int *score, char *argv[])  //打開一個和運行文件對應的ini文件,寫入最高紀錄
{
 char filename[200],*pfilename;
 int flag=-1,i;
   
    strcpy(filename,argv[0]);
    for(i=0;filename[i]!='\0';i++)
 {
  if ('.'==filename[i])flag=1;
 }
 
 if(1==flag)
 {
 filename[i-1]='i';
    filename[i-2]='n';
 filename[i-3]='i';
 }
 else
 {
  filename[i]='.';
 filename[i+1]='i';
 filename[i+2]='n';
    filename[i+3]='i';
    filename[i+4]='\0';
 }
 for(;filename[i]!='\\'&&i>=0;i--)pfilename=&filename[i];
    if ( (*fphead=fopen(pfilename, "wb+"))==NULL)
 {
          printf("無法寫入\"%s\"文件,磁盤寫保護!\n",pfilename);
    system("pause");
       exit(0);
 }
 else
 {
  rewind(*fphead);
  fwrite(score,sizeof(int),1,*fphead);
  fclose(*fphead);
 }
}
void gotoxy(int x,int y)//光標定位,光標定位函數SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORD pos;
pos.X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//顏色函數
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}

void Refresh(int q[][22], int grade, int gamespeed, int length,int score) //  輸出貪吃蛇棋盤
{
 int i,j;
 for(i=0;i<22;i++)
 {
  for(j=0;j<22;j++)
  {
   if(q[i][j]==0)//輸出棋盤空白
   {
    gotoxy(i,j);
    color(11);
    cout<<"■";
   }
   if(q[i][j]==1||q[i][j]==2)//輸出棋盤墻壁
   {  
    gotoxy(i,j);
    color(11);
    cout<<"□";
   }
   if(q[i][j]==3)//輸出蛇頭
   {  
    gotoxy(i,j);
    color(14);
    cout<<"★";
   }
   if(q[i][j]==4)//輸出蛇身
   {  
    gotoxy(i,j);
    color(12);
    cout<<"◆";
   }
     if(q[i][j]==5)//輸出果子
   {  
    gotoxy(i,j);
    color(12);
    cout<<"●";
   }
  }
  if(i==0) cout << "\t***********************";
  if(i==1) cout << "\t等級為:" << grade;//顯示等級
  if(i==3) cout << "\t自動前進時間";
  if(i==4) cout << "\t間隔為:" << gamespeed << "ms";//顯示時間
     if(i==6) cout << "\t歷史最高分為:" << score << "分";
  if(i==7) cout << "\t你現在得分為:" << (length+(grade-1)*8)*10 << "分";
  if(i==8) cout << "\t**********************";
     if(i==9) cout << "\t游戲說明:";
     if(i==10) cout << "\t(1)用小鍵盤方向鍵控制";
  if(i==11) cout << "\t蛇頭運動方向;";
  if(i==12) cout << "\t(2)蛇每吃一個果子蛇身";
  if(i==13) cout << "\t增加一節;";
  if(i==14) cout << "\t(3)蛇咬到自己或碰到墻";
  if(i==15) cout << "\t壁游戲結束。";
  if(i==18) cout << "\t**********************";
     if(i==19) cout << "\tC/C++語言作業:";
     if(i==20) cout << "\tzjlj,2015.03.16 ";
 }
}
 
int main(int argc, char *argv[]){
    int tcsQipan[22][22];     //  貪吃蛇棋盤是一個二維數組(如22*22,包括墻壁)
    int i,j,score,directiontemp;
 FILE  *fpini;//*fpini 信息文件
 readini(&fpini, &score, argv);//讀取ini文件的最高紀錄
 if (score<0)//最高成績小于零設置為零,初建文件會是負數
  score=0;
 while(1)
 {
  for(i=1;i<=20;i++)
   for(j=1;j<=20;j++)
    tcsQipan[i][j]=0;    //貪吃蛇棋盤相應坐標標上中間空白部分的標志0
  for(i=0;i<=21;i++)
   tcsQipan[0][i] = tcsQipan[21][i] = 1;      //貪吃蛇棋盤相應坐標標上上下墻壁的標志1
  for(i=1;i<=20;i++)
   tcsQipan[i][0] = tcsQipan[i][21] = 2;      //貪吃蛇棋盤相應坐標標上左右墻壁的標志2
  int tcsZuobiao[2][500];     //蛇的坐標數組
  for(i=0; i<4; i++)
  {
   tcsZuobiao[0][i] = 1;//蛇身和蛇頭的x坐標
   tcsZuobiao[1][i] = i + 1;//蛇身和蛇頭的y坐標
  }
  int head = 3,tail = 0;//標示蛇頭和蛇尾的數組偏移量
  for(i=1;i<=3;i++)
   tcsQipan[1][i]=4;    //蛇身
  tcsQipan[1][4]=3;       //蛇頭
  int x1, y1;           // 隨機出果子
  srand(time(0));//設置隨機種子
  do
  {
   x1=rand()%20+1;
   y1=rand()%20+1;
  }
  while(tcsQipan[x1][y1]!=0);//如果不是在空白處重新出果子
  tcsQipan[x1][y1]=5;//貪吃蛇棋盤相應坐標標上果子的標志5
  color(12);
  cout<<"\n\n\t\t\t\t貪吃蛇游戲即將開始 !"<<endl;//準備開始
  long start,starttemp;
  int grade = 1, length = 4;  //設置初始等級和蛇的初始長度
  int gamespeed = 500;  //設置初始前進時間間隔
  for(i=3;i>=0;i--)
  {
   start=clock();
   while(clock()-start<=1000);
   system("cls");
   if(i>0)
    cout << "\n\n\t\t\t\t進入倒計時:" << i << endl;  //倒計時顯示
   else
    Refresh(tcsQipan,grade,gamespeed,length,score);  //初始棋盤顯示
  }
  int timeover=1,otherkey=1;//初始化超時時間和按鍵判斷參數
  char direction = 77;  // 設置初始情況下,向右運動
  int x=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇頭坐標到x,y變量
  while(1)//運行一局游戲
  {
   start = clock();
   while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有鍵按下或時間超過自動前進時間間隔則終止循環
   if(direction==72||direction==80||direction==75 ||direction==77)
   directiontemp=direction;//保留上一次方向按鍵
            //starttemp=gamespeed+start-starttemp;//保留停留時間
   if(timeover)
   {
    #if (DEBUG==1)
    direction = getch();//調試代碼
             #else
    if((direction =getch())==-32)
     direction = getch();
       #endif
   }
             #if (DEBUG==1)//調試代碼
       start=clock();
    while(clock()-start<=2000);
    gotoxy(24,4);
    cout << "\t按鍵ASCII代碼"<<(int)direction<<"    "<<endl;
             #endif
    if(!(direction==72||direction==80||direction==75 ||direction==77))
    {   
     otherkey=0;//  按鍵非方向鍵,otherkey設置為0
    }
    else
    {
     otherkey=1;//  按鍵為方向鍵,otherkey設置為1
    }
             if(direction==72 && directiontemp==80)//忽略反方向按鍵
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==80 && directiontemp==72)
   {
        direction=32;//設置按鍵為非方向鍵
      otherkey=0;//  按鍵為非方向鍵,otherkey設置為0
                // start = clock();
       //while(clock()-start<=starttemp);//補償等待時間
    }
    else if(direction==75 && directiontemp==77)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    else if(direction==77 && directiontemp==75)
    {
        direction=32;
     otherkey=0;
                 //start = clock();
        //while(clock()-start<=starttemp);
    }
    
    
    switch(direction)//判斷方向鍵
    {
     case 72: x= tcsZuobiao[0][head]-1; y= tcsZuobiao[1][head];break;      // 向上
     case 80: x= tcsZuobiao[0][head]+1; y= tcsZuobiao[1][head];break;      // 向下
     case 75: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]-1;break;      // 向左
     case 77: x= tcsZuobiao[0][head]; y= tcsZuobiao[1][head]+1;break;      // 向右
     default: break;
    }
   
 
    if(x==0 || x==21 ||y==0 || y==21)      // 蛇頭碰到墻壁,結束本局游戲
    {  
     gotoxy(22,12);
     cout << "\t游戲已結束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判斷是否破記錄
     {
      gotoxy(10,7);
      color(12);
      cout << "闖關失敗 加油耶!" << endl;
      fclose(fpini);//關閉ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破記錄" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//寫入ini文件的最高紀錄
     }
     gotoxy(23,12);
        cout << "按回車鍵重新開始,按ESC退出游戲" << endl;//顯示的提示
     break;//退出該局游戲
    }
    if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3) //   蛇頭碰到蛇身,結束本局游戲
    {
     gotoxy(22,12);
     cout << "\t游戲已結束!" << endl;
     if(score>=(length+(grade-1)*8)*10)//判斷是否破記錄
     {
      gotoxy(10,7);
      color(12);
      cout << "闖關失敗 加油耶!" << endl;
      fclose(fpini);//關閉ini文件
     }
     else
     {
      gotoxy(10,7);
      color(12);
      cout << "恭喜您打破記錄" << endl;
      score=(length+(grade-1)*8)*10;
      writeini(&fpini, &score, argv);//寫入ini文件的最高紀錄
     }
     gotoxy(23,12);
     cout << "按回車鍵重新開始,按ESC退出游戲" << endl;//顯示的提示
     break;//退出該局游戲
    }
    /*
    游戲運行時的核心算法開始
    */
    if(x==x1 && y==y1) //  吃果子,長度加1
    {   
     length ++;
     if(length>=8)//長度大于等于8重新計算長度,等級加1
     {
      length -= 8;//重新計算長度
      grade ++;//等級加1
      if(gamespeed>50)//控制最快速度為50
       gamespeed = 550 - grade * 50; // 改變自動前進時間間隔
     }
     tcsQipan[x][y]= 3;//貪吃蛇棋盤相應坐標現在蛇頭標志改為蛇頭標志3
     tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]] = 4;//貪吃蛇棋盤相應坐標原來蛇頭標志改為蛇身標志4
     head = (head+1)%400;//防止數組越界
     tcsZuobiao[0][head] = x;//蛇頭的x坐標
     tcsZuobiao[1][head] = y;//蛇頭的y坐標
     do//隨機出果子
     {
      x1=rand()%20+1;
      y1=rand()%20+1;
     }
     while(tcsQipan[x1][y1]!=0);//如果不是在空白處重新出果子
     tcsQipan[x1][y1]=5;//貪吃蛇棋盤相應坐標標上果子的標志5
     gotoxy(22,12);
     cout << "\t游戲進行中!" << endl;
     Refresh(tcsQipan,grade,gamespeed,length,score);
    }
    else  //  不吃果子
    {  
     if(otherkey)
     {
      tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
      tail=(tail+1)%400;//防止數組越界
      tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
      head=(head+1)%400;//防止數組越界
      tcsZuobiao[0][head]=x;//蛇頭的x坐標
      tcsZuobiao[1][head]=y;//蛇頭的y坐標
      tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
      gotoxy(22,12);
      cout << "\t游戲進行中!" << endl;
      Refresh(tcsQipan,grade,gamespeed,length,score);
     }
     else
     {
      gotoxy(22,12);
      cout << "\t游戲暫停中!" << endl;
     }
    }
    /*
    游戲運行時的核心算法結束
    */
       }
    while(1)
    {
     while(!kbhit());
     if((direction =getch())==13)//按回車鍵開始下一局
      break;
     if(direction ==27)//按ESC退出游戲
      exit(0);
    }
       system("cls");//清除屏幕重新開始
 }
 return 0;
}

最后一次編輯時間 推薦于2017-09-10 07:05:52
金蟾捕鱼单机下载