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

C++控制臺循環(huán)鏈表實現(xiàn)貪吃蛇

 更新時間:2020年04月28日 09:55:55   作者:PPPeyton  
這篇文章主要為大家詳細(xì)介紹了C++控制臺循環(huán)鏈表實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++控制臺循環(huán)鏈表實現(xiàn)貪吃蛇的具體代碼,供大家參考,具體內(nèi)容如下

-stdafx.h 為了簡化程序定義一些宏和全局變量

#ifndef __STDAFX_H__
#define __STDAFX_H__
 
// ============上下左右=============
const int UP = 72;
const int DOWN = 80;
const int LEFT = 75;
const int RIGHT = 77;
 
// ==============寬高===============
#define HEIGHT 20
#define WIDTH 39
 
// ==============輸出===============
#define cout_food std::cout<<"*"
#define cout_snake std::cout<<"■"
#define cout_space std::cout << " "
#define cout_snake_xy(x,y) SnakeUI::gotoXY(x,y);cout_snake
#define cout_food_xy(x,y) SnakeUI::gotoXY(x,y);cout_food
#define cout_space_xy(x,y) SnakeUI::gotoXY(x,y);cout_space
 
// =============結(jié)束?==============
#define OVER false
#define RUN true
 
#endif

-SnakeUI.h 

主要是初始化UI,初始化蛇,還有生產(chǎn)食物,判斷食物和蛇有沒有相撞,還有對界面的一些操作

#ifndef __SNAKE_UI_H__
#define __SNAKE_UI_H__
 
#include <iostream>
#include <Windows.h>
#include "Snake.h"
 
struct Food {
 int x;
 int y;
};
 
class SnakeUI {
public:
 static void initUI();
 static void initSnake();
 static void gotoXY(int x, int y);
 
 static void productFood(Snake& snake);
 static bool meetWithFood(int x, int y);
 
private:
 static Food food;
 
};
 
 
#endif

-SnakeUI.cpp

#include "stdafx.h"
#include "SnakeUI.h"
#include <ctime>
using namespace std;
 
Food SnakeUI::food = { 0, 0 };
 
// init UI
void SnakeUI::initUI() {
 cout << "┏";
 for (int i = 1; i < WIDTH; ++i) cout << "━"; 
 cout << "┓";
 gotoXY(0, HEIGHT);
 cout << "┗";
 for (int i = 1; i < WIDTH; ++i) cout << "━"; 
 cout << "┛";
 for (int y = 1; y < HEIGHT; ++y) {
 gotoXY(0, y); cout << "┃";
 gotoXY(WIDTH, y); cout << "┃";
 }
}
 
// init snake: three points
void SnakeUI::initSnake() {
 gotoXY(2, 10); cout_snake;
 gotoXY(3, 10); cout_snake;
 gotoXY(4, 10); cout_snake;
}
 
