欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

C語(yǔ)言貪吃蛇經(jīng)典小游戲

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

一、貪吃蛇小游戲簡(jiǎn)介:

        用上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會(huì)越吃越長(zhǎng),身子越長(zhǎng)玩的難度就越大,不能碰墻,也不能咬到自己的身體,等到了一定的分?jǐn)?shù),就能過關(guān)。 

二、函數(shù)框架

三、數(shù)據(jù)結(jié)構(gòu)

typedef struct Snake 
{ 
  size_t x; //行 
  size_t y; //列 
  struct Snake* next; 
}Snake, *pSnake; 

定義蛇的結(jié)構(gòu)體,利用單鏈表來表示蛇,每個(gè)結(jié)點(diǎn)為蛇身體的一部分。 

四、代碼實(shí)現(xiàn)(vs2010  c語(yǔ)言)

1.Snake.h

#ifndef __SNAKE_H__ 
#define __SNAKE_H__ 
 
#include <stdio.h> 
#include <stdlib.h> 
#include <Windows.h> 
#include <time.h> 
#include <malloc.h> 
#include <assert.h> 
//標(biāo)識(shí)地圖大小 
#define ROW_MAP 10  //地圖的行 
#define COL_MAP 20  //地圖的列 
#define SUCCESS_SCORE 10//通關(guān)分?jǐn)?shù) 
enum Direction //蛇行走的方向 
{ 
  R, //右 
  L, //左 
  U, //上 
  D //下 
}Direction; 
 
enum State 
{ 
  ERROR_SELF, //咬到自己 
  ERROR_WALL, //撞到墻 
  NORMAL,   //正常狀態(tài) 
  SUCCESS   //通關(guān) 
}State; 
 
typedef struct Snake 
{ 
  size_t x; //行 
  size_t y; //列 
  struct Snake* next; 
}Snake, *pSnake; 
 
 
void StartGame(); 
void RunGame(); 
void EndGame(); 
 
#endif 

2.Snake.c

#include "Snake.h" 
 
 
pSnake head = NULL; //定義蛇頭指針 
pSnake Food = NULL; //定義食物指針 
 
int sleeptime = 500;//間隔時(shí)間,用來控制速度 
int Score = 0; //總分 
int everyScore = 1; //每步得分 
 
//定義游戲中用到的符號(hào) 
const char food = '#'; 
const char snake = '*'; 
 
void Pos(int x, int y)  //控制輸出光標(biāo) 
{ 
  COORD pos; //pos為結(jié)構(gòu)體 
  pos.X = x; //控制列 
  pos.Y = y; //控制行 
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);//讀取標(biāo)準(zhǔn)輸出句柄來控制光標(biāo)為pos 
} 
 
void Face() 
{ 
  system("color 0C"); 
  printf("*******************************************************\n"); 
  printf("*        Welcome to Snake Game!        *\n"); 
  printf("*                           *\n"); 
  printf("*       ->開始游戲請(qǐng)按 enter鍵         *\n"); 
  printf("*       ->退出游戲請(qǐng)按 esc鍵          *\n"); 
  printf("*       ->暫停游戲請(qǐng)按 space鍵         *\n"); 
  printf("*       ->通過上下左右鍵來控制蛇的移動(dòng)     *\n"); 
  printf("*       ->通過F1鍵減速    F2鍵加速     *\n"); 
  printf("*******************************************************\n"); 
} 
void Map()  //初始化地圖 
{ 
  int i = 0; 
  for(i = 0; i<COL_MAP; i+=2)  //打印上下邊框(每個(gè)■占用兩列) 
  { 
    Pos(i, 0); 
    printf("■"); 
    Pos(i, ROW_MAP-1); 
    printf("■"); 
  } 
  for(i = 0; i<ROW_MAP; i++)  //打印左右邊框 
  { 
    Pos(0, i); 
    printf("■"); 
    Pos(COL_MAP-2, i); 
    printf("■"); 
  } 
} 
void PrintSnake() //打印蛇 
{ 
  pSnake cur = head; 
  while(cur) 
  { 
    Pos(cur->y, cur->x); 
    printf("%c", snake); 
    cur = cur->next; 
  } 
} 
void InitSnake()  //初始化蛇身 
{ 
  int initNum = 3; 
  int i = 0; 
  pSnake cur; 
  head = (pSnake)malloc(sizeof(Snake)); 
  head->x = 5; 
  head->y = 10; 
  head->next = NULL; 
 
  cur = head; 
  for(i = 1; i < initNum; i++) 
  { 
    pSnake newNode = (pSnake)malloc(sizeof(Snake)); 
    newNode->x = 5+i; 
    newNode->y = 10; 
    newNode->next = NULL; 
    cur->next = newNode; 
    cur = cur->next; 
  } 
 
  PrintSnake(); 
} 
 
