C语言贪吃蛇 第二条蛇吃不到食物 问什么

#include"snake1.h"
int result;

void main()
{
GameInit();
while (1)
{
while (!_kbhit()) //判断键盘是否按下
{
if (food.flag0 == 0 || food.flag1 == 0 || food.flag2 == 0)
{
GetFoodCoor();
}
BeginBatchDraw(); //画布,一批一批的
cleardevice();
SnakeMove();
DrawSnake();
EatFood();
DrawFood();
Sleep(100);
EndBatchDraw();
BreakSnake();
}
ChangeSnake();
}
getchar();
}

//设置背景,初始化小蛇
void GameInit()
{
srand((unsigned int)time(NULL)); //随机数因子

initgraph(WINDOW_LENGTH, WINDOW_WIDTH);         //创建窗口
setbkcolor(BGCOLOR);                //设置背景颜色,set backgrand color
cleardevice();                  //使用设置好的背景颜色

snake1.n = 1;               //初始化蛇的节数为1
snake1.ch = down;           //方向 向下
snake1.SnakeCoor[0].x = 0;      //蛇的坐标
snake1.SnakeCoor[0].y = 0;
rectangle(0, 0, SNAKESIZE, SNAKESIZE);

snake2.n = 1;
snake2.ch = up;
snake2.SnakeCoor[0].x = WINDOW_LENGTH - SNAKESIZE-2;
snake2.SnakeCoor[0].y = WINDOW_WIDTH - SNAKESIZE-2;
rectangle(WINDOW_LENGTH - SNAKESIZE - 2, WINDOW_WIDTH - SNAKESIZE - 2, WINDOW_LENGTH  - 2, WINDOW_WIDTH  - 2);

food.flag0 = 0;     //初始化食物刚开始没有
food.flag1 = 0;
food.flag2 = 0;

}

///动起来
void SnakeMove()
{
for (int i = snake1.n-1; i > 0; i--)
{
//只是使其坐标改变,并未画出蛇
//前一个坐标赋给后一个坐标,蛇头没有被赋值
snake1.SnakeCoor[i].x = snake1.SnakeCoor[i - 1].x;
snake1.SnakeCoor[i].y = snake1.SnakeCoor[i - 1].y;
}

for (int i = snake2.n - 1; i > 0; i--)
{
    //只是使其坐标改变,并未画出蛇
    //前一个坐标赋给后一个坐标,蛇头没有被赋值
    snake2.SnakeCoor[i].x = snake2.SnakeCoor[i - 1].x;
    snake2.SnakeCoor[i].y = snake2.SnakeCoor[i - 1].y;
}

//判断方向,定位蛇头
switch (snake1.ch)
{
case up:
{
           snake1.SnakeCoor[0].y -= SNAKESIZE;
           break;
}
case down:
{
             snake1.SnakeCoor[0].y += SNAKESIZE;
             break;
}
case left:
{
             snake1.SnakeCoor[0].x -= SNAKESIZE;
             break;
}
case right:
{
              snake1.SnakeCoor[0].x += SNAKESIZE;
              break;
}

}


switch (snake2.ch)
{
case up:
{
           snake2.SnakeCoor[0].y -= SNAKESIZE;
           break;
}
case down:
{
             snake2.SnakeCoor[0].y += SNAKESIZE;
             break;
}
case left:
{
             snake2.SnakeCoor[0].x -= SNAKESIZE;
             break;
}
case right:
{
              snake2.SnakeCoor[0].x += SNAKESIZE;
              break;
}

}

}

//画出来蛇
void DrawSnake()
{

for (int i = snake1.n - 1; i >= 0; i--)
{
    rectangle(snake1.SnakeCoor[i].x, snake1.SnakeCoor[i].y,
        snake1.SnakeCoor[i].x + SNAKESIZE, snake1.SnakeCoor[i].y + SNAKESIZE);
}


for (int i = snake2.n - 1; i >= 0; i--)
{
    rectangle(snake2.SnakeCoor[i].x, snake2.SnakeCoor[i].y,
        snake2.SnakeCoor[i].x + SNAKESIZE, snake2.SnakeCoor[i].y + SNAKESIZE);
}

}

//按键控制小蛇
void ChangeSnake()
{
int move1;
move1 = _getch();
switch (move1)
{
case up:
{
if (snake1.ch != down)
{
snake1.ch = up;
break;
}
}
case down:
{
if (snake1.ch != up)
{
snake1.ch = down;
break;
}
}
case left:
{
if (snake1.ch != right)
{
snake1.ch = left;
break;
}
}
case right:
{
if (snake1.ch != left)
{
snake1.ch = right;
break;
}
}

case 'w':
{
           if (snake2.ch != down)
           {
               snake2.ch = up;
               break;
           }
}
case 's':
{
             if (snake2.ch != up)
             {
                 snake2.ch = down;
                 break;
             }
}
case 'a':
{
             if (snake2.ch != right)
             {
                 snake2.ch = left;
                 break;
             }
}
case 'd':
{
              if (snake2.ch != left)
              {
                  snake2.ch = right;
                  break;
              }
}

}

}

//得到食物的坐标
void GetFoodCoor()
{ //出来三个食物
if (food.flag0 == 0)
{
food.FoodCoor[0].x = rand() % (WINDOW_LENGTH / SNAKESIZE) * SNAKESIZE;
food.FoodCoor[0].y = rand() % (WINDOW_WIDTH / SNAKESIZE)*SNAKESIZE;
food.flag0 = 1;
}
if (food.flag1 == 0)
{
food.FoodCoor[1].x = rand() % (WINDOW_LENGTH / SNAKESIZE) * SNAKESIZE;
food.FoodCoor[1].y = rand() % (WINDOW_WIDTH / SNAKESIZE)*SNAKESIZE;
food.flag1 = 1;
}
if (food.flag2 == 0)
{
food.FoodCoor[2].x = rand() % (WINDOW_LENGTH / SNAKESIZE) * SNAKESIZE;
food.FoodCoor[2].y = rand() % (WINDOW_WIDTH / SNAKESIZE)*SNAKESIZE;
food.flag2 = 1;
}
}