// goto point(x, y) in console
void SnakeUI::gotoXY(int x, int y) {
 COORD coord = { x * 2, y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
 
// random product food
void SnakeUI::productFood(Snake& snake) {
 srand((unsigned)time(NULL));
 int x, y; // x from 1 to 38, y from 1 to 19
 bool productOK;
 for (;;) {
 productOK = true;
 x = rand() % 38 + 1;
 y = rand() % 19 + 1;
 // 不和蛇身碰撞1->檢查身體和尾部
 for (SnakeNode* sn = snake.last; sn != snake.first; sn = sn->prev) {
  if (sn->x == x && sn->y == y) {
  productOK = false;
  break;
  }
 }
 // 不和蛇身碰撞2->檢查頭部
 if (x == snake.first->x && y == snake.first->y)
  productOK = false;
 
 if (productOK)
  break;
 }
 food.x = x; 
 food.y = y;
 cout_food_xy(food.x, food.y);
}
 
// is snake's head meet with food?
bool SnakeUI::meetWithFood(int x, int y) {
 return (food.x == x && food.y == y);
}

-Snake.h
蛇類,蛇的移動和狀態(tài)

#ifndef __SNAKE_H__
#define __SNAKE_H__
 
struct SnakeNode {
 int x;
 int y;
 SnakeNode* prev;
 SnakeNode(int x_t, int y_t){ x = x_t; y = y_t; }
 SnakeNode(){}
};
 
class Snake {
 friend class SnakeUI;
 
public:
 Snake();
 ~Snake();
 bool snakeMove(char& dir);
 
private:
 void getKey(char& dir);
 
private:
 SnakeNode* first;
 SnakeNode* last;
 char state;
};
 
#endif

-Snake.cpp

#include "stdafx.h"
#include "Snake.h"
#include "SnakeUI.h"
 
Snake::Snake() {
 // 狀態(tài):向右
 state = RIGHT;
 // 創(chuàng)建循環(huán)鏈表
 first = new SnakeNode(4, 10);
 last = new SnakeNode(2, 10);
 last->prev = new SnakeNode(3, 10);
 last->prev->prev = first;
 first->prev = last;
 // UI
 SnakeUI::initSnake();
 SnakeUI::productFood(*this);
}
 
Snake::~Snake() {
 SnakeNode* tmp = last;
 while (last != last) {
 last = last->prev;
 delete tmp;
 tmp = last;
 }
 delete last;
}
 
bool Snake::snakeMove(char& dir) {
 int x = first->x;
 int y = first->y;
 getKey(dir);
 // 撞墻->Game Over
 switch (state)
 {
 case UP: --y; if (y == 0) return OVER; break;
 case DOWN: ++y; if (y == HEIGHT) return OVER; break;
 case LEFT: --x; if (x == 0) return OVER; break;
 case RIGHT: ++x; if (x == WIDTH) return OVER; break;
 }
 
 // 撞到了自己
 SnakeNode* tmp = last;
 for (; tmp != first; tmp = tmp->prev) {
 if (first->x == tmp->x && first->y == tmp->y)
  return OVER;
 }
 
 // 吃食物
 if (SnakeUI::meetWithFood(x, y)) {
 SnakeNode* newHead = new SnakeNode(x, y);
 first->prev = newHead;
 newHead->prev = last;
 first = newHead;
 cout_snake_xy(x, y);
 SnakeUI::productFood(*this);
 }
 else {
 cout_space_xy(last->x, last->y);
 last->x = x;
 last->y = y;
 first = last;
 last = last->prev;
 cout_snake_xy(x, y);
 }
 
 return RUN;
}
 
void Snake::getKey(char& dir) {
 switch (dir)
 {
 case UP: if (state == LEFT || state == RIGHT) state = UP; return;
 case DOWN: if (state == LEFT || state == RIGHT) state = DOWN; return;
 case LEFT: if (state == UP || state == DOWN) state = LEFT; return;
 case RIGHT: if (state == UP || state == DOWN) state = RIGHT; return;
 }
}

-main.cpp

#include "stdafx.h"
#include "SnakeUI.h"
#include "Snake.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
DWORD WINAPI ThreadProc1(LPVOID lpParameter);
 
char dir = RIGHT;
 
int main()
{
 SnakeUI::initUI();
 Snake snake;
 
 CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
 while (snake.snakeMove(dir)) Sleep(100);
 
 system("pause");
 return 0;
}
 
 
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
 for (;;) {
 dir = _getch();
 }
 return 1;
 
}

關(guān)于C++小游戲的更多精彩內(nèi)容請點擊專題: 《C++經(jīng)典小游戲》 學(xué)習(xí)了解

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

相關(guān)文章

  • C++中vector的用法實例解析

    C++中vector的用法實例解析

    這篇文章主要介紹了C++中vector的用法,詳細(xì)描述了vector的各種常見的用法及注意事項,需要的朋友可以參考下
    2014-08-08
  • C++語法中的函數(shù)重載和默認(rèn)參數(shù)

    C++語法中的函數(shù)重載和默認(rèn)參數(shù)

    這篇文章主要介紹了C++語法中的函數(shù)重載和默認(rèn)參數(shù),本文從語法角度通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C++中的自定義函數(shù)返回類型

    C++中的自定義函數(shù)返回類型

    這篇文章主要介紹了C++中的自定義函數(shù)返回類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解C++編程中的嵌套類的聲明與其中的函數(shù)使用

    詳解C++編程中的嵌套類的聲明與其中的函數(shù)使用

    這篇文章主要介紹了C++編程中的嵌套類的聲明與其中的函數(shù)使用,嵌套類即在一個類的范圍內(nèi)聲明和編寫另一個類,需要的朋友可以參考下
    2016-01-01
  • C或C++報錯:ld returned 1 exit status報錯的原因及解決方法

    C或C++報錯:ld returned 1 exit status報錯的原因及解

    這篇文章主要介紹了C或C++報錯:ld returned 1 exit status報錯的原因及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Opencv實現(xiàn)圖像灰度線性變換

    Opencv實現(xiàn)圖像灰度線性變換

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)圖像灰度線性變換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Ubuntu20.04安裝使用jsoncpp、json-c庫的方法實例

    Ubuntu20.04安裝使用jsoncpp、json-c庫的方法實例

    這篇文章主要給大家介紹了關(guān)于Ubuntu20.04安裝使用jsoncpp、json-c庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作就有一定的參考借鑒價值,需要的朋友可以參考下
    2024-04-04
  • C語言讀取文件流的相關(guān)函數(shù)用法簡介

    C語言讀取文件流的相關(guān)函數(shù)用法簡介

    這篇文章主要介紹了C語言讀取文件流的相關(guān)函數(shù)用法簡介,包括fread()函數(shù)和feof()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++實現(xiàn)藍橋杯競賽題目---搭積木

    C++實現(xiàn)藍橋杯競賽題目---搭積木

    這篇文章主要介紹了C++實現(xiàn)藍橋杯競賽題目---搭積木,本篇文章通過題目分析列舉公式進行分析算法,包含詳細(xì)的圖文,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ Boost Flyweight庫使用介紹

    C++ Boost Flyweight庫使用介紹

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-12-12

最新評論

怀宁县| 民乐县| 封开县| 满城县| 巴马| 万荣县| 蒙自县| 龙江县| 叶城县| 大方县| 庆阳市| 安陆市| 广饶县| 齐河县| 仲巴县| 谢通门县| 抚松县| 内江市| 承德县| 布尔津县| 资阳市| 文昌市| 武山县| 和政县| 茂名市| 夏河县| 东乡县| 河池市| 绩溪县| 沾化县| 家居| 安图县| 斗六市| 怀仁县| 武宣县| 六枝特区| 台北县| 平塘县| 阳曲县| 象山县| 南华县|