void CreateFood() //在地圖上隨機(jī)產(chǎn)生一個(gè)食物 
{ 
  pSnake cur = head; 
  Food = (pSnake)malloc(sizeof(Snake)); 
 
  //產(chǎn)生x~y的隨機(jī)數(shù) k=rand()%(Y-X+1)+X; 
  srand((unsigned)time(NULL)); 
  Food->x = rand()%(ROW_MAP-2 - 1 + 1)+1; 
  Food->y = rand()%(COL_MAP-3 - 2 + 1)+2; 
  Food->next = NULL; 
  while(cur)  //檢查食物是否與蛇身重合 
  { 
    if(cur->x == Food->x && cur->y == Food->y) 
    { 
      free(Food); 
      Food = NULL; 
      CreateFood(); 
      return; 
    } 
    cur = cur->next; 
  } 
  Pos(Food->y, Food->x); 
  printf("%c", food); 
} 
 
void StartGame() //游戲開始的所有設(shè)置 
{ 
  Face(); 
  system("pause"); 
 
  if(GetAsyncKeyState(VK_RETURN)) 
  { 
    system("cls"); 
    Pos(COL_MAP+5, 1); 
    printf("當(dāng)前分?jǐn)?shù)/通關(guān)分?jǐn)?shù):"); 
    Pos(COL_MAP+20, 1); 
    printf("%d/%d", Score, SUCCESS_SCORE); 
    Pos(COL_MAP+5, 2); 
    printf("當(dāng)前分每步得分:"); 
    Pos(COL_MAP+20, 2); 
    printf("%d", everyScore); 
    Pos(COL_MAP+5, 3); 
    printf("\n"); 
    Pos(COL_MAP+5, 4); 
    printf("速度越快 得分越高哦!!\n"); 
 
    Map(); 
    InitSnake(); 
    CreateFood(); 
  } 
  else if(GetAsyncKeyState(VK_ESCAPE)) 
  { 
    exit(0); 
  } 
} 
 
int IsCrossWall()       //判斷是否碰到墻 
{ 
  if(head->x <= 0 || head->x >= ROW_MAP-1 
    ||head->y <= 1 || head->y >= COL_MAP-2) 
  { 
    State = ERROR_WALL; 
    return 0; 
  } 
  return 1; 
} 
 
int IsEatSelf(pSnake newHead) //判斷是否咬到自己 
{ 
  pSnake cur = head; 
  assert(newHead); 
  while(cur) 
  { 
    if(cur->x == newHead->x && cur->y == newHead->y) 
    { 
      State = ERROR_SELF; 
      return 0; 
    } 
    cur = cur->next; 
  } 
  return 1; 
} 
 
int IsFood(pSnake pos) //判斷該位置是不是食物 
{ 
  assert(pos); 
  if(pos->x == Food->x && pos->y == Food->y) 
  { 
    return 1; 
  } 
  return 0; 
} 
 
void SnakeMove()  //蛇移動(dòng)一次 
{ 
  pSnake newHead = NULL; 
  newHead = (pSnake)malloc(sizeof(Snake)); 
 
  if(Direction == R) 
  { 
    newHead->x = head->x; 
    newHead->y = head->y+1; 
    newHead->next = head; 
  } 
  else if(Direction == L) 
  { 
    newHead->x = head->x; 
    newHead->y = head->y-1; 
    newHead->next = head; 
  } 
  else if(Direction == U) 
  { 
    newHead->x = head->x-1; 
    newHead->y = head->y; 
    newHead->next = head; 
   
  } 
  else if(Direction == D) 
  { 
    newHead->x = head->x+1; 
    newHead->y = head->y; 
    newHead->next = head; 
  } 
 
  if(IsFood(newHead)) 
  { 
    head = newHead; 
    PrintSnake(); 
    CreateFood(); 
    Score += everyScore; 
    Pos(COL_MAP+20, 1); 
    printf("%d/%d", Score, SUCCESS_SCORE); 
    if(Score >= SUCCESS_SCORE) 
    { 
      State = SUCCESS; 
    } 
  } 
  else  
    { 
      if(IsCrossWall() && IsEatSelf(newHead)) 
      { 
        pSnake cur = NULL; 
        head = newHead; 
        cur = head; 
        //刪除蛇尾并打印 
        while(cur->next->next != NULL) 
        { 
          Pos(cur->y, cur->x); 
          printf("%c", snake); 
          cur = cur->next; 
        } 
         
        Pos(cur->y, cur->x); 
        printf("%c", snake); 
        Pos(cur->next->y, cur->next->x); 
        printf(" "); //打印空格來覆蓋頻幕上的蛇尾 
        free(cur->next); 
        cur->next = NULL; 
      } 
      else 
      { 
        free(newHead); 
        newHead = NULL; 
      } 
  } 
} 
 