//画食物
void DrawFood()
{//根据一个矩形画出一个圆 圆角矩阵
roundrect(food.FoodCoor[0].x, food.FoodCoor[0].y,
food.FoodCoor[0].x + SNAKESIZE, food.FoodCoor[0].y + SNAKESIZE,
SNAKESIZE, SNAKESIZE);
roundrect(food.FoodCoor[1].x, food.FoodCoor[1].y,
food.FoodCoor[1].x + SNAKESIZE, food.FoodCoor[1].y + SNAKESIZE,
SNAKESIZE, SNAKESIZE);
roundrect(food.FoodCoor[2].x, food.FoodCoor[2].y,
food.FoodCoor[2].x + SNAKESIZE, food.FoodCoor[2].y + SNAKESIZE,
SNAKESIZE, SNAKESIZE);
}

//吃食物
void EatFood()
{
if (snake1.SnakeCoor[0].x == food.FoodCoor[0].x&&snake1.SnakeCoor[0].y == food.FoodCoor[0].y)
{
snake1.n++; //节数加1
food.flag0 = 0; //食物被吃掉 标志
}
if (snake2.SnakeCoor[0].x == food.FoodCoor[0].x&&snake2.SnakeCoor[0].y == food.FoodCoor[0].y)
{
snake2.n++; //节数加1
food.flag0 = 0; //食物被吃掉 标志
}
if (snake1.SnakeCoor[0].x == food.FoodCoor[1].x&&snake1.SnakeCoor[0].y == food.FoodCoor[1].y)
{
snake1.n++; //节数加1
food.flag1 = 0; //食物被吃掉 标志
}
if (snake2.SnakeCoor[0].x == food.FoodCoor[1].x&&snake2.SnakeCoor[0].y == food.FoodCoor[1].y)
{
snake2.n++; //节数加1
food.flag1 = 0; //食物被吃掉 标志
}
if (snake1.SnakeCoor[0].x == food.FoodCoor[2].x&&snake1.SnakeCoor[0].y == food.FoodCoor[2].y)
{
snake1.n++; //节数加1
food.flag2 = 0; //食物被吃掉 标志
}
if (snake2.SnakeCoor[0].x == food.FoodCoor[2].x&&snake2.SnakeCoor[0].y == food.FoodCoor[2].y)
{
snake2.n++; //节数加1
food.flag2 = 0; //食物被吃掉 标志
}

}

//碰撞检测
void BreakSnake()
{
//蛇头不能撞墙
if (snake1.SnakeCoor[0].xWINDOW_LENGTH || snake1.SnakeCoor[0].yWINDOW_WIDTH)
{
result = 0;
GameOver();
//玩家2胜
}
if (snake2.SnakeCoor[0].xWINDOW_LENGTH || snake2.SnakeCoor[0].yWINDOW_WIDTH)
{
result = 1;
GameOver();
//玩家1胜
}
//两个蛇不能碰撞在一起,自己的头可以撞自己身子
for (int i = snake1.n - 1; i >= 0; i--)
{
if (snake2.SnakeCoor[0].x == snake1.SnakeCoor[i].x&&snake2.SnakeCoor[0].y == snake1.SnakeCoor[i].y)
{
result = 1;
GameOver();
//玩家1胜
}
}
for (int i = snake2.n - 1; i >= 0; i--)
{
if (snake1.SnakeCoor[0].x == snake2.SnakeCoor[i].x&&snake1.SnakeCoor[0].y == snake2.SnakeCoor[i].y)
{
result = 0;
GameOver();
//玩家2胜
}
}
}

void GameOver()
{
cleardevice();
setcolor(BLACK);
settextstyle(50, 0, L"楷体");
if (result == 1)
{
outtextxy(100, 100, L"玩家一获胜");
}
if (result == 0)
{
outtextxy(100, 100, L"玩家二获胜");
}
_getch();
closegraph();
}

头文件
#pragma once
#include
#include //图形库
#include //随机数
#include
#include
//#DEFINE 不加分号
#define WINDOW_WIDTH 540 //宽
#define WINDOW_LENGTH 940 //长
#define BGCOLOR RGB(120,120,220) //背景颜色
#define SNAKEMAX 100 //蛇最大长度
#define SNAKESIZE 10 //蛇的大小

//枚举 列举一些方向
typedef enum Ch { down=80, up=72, left=75, right=77 }CH;

//蛇的坐标
typedef struct coor
{
int x;
int y;
}COOR;

//设置一条蛇的属性
typedef struct Snake
{
int n; //n节小蛇
COOR SnakeCoor[SNAKEMAX]; //最大长度
CH ch; //蛇的方向

}SNAKE;
SNAKE snake1, snake2; //两条蛇

typedef struct Food
{
COOR FoodCoor[3];
int flag0,flag1,flag2;
}FOOD;
FOOD food;

//函数声明
void GameInit();
void SnakeMove();

void DrawSnake();
void ChangeSnake();
void GetFoodCoor();
void DrawFood();
void EatFood();
void BreakSnake();
void GameOver();

2个回答

知道了,,上面的坐标减了2,整体与食物的坐标不对称了,所以吃不到食物了

