永发信息网

C++编贪吃蛇如何消除尾巴,哪位高手给个算法

答案:2  悬赏:60  手机版
解决时间 2021-02-14 22:35
  • 提问者网友:浪荡绅士
  • 2021-02-14 08:32
C++编贪吃蛇如何消除尾巴,哪位高手给个算法
最佳答案
  • 五星知识达人网友:長槍戰八方
  • 2021-02-14 09:04
能有什么算法列?
这个是设计上的问题
我说说我怎么设计并实现的
用List来存储蛇的每一节
从蛇尾开始,一节节add()
保证最后一节是蛇头
移动的时候的操作是
.add(蛇头)
.removeat(0)把第一个删除,若吃到东西就不删除,这个是逻辑
只有逻辑上的一些判断不存在算法
不明白再 问我就是了
全部回答
  • 1楼网友:人间朝暮
  • 2021-02-14 09:50

#include <stdio.h> #include <stdlib.h> #include <time.h> #include "pcc32.h" #include "jkey32.h"

// 定义地图的尺寸及坐标(均使用双字符长度) #define map_width 24 #define map_height 16 #define map_base_x 3 #define map_base_y 3

// 定义蛇的相关参数 #define snake_min_len 5

// 定义地图块的状态,分别为[空格|蛇头|蛇身|食物] #define bs_space 0 #define bs_shead 1 #define bs_sbody 2 #define bs_stail 3 #define bs_food 4

// 定义各对象的颜色,颜色定义详见[pcc32.h],顺序同上. pccolor mycolors[] = {orange, red_orange, red, light_green, yellow};

// 定义各对象的形状,注意是宽字符[◆◇□●★¤~◎+],顺序同上. char mysharps[][3] = {"□", "◆", "■", "+", "★"};

// 定义蛇的运动方向[上|下|左|右] #define dir_up 1 #define dir_down 2 #define dir_left 3 #define dir_right 4

typedef struct _snakebody { uint8 x, y; }point2d, *ppoint2d;

point2d mysnake[map_width*map_height] = {{0}}; point2d myfood = {0}; int snakelength = 0; int snakedir = dir_right; int isfood = 0; int isover = 0;

void drawmap(void); void initsnake(int len); void drawsnake(void); void movesnake(void); void drawblock(int x, int y, int bs); int isinsnake(int x, int y); void drawfood(void);

int main() { int ispause = 1; setcursorvisible(0); setconsoletitle("snake by redoc. 2009.06.27"); initsnake(snake_min_len); drawmap(); drawsnake(); while (!isover) { if (!ispause) { movesnake(); if (!isfood) drawfood(); } delayms(200 - snakelength*2); if (jkhaskey()) { switch (jkgetkey()) { case jk_up: if (snakedir != dir_down) snakedir = dir_up; break; case jk_down: if (snakedir != dir_up) snakedir = dir_down; break; case jk_left: if (snakedir != dir_right) snakedir = dir_left; break; case jk_right: if (snakedir != dir_left) snakedir = dir_right; break; case jk_esc: case jk_enter: case jk_space: ispause = !ispause; break; default: break; } } } gototextpos(map_base_x + map_width - 7, map_base_y + map_height + 1); printf("game over! score: %d.", snakelength - snake_min_len); getch(); return 0; }

void drawmap(void) { int i, j; settextcolor(mycolors[bs_space]); for (i = 0; i < map_height; i++) { gototextpos(map_base_x*2, map_base_y + i); for (j = 0; j < map_width; j++) { printf("%2s", mysharps[bs_space]); } } }

void initsnake(int len) { int i; for (i = 0; i < len; i++) { mysnake[i].x = 10 - i; mysnake[i].y = 3; } snakelength = len; isover = 0; }

void drawsnake(void) { int i; if (snakelength < snake_min_len) return;

settextcolor(mycolors[bs_shead]); gototextpos((map_base_x + mysnake[0].x)*2, map_base_y + mysnake[0].y); printf(mysharps[bs_shead]);

settextcolor(mycolors[bs_sbody]); for (i = 1; i < snakelength - 1; i++) { gototextpos((map_base_x + mysnake[i].x)*2, map_base_y + mysnake[i].y); printf(mysharps[bs_sbody]); }

settextcolor(mycolors[bs_stail]); gototextpos((map_base_x + mysnake[snakelength-1].x)*2, map_base_y + mysnake[snakelength-1].y); printf(mysharps[bs_stail]);

return; }

void movesnake(void) { int i; int hx = mysnake[0].x; int hy = mysnake[0].y; if (snakelength < snake_min_len) return; switch (snakedir) { case dir_up: hy--; break; case dir_down: hy++; break; case dir_left: hx--; break; case dir_right: hx++; break; default: break; } if (hx < 0 || hx >= map_width || hy < 0 || hy >= map_height || isinsnake(hx, hy)) { isover = 1; return; } if (hx == myfood.x && hy == myfood.y) { snakelength++; isfood = 0; } else drawblock(mysnake[snakelength-1].x, mysnake[snakelength-1].y, bs_space); for (i = snakelength - 1; i >= 0; i--) { mysnake[i+1].x = mysnake[i].x; mysnake[i+1].y = mysnake[i].y; } mysnake[0].x = hx; mysnake[0].y = hy; drawsnake(); return; }

void drawblock(int x, int y, int bs) { if (x < 0 || x >= map_width) return; if (y < 0 || y >= map_height) return; gototextpos((map_base_x + x)*2, map_base_y + y); settextcolor(mycolors[bs]); printf("%2s", mysharps[bs]); return; }

int isinsnake(int x, int y) { int i; for (i = 0; i < snakelength; i++) if (x == mysnake[i].x && y == mysnake[i].y) return 1; return 0; }

void drawfood(void) { srand((uint32)time(null)); do { myfood.x = rand() % map_width; myfood.y = rand() % map_height; } while (isinsnake(myfood.x, myfood.y)); drawblock(myfood.x, myfood.y, bs_food); isfood = 1; }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