void Pause() 
{ 
  while(1) 
  { 
    Sleep(sleeptime); 
    if(GetAsyncKeyState(VK_SPACE)) 
    { 
      break; 
    } 
  } 
} 
 
void ControlSnake() //用鍵盤控制游戲 
{ 
  if(GetAsyncKeyState(VK_UP) && Direction!=D) 
  { 
    Direction = U; 
  } 
  else if(GetAsyncKeyState(VK_DOWN) && Direction!=U) 
  { 
    Direction = D; 
  } 
  else if(GetAsyncKeyState(VK_LEFT) && Direction!=R) 
  { 
    Direction = L; 
  } 
  else if(GetAsyncKeyState(VK_RIGHT) && Direction!=L) 
  { 
    Direction = R; 
  } 
  else if(GetAsyncKeyState(VK_F1)) 
  { 
    if(sleeptime != 500) 
    { 
      sleeptime = 500; 
      everyScore = 1; 
      Pos(COL_MAP+20, 2); 
      printf("%d", everyScore); 
    } 
  } 
  else if(GetAsyncKeyState(VK_F2)) 
  { 
    if(sleeptime != 300) 
    { 
      sleeptime = 300; 
      everyScore = 2; 
      Pos(COL_MAP+20, 2); 
      printf("%d", everyScore); 
    } 
  } 
  else if(GetAsyncKeyState(VK_SPACE)) 
  { 
    Pause(); 
  } 
  else if(GetAsyncKeyState(VK_ESCAPE)) 
  { 
    exit(0); 
  } 
} 
 
void StateGame() //判斷游戲失敗或成功 
{ 
  if(State == ERROR_SELF) 
  { 
    system("cls"); 
    printf("很遺憾,蛇咬到自己,游戲失??!\n"); 
  } 
  else if(State == ERROR_WALL) 
  { 
    system("cls"); 
    printf("很遺憾,蛇碰到墻壁,游戲失??!\n"); 
  } 
  else if(State == SUCCESS) 
  { 
    system("cls"); 
    printf("恭喜您,已通關(guān)?。?!\n"); 
  } 
   
} 
void RunGame() 
{ 
  Direction = R; //蛇初始行走方向?yàn)橛?
  State = NORMAL;//游戲初始為正常狀態(tài) 
  while(1) 
  { 
    ControlSnake(); 
    SnakeMove(); 
    if(State != NORMAL) 
    { 
      StateGame(); 
      break; 
    } 
    Sleep(sleeptime); 
  } 
} 
 
void EndGame() //釋放鏈表并恢復(fù)默認(rèn)值 
{ 
  pSnake cur = head; 
  while(cur) 
  { 
    pSnake del = cur; 
    cur = cur->next; 
    free(del); 
    del = NULL; 
  } 
  head = NULL; 
  if(Food != NULL) 
  { 
    free(Food); 
    Food = NULL; 
  } 
  Score = 0; 
  everyScore = 1; 
  sleeptime = 500; 
} 

3.Test.c

#include "Snake.h" 
 
int main() 
{ 
  while(1) 
  { 
    StartGame(); 
    RunGame(); 
    EndGame(); 
  } 
  system("pause"); 
  return 0; 
} 

五、運(yùn)行界面展示

1.歡迎界面

 

2.游戲界面


小小的c語(yǔ)言項(xiàng)目,用來練手,僅供參考哦!!
謝謝閱讀,如有問題,歡迎提出。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果

欄    目:C語(yǔ)言

下一篇:Opencv使用Stitcher類圖像拼接生成全景圖像

本文標(biāo)題:C語(yǔ)言貪吃蛇經(jīng)典小游戲

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/924.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有