你只属于自问自答型的啊,真实鸟大了什么林子都有啊!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言贪吃蛇 请解释问题原因,不要代码
以下是我写的还未完成的贪吃蛇代码,现在的主要问题是//蛇动 这里,代码我都检查几遍了,可是为什么运行的时候蛇还是没有动呢,请哪位大神解释下,万分感谢,请不要给我别的源代码,谢谢! ``` #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define SankeLong 20 #include<windows.h> #include<mmsystem.h> #pragma comment(lib,"winmm.lib") //方向 enum {to_east=2,to_west=-2,to_north=-1,to_south=1}; //蛇数组 int q_arrSanke[SankeLong][3] = {0}; //边框 char q_StrGameBack[20][48] = { "■■■■■■■■■■■■■■■■■■■■■■■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■■■■■■■■■■■■■■■■■■■■■■■\n" }; void StartGame() { printf("\t\t\t 欢迎来到贪吃蛇世界\n\n"); printf("\t\t\t W A S D 控制方向\n"); printf("\t\t\t 按下空格键开始游戏\n"); } void StartMusic() { PlaySound("E:\\茜拉-想你的夜.wav",NULL,SND_FILENAME | SND_ASYNC); } //输入空格切换界面 void ShuSpace() { char c; c = getch(); if (c == ' ') return; else ShuSpace(); } //停止播放音乐 void StopMusic() { PlaySound(NULL, 0, 0); } //游戏边框 void GameBoard() { int i, j; for (i = 0; i < 20; i++) { printf("%s", q_StrGameBack[i]); } } //产生一个随机位置 void SetSankeRandPos() { int mX = -1; int mY = -1; //产生随机数 srand((unsigned int)time(NULL)); mX = rand() % 19 + 1; mY = rand() % 18 + 1; //首次蛇节点 q_arrSanke[0][0] = mY; q_arrSanke[0][1] = mX * 2; q_arrSanke[0][2]= to_west; q_arrSanke[1][0] = mY; q_arrSanke[1][1] = mX * 2+2; q_arrSanke[1][2] = to_west; q_arrSanke[2][0] = mY; q_arrSanke[2][1] = mX * 2+4; q_arrSanke[2][2] = to_west; } //画蛇 void DrawSnake() { int i = 0; for (i = 0; q_arrSanke[i][0] != 0; i++) { memcpy(&q_StrGameBack[q_arrSanke[i][0]][q_arrSanke[i][1]], "■",2); } } //蛇动 void MoveSnake() { int i = SankeLong-1; while (i--) { if (q_arrSanke[i][0]==0) { continue; } else { q_arrSanke[i][0] = q_arrSanke[i - 1][0]; q_arrSanke[i][1] = q_arrSanke[i - 1][1]; q_arrSanke[i][2] = q_arrSanke[i - 1][2]; } } if (q_arrSanke[0][2] == to_west || q_arrSanke[0][2] == to_east) q_arrSanke[0][1] += q_arrSanke[0][2]; else q_arrSanke[0][0] += q_arrSanke[0][2]; DrawSnake(); } //游戏界面 void GameView() { system("cls"); //清空界面 GameBoard(); //游戏边框 SetSankeRandPos(); //产生一个随机位置 DrawSnake(); while (1) { system("cls"); MoveSnake(); GameBoard(); //游戏边框 Sleep(500); } } int main() { //StartGame(); //游戏封面 //StartMusic(); //播放游戏音乐 //ShuSpace(); //输入空格切换界面 //StopMusic(); //停止播放音乐 GameView(); //游戏界面 system("pause"); return 0; } ```
C语言贪吃蛇小游戏的一些问题
做个贪吃蛇游戏,想实现这样的功能:假如在10秒内玩家没能操控蛇吃到食物,那么食物就会刷新,重新出现在另一个坐标。不知道如何实现这样的功能。用Sleep()延迟函数可以吗
C语言贪吃蛇总是莫名奇妙卡住,我应该如何调试?
(我加了40C币的悬赏金,求帮忙!) (问题解决了必有重谢!!!!!) 这是我写的贪吃蛇,它总是莫名奇妙卡住,我不会调试, 哪位大神帮我看看问题出在哪? (要帮我定位哪里的代码出错了) (这个bug我也不知道是在哪,似乎它的出现挺随机的) Tips:运行的时候要先把控制台字号设为14号,然后用英文输入法输入 [我用codeblocks写的代码的百度网盘链接](https://pan.baidu.com/s/1cQgwdQP83tdlHoGshHZpzw "里面包括了我自己写的codeblocks项目的全部文件")
pygame 贪吃蛇遇到的问题
做了两个黑洞,进入一个黑洞会传送到另一个黑洞,但是timer.tick(30)帧太快导致无法从传送,改成timer.tick(2)就可以,这是为什么,应该怎么做?主程序代码如下: ``` 主程序开始 pygame.init() img_size =40 img_group = list() screen_size = 0 #pygame.FULLSCREEN screen = pygame.display.set_mode((24*img_size,18*img_size),screen_size) pygame.display.set_caption("嗷大喵贪吃蛇") face = pygame.image.load("face.png") load_pic() game_init() game_over = False last_time = 0 bgm = None auto_play = False step_time = 400 waiting =True audio_init() rePlay = True play_sound(bgm) while True: timer.tick(2) ticks = pygame.time.get_ticks() current_time = time.clock() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONUP: if waiting == True: waiting = False game_over = False last_time = 0 auto_play = False step_time = 400 game_init() keys = pygame.key.get_pressed() if keys[K_ESCAPE]: pygame.quit() sys.exit() elif keys[K_UP] or keys[K_w]: snake.velocity = Point(0,-1) elif keys[K_DOWN] or keys[K_s]: snake.velocity = Point(0,1) elif keys[K_LEFT] or keys[K_a]: snake.velocity = Point(-1,0) elif keys[K_RIGHT] or keys[K_d]: snake.velocity = Point(1,0) elif keys[K_f]: if screen_size == pygame.FULLSCREEN: screen_size =0 else: screen_size =pygame.FULLSCREEN screen = pygame.display.set_mode((24*img_size,18*img_size),screen_size) pygame.display.set_caption("嗷大喵贪吃蛇") elif keys[K_PLUS] or keys[K_KP_PLUS]: step_time -= 10 if step_time <50: step_time=50 elif keys[K_MINUS] or keys[K_KP_MINUS]: step_time += 10 if step_time >400: step_time = 400 elif keys[K_SPACE]: if auto_play: auto_play = False step_time = 400 else: auto_play = True step_time = 100 if waiting: screen.blit(face,(0,0)) else: if not game_over: hole_group.update(ticks) snake.update(ticks) food_group.update(ticks) #检测是否捡起食物,并增加身体长度 hit_list = pygame.sprite.groupcollide(snake.segments, \ food_group, False, True) if len(hit_list) > 0: food_group.add(Food()) snake.add_segment() #检测是否碰到了自己的身体 for n in range(1, len(snake.segments)): if pygame.sprite.collide_rect(snake.segments[0], snake.segments[n]): game_over = True #检查屏幕边界 head_x = snake.segments[0].X//img_size head_y = snake.segments[0].Y//img_size if head_x < 0: snake.segments[0].X = 23 * img_size elif head_x > 24: snake.segments[0].X = 0 * img_size if head_y < 0: snake.segments[0].Y = 17 * img_size elif head_y > 18: snake.segments[0].Y = 0 * img_size #检测是否进入黑洞,并从另一个黑洞出来 holex = snake.segments[0].X holey = snake.segments[0].Y if holex == hole1.X and holey == hole1.Y: snake.segments[0].X = hole2.X snake.segments[0].Y = hole2.Y elif holex == hole2.X and holey == hole2.Y: snake.segments[0].X = hole1.X snake.segments[0].Y = hole1.Y #执行自动寻路代码 if auto_play: auto_move() backbuffer.fill((20,50,20)) snake.draw(backbuffer) food_group.draw(backbuffer) hole_group.draw(backbuffer) screen.blit(backbuffer, (0,0)) if not game_over: print_text(font, 0, 0, "Length " + str(len(snake.segments))) print_text(font, 0, 20, "Position " + str(snake.segments[0].X//img_size) + \ "," + str(snake.segments[0].Y//img_size)) else: print_text(font, 0, 0, "GAME OVER") waiting = True game_over = False #显示自动字样 if auto_play: print_text(font, 600, 0, "AUTO") #循环播放背景音乐 if int(current_time)%200 ==0 and rePlay: play_sound(bgm) rePlay = False if int(current_time)%200 == 1: rePlay = True pygame.display.update() ```
关于c语言的贪吃蛇游戏问题,为什么最后编译出错?
/* c语言之贪吃蛇 */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <string.h> #include <conio.h> #include <time.h> #define N 24 int apple[3]; //食物 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); //定义一个结构体pos,x,y就是构成的成员 } // 判断出界 int Block(char head[2]) { if((head[0]<1)||(head[0]>N)||(head[1]<1)||(head[1]>N)) return 1; return 0; } //颜色函数 void color(int b) { HANDLE hConsole =GetStdHandle((STD_OUTPUT_HANDLE)); SetConsoleTextAttribute(hConsole,b);//调用API设置字体和背景的颜色函数 } //界面初始化 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]=read()%N+1; apple[1]=read()%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("□"); continue; case 1: color(11); printf("■"); continue; default:; } } printf("\n"); } for(i=0;i<(*len);++i) { gotoxy(snake[i][1]*2,snake[i][0]); printf("★"); } printf("\n"); *snake_x=snake; } void Manual() { gotoxy(N+30,1); color(11); printf("按W,D,S,A移动方向"); gotoxy(N+30,9); printf("按SPACE暂停"); gotoxy(N+30,17); color(12); printf("历史最高分为:"); gotoxy(N+30,25); printf("你当前的得分为:"); } //键盘控制 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'a': case'A': --snake[0][1]; break; case's': case'S': ++snake[0][0]; 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; } //取记录积分 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) score[1]=1; else score[1]=0; return 0; } //存数据 int Fie_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 Eat(char snake[2]) { if(snake[0]==apple[0]&&snake[1]==apple[1]) { apple[0]=apple[1]=apple[2]=0; gotoxy(N+44,10); printf("%d",score[0]*10); return 1; } return 0; } //蛇移动 void Draw(char **snake,int len) { if(apple[2]) { gotoxy(apple[1*2],apple[0]); printf("●"); } if(tail[2]) { printf("★"); } else printf("■"); gotoxy(snake[0][1]*2,snake[0][0]); printf("★"); printf("/n"); } int main(int argc, char *argv[]) { 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]=read()%N+1; apple[1]=read()%N+1; apple[2]=1; } 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); printf("你输了"); File_out(); Free(snake,len); getche(); return 1; } } Free(snake,len); exit(0); return 0; }
用VS写的C语言贪吃蛇背景音乐问题
在VS编译器上运行代码有背景音乐,单独运行Debug下的.exe文件没有背景音乐。求解决方法。运行哪个文件才有背景音乐![图片说明](https://img-ask.csdn.net/upload/201705/21/1495337498_777301.png)
C1189 #error:EasyX is only for c++ 使用图形库easyx用C语言写贪吃蛇出现该问题,怎么解决?
如题![图片说明](https://img-ask.csdn.net/upload/202001/20/1579489746_661095.png) 将文件拓展名改成.cpp也没有用 求解答
C++贪吃蛇问题,请帮帮我。
想写贪吃蛇,想知道食物的随机出现应该怎么使用随机数?用二维数组的话,是随机每个坐标,然后让食物显示在随机的地方吗?
用dev编译器编译一个C语言贪吃蛇的小游戏
自己编译的总是运行不了 如果哪位大神能帮我,我将万分感谢。最好能什么修改背景图的。
贪吃蛇吃了食物怎么让身体变长
#include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include <time.h> #include <windows.h> #include<conio.h> #define AC 10 int X_Y(int (*ju)[AC],int ch1);//坐标移动 void zuo(int ju[][AC],int n1);//坐标赋值 void zuo_DY(int ju[][AC],int n2);//打印坐标 int kiss_1();//产生第1个随机数 int kiss_2();//产生第2个随机数 int x=5,y=5,ann=0; int ki_ss,kis_s;//赋值=随机数 extern ki_ss=kiss_1(); extern kis_s=kiss_2(); int au=0,adc=0; int main(int argc, char* argv[]) { char ch; int chs,hw; int ju[AC][AC]; zuo(ju,hw);//坐标赋值 zuo_DY(ju,hw);//打印坐标 while(1) { printf("输入wasd移动\n"); //scanf("%c",&ch); ch=getch(); if(ch=='s') chs=1; if(ch=='a') chs=2; if(ch=='w') chs=3; if(ch=='d') chs=4; hw=X_Y(ju,chs);//坐标移动后赋值 system("cls"); zuo_DY(ju,hw);//打印坐标 printf("返回值是%d\n",hw); printf("############\n"); } return 0; } void zuo(int ju[][AC],int n1)//坐标赋值 { int f,g; for(f=0;f<AC;f++) for(g=0;g<AC;g++) ju[f][g]=f*10+g; } int X_Y(int (*ju)[AC],int ch1)//坐标移动 { int n; switch(ch1) { case 1:n=ju[x+=1][y];break;//w case 2:n=ju[x][y-=1];break;//a case 3:n=ju[x-=1][y];break;//s case 4:n=ju[x][y+=1];break;//d } return n; } void zuo_DY(int ju[][AC],int n2)//打印坐标 n2坐标移动后的值 { int www=ju[ki_ss][kis_s],ss; printf("%d\n",ju[ki_ss][kis_s]); int f,g; for(f=0;f<AC;f++) { for(g=0;g<AC;g++) { if((ju[f][g]==45&&ann==0)||ju[f][g]==n2) { printf("◎");//头 ann=1;//清空原来的显示的坐标 if(www==n2)//吃到后 www食物坐标 如果吃了食物 { ss=n2;//把上一次移动的坐标赋值给ss while(au==adc) { if(ju[f][g]==ss||au==adc)//显示身体 au adc保持循环打印 { printf("◆");//身体 au=adc;//下一次也可以显示身体 } adc+1; //心碎; } //system("cls"); //printf("胜利\n"); //心碎; } } else if(ju[f][g]==www) printf("●"); else if(ju[ki_ss][kis_s]!=n2) printf("□"); } printf("\n"); } } int kiss_1()//产生第1个随机数 { int s; srand((int)time(NULL)); s = rand() % AC; return s; } int kiss_2()//产生第2个随机数 { int i; srand((char)time(NULL)); i = rand() % AC; return i; }
C++双人贪吃蛇博弈
这个游戏没有吃东西这回事,但你的AI要和别的AI在有障碍的地图上博弈,看谁存活的时间长(蛇会生长)。 有两个问题请教一下: 如何避免走入死胡同 蛇长长后,地图可用空间非常狭小,如何合理倒开空间以便于存活 说说思路与实现方式就好
c语言之贪吃蛇游戏,为什么最后运行时没有苹果出现?求助大神!!!
/* c语言之贪吃蛇 */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <string.h> #include <conio.h> #include <time.h> #define N 21 int apple[3]; //食物 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); //定义一个结构体pos,x,y就是构成的成员 } // 判断出界 int Block(char head[2]) { if((head[0]<1)||(head[0]>N)||(head[1]<1)||(head[1]>N)) return 1; return 0; } //颜色函数 void color(int b) { HANDLE hConsole =GetStdHandle((STD_OUTPUT_HANDLE)); SetConsoleTextAttribute(hConsole,b);//调用API设置字体和背景的颜色函数 } //界面初始化 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]=read()%N+1; apple[1]=read()%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: color(11); printf("■"); continue; default:; } } printf("\n"); } for(i=0;i<(*len);++i) { gotoxy(snake[i][1]*2,snake[i][0]); printf("★"); } printf("\n"); *snake_x=snake; } void Manual() { gotoxy(N+30,2); color(10); printf("按W,D,S,A移动方向"); 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"); } //键盘控制 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'a': case'A': --snake[0][1]; break; case's': case'S': ++snake[0][0]; 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; } //取记录积分 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); printf("闯关失败 加油吧 骚年"); 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 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(14); printf("★"); color(11); } else printf("■"); gotoxy(snake[0][1]*2,snake[0][0]); color(14); printf("★"); color(11); printf("\n"); } int main(int argc, char *argv[]) { 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]=read()%N+1; apple[1]=read()%N+1; apple[2]=1; } 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); printf("你输了"); File_out(); Free(snake,len); getche(); return 1; } } Free(snake,len); return 0; }
如何做贪吃蛇的教程思想
各位大佬好,小弟最近要做一个c#贪吃蛇,使用winform窗体应用程序,要有登录窗体,连接SqlServer数据库等等, 啊,这是第一次做游戏程序,头脑有点混乱,不知该如何下手,例如摄蛇么移动,吃食物,分数的实时统计,信息录入数据库等等,望各位大佬提供一些思想,不胜感激!
用APP inventor做一个贪吃蛇的话要怎么解决一些问题
怎么解决吃一个东西的时候尾巴增长,而且还要能随机生成一个不在贪吃蛇身上的食物,
跪求安卓贪吃蛇视频教程
从来没学过安卓开发 急用一个安卓贪吃蛇视频教程,那位大神能不吝发给我 谢了
我的Java贪吃蛇代码,为什么蛇不显示?
图片如下: (蓝色的是蛇,黄色的是食物) ![图片1](https://img-ask.csdn.net/upload/201910/15/1571144046_475523.png) ![图片2](https://img-ask.csdn.net/upload/201910/15/1571144080_341225.png) 代码如下: ``` java import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; public class SnakeGame extends JFrame{ String snake_dir=""; int snake_x=0; int snake_y=0; int bonus_x=10; int bonus_y=10; int score=1; int index=0; int snake[][]=new int[1024][2]; boolean started=false; boolean lose=false; boolean win=false; public void resetsnake(){ snake_dir=""; score=1; snake_x=0; snake_y=0; bonus_x=0; bonus_y=0; started=false; lose=false; index=0; snake=new int[1024][2]; } public Color color(int r,int g,int b){ Color col = new Color(r,g,b); return col; } public SnakeGame(String title){ class DrawPanel extends JPanel{ public void update_screen(Graphics g){ super.paint(g); g.setColor(color(0,0,0)); g.fillRect(0,0,900,600); g.setColor(color(255,255,0)); g.fillRect(bonus_x*20, bonus_y*20, 20, 20); g.setColor(color(0,0,255)); for(int i=0;i<=score;i++){ g.fillRect(snake[i][0]*20, snake[i][1]*20, 20, 20); } } } class MultiThread extends Thread{ public void run(){ while(started==true){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } switch(snake_dir){ case "up": snake_y--; break; case "down": snake_y++; break; case "left": snake_x--; break; case "right": snake_x++; break; } if(snake_x<0){ snake_x=0; snake_dir=""; } if(snake_x>44){ snake_x=44; snake_dir=""; } if(snake_y<0){ snake_y=0; snake_dir=""; } if(snake_y>29){ snake_y=29; snake_dir=""; } for(int i=0;i<score-1;i++){ snake[i]=snake[i+1]; } snake[score-1][0]=snake_x; snake[score-1][1]=snake_y; if(snake_x==bonus_x && snake_y==bonus_y){ bonus_x=(int)(Math.random()*45); bonus_y=(int)(Math.random()*30); score++; if(score==1024){ started=false; win=true; } } new DrawPanel().update_screen(getGraphics()); } } } addKeyListener(new KeyListener(){ public void keyPressed(KeyEvent e){ int keyCode=e.getKeyCode(); if(started==true){ switch(keyCode){ case KeyEvent.VK_UP: snake_dir="up"; break; case KeyEvent.VK_DOWN: snake_dir="down"; break; case KeyEvent.VK_LEFT: snake_dir="left"; break; case KeyEvent.VK_RIGHT: snake_dir="right"; break; } }else if(started==false && lose==true){ lose=false; }else if(started==false && lose==false){ started=true; new MultiThread().start(); } } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e) {} }); setTitle(title); setSize(900,600); setResizable(false); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args){ new SnakeGame("Java贪吃蛇"); } } ```
c语言 free() 需要释放分配结构里面分配的结构内存么-贪吃蛇-链表
![结构如下](https://img-ask.csdn.net/upload/201907/09/1562648615_804996.png) ![这样分配了内存](https://img-ask.csdn.net/upload/201907/09/1562648663_621565.png) ![释放链表](https://img-ask.csdn.net/upload/201907/09/1562648697_654819.png) 这需要释放node中 position 分配的内存么(注释地方); 我 如果释放position 就会报错 有大佬知道么 更新;-> 出链表的时候释放没报错 ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562739918_882454.png) ------ ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562739943_97624.png) ------- 当最后程序结束是清空释放 position 报错 ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562740020_898931.png) -------- ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562740040_80161.png) ---------- ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562740062_890709.png) --------- ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562740074_826811.png) 我认为position位置应该是有效的,程序其他地方也没去变动position地址 代码片段(代码主要是github大佬的代码,https://github.com/mnisjk/snake.git) ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <curses.h> #include <sys/select.h> #include <time.h> #define SRC_WIDTH 70 #define SRC_HEIGHT 20 WINDOW *g_mainwin; int g_oldcur, g_score = 0, g_width, g_height; typedef struct { int x; int y; } pos; pos fruit; bool *spaces; // queue stuff struct s_node { pos *position; struct s_node *prev; struct s_node *next; } *front = NULL,*back =NULL; typedef struct s_node node; pos * peek(){ return front == NULL ? NULL : front->position; } node * dequeue(){ node *oldfront = front; front = front->next; return oldfront; } //queue a position at the back void enqueue(pos position) { pos *newpos = (pos *)malloc(sizeof(position)); node *newnode = (node *)malloc(sizeof(node)); newpos->x = position.x; newpos->y = position.y; newnode->position = newpos; if(front == NULL && back ==NULL) front = back = newnode; else { back->next = newnode; newnode->prev = back; back = newnode; } } //end queue stuff //start snake stuff void snake_write_text(int y,int x,char *str) { mvwaddstr(g_mainwin, y, x, str); } //draw the borders void snake_draw_board() { int i; for (i = 0; i < g_height;i++){ snake_write_text(i, 0, "|"); snake_write_text(i, g_width - 1, "|"); } for (i = 0; i < g_width;i++) { snake_write_text(0, i, "-"); snake_write_text(g_height, i, "-"); } snake_write_text(g_height + 1, 2, "Score:"); } //resets the terminal window and clears up the mem void snake_game_over(int i,pos p) { free(spaces); while (front) { node *n = front; front = front->next; free(n->position); free(n); } endwin(); printf("%d\n", i); printf("%d,%d\n",p.x,p.y); exit(0); } //当前位置是否在界限里面 bool snake_in_bounds(pos position) { return position.y < g_height && position.y > 0 && position.x < g_width - 1 && position.x > 0; } //2d坐标映射1d int snake_cooridinate_to_index(pos position) { return g_width * position.y + position.x; } //1d映射对应的坐标 pos snake_index_to_coordinate(int index) { int x = index % g_width; int y = index / g_width; return (pos){x, y}; } //随机出现水果 void snake_draw_fruit() { attrset(COLOR_PAIR(3)); int idx; do{ idx = rand() % (g_width * g_height); fruit = snake_index_to_coordinate(idx); } while (spaces[idx] || !snake_in_bounds(fruit)); attron(A_REVERSE); snake_write_text(fruit.y, fruit.x, " "); attroff(A_REVERSE); } //handles moving the snake for each iteration bool snake_move_player(pos head) { attrset(COLOR_PAIR(1)); //check if we ran into ourself int idx = snake_cooridinate_to_index(head); if(spaces[idx]){ pos te = {2, 2}; snake_game_over(2,te); } spaces[idx] = true; enqueue(head); //check if we're eating the fruit if(head.x == fruit.x && head.y == fruit.y) { snake_draw_fruit(); g_score += 10; }else{ node *tail = dequeue(); pos tem = *(tail->position); spaces[snake_cooridinate_to_index(tem)] = false; snake_write_text(tem.y, tem.x, " "); //if(tail->position != NULL) free(tail->position); free(tail); tail = NULL; } attron(A_REVERSE); snake_write_text(head.y, head.x, " "); attroff(A_REVERSE); char buffer[25]; sprintf(buffer, "%d", g_score); attrset(COLOR_PAIR(2)); snake_write_text(g_height+1,9,buffer); } void check_move_pos(pos *t_head,pos *head){ pos temp; node t_node = *back; if (&t_node == NULL) return ; else { if(t_node.prev != NULL){ if((t_node.prev)->position != NULL){ temp = *((t_node.prev)->position); if(t_head->x == head->x){ //x方向 if(temp.x == head->x && temp.y == head->y){ if(t_head->y > temp.y) head->y += 2; else head->y -= 2; } }else if(t_head->y == head->y) { //y方向 if(temp.x == head->x && temp.y == head->y){ if(t_head->x > temp.x) head->x += 2; else head->x -= 2; } } } } } } int main(int argc,char *argv[]) { int key = KEY_RIGHT; if((g_mainwin = initscr()) == NULL) { perror("error initialising ncursess"); exit(EXIT_FAILURE); } srand(time(NULL)); noecho(); curs_set(2); halfdelay(1); keypad(g_mainwin, TRUE); g_oldcur = curs_set(0); start_color( ); init_pair( 1, COLOR_RED, COLOR_BLACK ); init_pair( 2, COLOR_GREEN, COLOR_BLACK ); init_pair( 3, COLOR_YELLOW, COLOR_BLACK ); init_pair( 4, COLOR_BLUE, COLOR_BLACK ); init_pair( 5, COLOR_CYAN, COLOR_BLACK ); init_pair( 6, COLOR_MAGENTA, COLOR_BLACK ); init_pair( 7, COLOR_WHITE, COLOR_BLACK ); getmaxyx( g_mainwin, g_height, g_width ); g_width = g_width < SRC_WIDTH ? g_width : SRC_WIDTH; g_height = g_height < SRC_HEIGHT ? g_height : SRC_HEIGHT; // Set up the 2D array of all spaces spaces = (bool*) malloc( sizeof( bool ) * g_height * g_width ); snake_draw_board( ); snake_draw_fruit( ); pos head = { 5,5 }; enqueue( head ); // Event loop while( 1 ) { pos t_head = head; int in = getch(); if( in != ERR ) key = in; switch (key) { case KEY_DOWN: case 'k': case 'K': head.y++; break; case KEY_RIGHT: case 'l': case 'L': head.x++; break; case KEY_UP: case 'j': case 'J': head.y--; break; case KEY_LEFT: case 'h': case 'H': head.x--; break; } //禁止反向 check_move_pos(&t_head, &head); if (!snake_in_bounds(head)) snake_game_over(3, head); else snake_move_player(head); } pos te = {4, 4}; snake_game_over(4,te); } ``` 调试了 越来混乱了,一运行蛇啥不吃,链表里面应该只有一个地址才对,出链表也对应的释放了地址.可调试出现了最后出现了3个 ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562744544_820667.png) 更新-> 搞好了, ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562750107_36874.png) 新建节点 node *newnode = (node *)malloc(sizeof(node));时候,莫名 newnode 中 next 指针指向了未知 地址,按原本意思应该指向 0x0空地址 所有 newnode->next = newnode->prev = NULL; 初始化一下,不然结束的释放链表 就会找到这个 0x20 的地址 ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562750298_228211.png) --- ![图片说明](https://img-ask.csdn.net/upload/201907/10/1562750311_263565.png) 一切正常了 ,高兴
Java写贪吃蛇遇到的食物生成问题
我是用线程方法让蛇和食物动起来的,不过食物和蛇一起写在paint方法里,repaint一次,食物也会随机变换位置,我想通过观察蛇长是否改变来决定是否new一个新对象,但原来的食物位置不知道怎么记录下来,求教,或者其他更好的解决的方法,谢谢。 import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Shell extends Frame { private static final int Width = 900; private static final int Height = 700; private static final int XOffset = 50; private static final int YOffset = 50; private static final int XEnd = 850; private static final int YEnd = 650; public static final int Row = 30; public static final int Col = 40; public static final int Block_Size = 20; public static Food myFood = null; private Node myNode = null; private static Snake mySnake = new Snake(); private static Shell shell = new Shell(); public Shell() { this.setTitle("贪吃蛇"); this.setSize(Width, Height); this.setResizable(false); this.setLocationRelativeTo(null); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.addKeyListener(new KeyHandler(mySnake)); //produceFood(); this.setVisible(true); } public void paint(Graphics g) { drawGrid(g); drawFood(g); drawSnake(g); } private void drawGrid(Graphics g) { g.setColor(Color.BLACK); for(int i=0; i<=Row; i++) { g.drawLine(XOffset, Block_Size*i+50, XEnd, Block_Size*i+50); } for(int i=0; i<=Col; i++) { g.drawLine(Block_Size*i+50, YOffset, Block_Size*i+50, YEnd); } } public void drawSnake(Graphics g) { g.setColor(Color.BLACK); for(int i=0; i<mySnake.getLength(); i++) { myNode = mySnake.getNode(i); g.fillRect(myNode.X, myNode.Y, Block_Size, Block_Size); } } private void drawFood(Graphics g) { myFood = new Food(); g.setColor(Color.RED); g.fillRect(myFood.getX(), myFood.getY(), Block_Size, Block_Size); } public Food getFood() { return myFood; } public static Food produceFood() { boolean finished; Food food; do{ finished = true; food =new Food(); for(int i=0; i<mySnake.getLength(); i++) { if(mySnake.getNode(i).X == food.getX() || mySnake.getNode(i).Y == food.getY()) { finished = false; } } } while(!finished); myFood = food; return food; } public static void main(String[] args) { produceFood(); new Updater(shell, mySnake).start(); } } class Updater extends Thread { private Shell shell = null; private Snake snake = null; public Updater(Shell shell, Snake snake) { this.shell = shell; this.snake = snake; } public void run() { while(true) { snake.move(shell); shell.repaint(); try { sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` import java.util.ArrayList; import java.util.List; public class Snake { List<Node> Nodes = null; public Direction direction = null; private Node newNode = null; private Node headNode = null; private Direction nextDirection = null; public Snake() { Nodes = new ArrayList<Node>(); reset(); } public void setDirection(Direction d) { switch(this.direction) { case LEFT : if(d == Direction.RIGHT) return ; break; case RIGHT : if(d == Direction.LEFT) return ; break; case UP : if(d == Direction.DOWN) return ; break; case DOWN : if(d == Direction.UP) return ; break; } nextDirection = d; } public void move(Shell shell) { headNode = Nodes.get(0); this.direction = nextDirection; switch(this.direction) { case LEFT: newNode = new Node(headNode.X-Shell.Block_Size, headNode.Y); break; case RIGHT: newNode = new Node(headNode.X+Shell.Block_Size, headNode.Y); break; case UP: newNode = new Node(headNode.X, headNode.Y-Shell.Block_Size); break; case DOWN: newNode = new Node(headNode.X, headNode.Y+Shell.Block_Size); break; } Food myFood = shell.getFood(); if (myFood.getX() == headNode.X && myFood.getY() == headNode.Y) { Nodes.add(0,new Node(myFood.getX(),myFood.getY())); //Shell.produceFood(); } else { Shell.myFood = null; Nodes.add(0,newNode); Nodes.remove(Nodes.size()-1); } } public int getLength() { return Nodes.size(); } public Node getNode(int index) { return Nodes.get(index); } private void reset() { Nodes.clear(); Nodes.add(new Node(Shell.Block_Size*10+50,Shell.Block_Size*10+50)); Nodes.add(new Node(Shell.Block_Size*9+50,Shell.Block_Size*10+50)); Nodes.add(new Node(Shell.Block_Size*8+50,Shell.Block_Size*10+50)); Nodes.add(new Node(Shell.Block_Size*7+50,Shell.Block_Size*10+50)); nextDirection = Direction.RIGHT; } } ``` import java.util.Random; public class Food { public static int X = 0; public static int Y = 0; Random random = new Random(); public int getX() { return Shell.Block_Size*random.nextInt(Shell.Col)+50; } public int getY() { return Shell.Block_Size*random.nextInt(Shell.Row)+50; } } ``` public enum Direction { LEFT, RIGHT, UP, DOWN } ``` import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class KeyHandler extends KeyAdapter{ private Snake snake = null; public KeyHandler(Snake snake) { this.snake = snake; } public void keyPressed(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_UP : snake.setDirection(Direction.UP); break; case KeyEvent.VK_DOWN : snake.setDirection(Direction.DOWN); break; case KeyEvent.VK_RIGHT : snake.setDirection(Direction.RIGHT); break; case KeyEvent.VK_LEFT : snake.setDirection(Direction.LEFT); break; } } } ``` public class Node { public int X = 0; public int Y = 0; public Node(int X, int Y) { this.X = X; this.Y = Y; } } ```
贪吃蛇问题。蛇头坐标为小数,食物坐标也为小数。两者不对应。
![贪吃蛇的蛇头的坐标为小数,如何解决?变为整数,谢谢!](https://img-ask.csdn.net/upload/201605/25/1464191428_288182.png)
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
java中的Static、final、Static final各种用法
前言 对Static、final、Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从容的回答… static 加载:static在类加载时初始化(加载)完成 含义:Static意为静态的,但凡被static 修饰说明属于类,不属于类的对象。 可修饰:Static 可以修饰 内部类、方...
各大公司在GitHub上开源投入排名分析
基于GitHub的数据进行分析各个公司在开源上的投入排名
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
Spring Boot 开发微信公众号后台
Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台。 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站文章的功能,还有之前就有的公众号内回复口令获取超 2TB 免费视频教程的功能(免费视频教程),这两个都是松哥基于 Spring Boot 来做的,最近松哥打算通...
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
C++知识点 —— 整合(持续更新中)
本文记录自己在自学C++过程中不同于C的一些知识点,适合于有C语言基础的同学阅读。如果纰漏,欢迎回复指正 目录 第一部分 基础知识 一、HelloWorld与命名空间 二、引用和引用参数 2.1引用的定义 2.2 将引用用作函数参数 2.3 将引用用于类对象 2.4 引用和继承 2.5 何时使用引用参数 2.6 引用和指针的区别 三、内联函数 四、默认参数的...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
js知识点汇总
1.本门课的作用(JavaScript的作用)所有基于Web的程序开发基础 2.一种计算机客户端脚本语言,主要在Web浏览器解释执行。 3.浏览器中Javascript,用于与用户交互,以及实现页面中各种动态特效 4.在HTML文件中,任何JavaScript代码必须放到&lt;script&gt;标签中 5.把JavaScript代码放到外部文件中,在HTML代码中直接引入该文件(外部文...
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
论文读不懂怎么办?
王树义读完需要18分钟速读仅需6分钟悄悄告诉你几个窍门。1 痛苦做科研,不能不读论文。但是,我见过不少研究生,论文都读得愁眉苦脸的。这其中,自然有因为拖延的关系。例如教授布置了2周后讨论论文,你原本可以每天抽出时间,慢慢消化。可你非得拖到截止日期的前一天晚上才打开看,希望毕其功于一役……这显然是态度问题。但是,不可忽略的,有些同学,却真的不是态度问题,而是方法不当。他们喜欢跟论文死磕。读不懂,...
用Python解决数据结构与算法问题(三):线性数据结构之栈
python学习之路 - 从入门到精通到大师 文章目录[python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/details/90017382)〇、写在前面3.1.目标3.2.什么是线性数据结构3.3.什么是栈3.4.栈的抽象数据类型3.5.Python实现栈3.6.简单括号匹配3.7.符号匹配3.8.十进制转换成二进制...
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
Java面试官最爱问的volatile关键字
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题。经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用volatile关键字作为切入点呢? 为什么爱问volatile关键字 爱问volatile关键字的面试官,大多数情况下都是有一定功底的,因为volatile作为切入点,往底层走可以切入Java内存模...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
【C++100问】深入理解理解顶层const和底层const
专栏C++学习笔记 声明 1)该文章整理自网上的大牛和相关专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
《C++ Primer》学习笔记(五):循环、分支、跳转和异常处理语句
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第5章 - 语句 文章目录专栏C++学习笔记语句1、...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问