本人写的贪吃蛇代码,求教大神哪里错了?

本人初学JAVA,写了一个简易的贪吃蛇,运行的时候有时候吃到豆子能变长,有时候吃豆子不能变长不知道为什么,代码如下

Snake类:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.*;

public class Snake extends JPanel implements KeyListener{
    private int direction=South;

    ArrayList<Integer> Bufferbody=new ArrayList<Integer>();
    ArrayList<Integer> body=new ArrayList<Integer>();
    int foodX=300;
    int foodY=300;
    int headX=100;
    int headY=100;
    int souse=0;
    int O=0;
    public static final int South=0;
    public static final int North=1;
    public static final int East=2;
    public static final int West=3;
    Random rand=new Random();
    private Image iBuffer;
    private Graphics gBuffer;
    public void setBufferbody() {
        Bufferbody.add(0,100);
        Bufferbody.add(1,100);
    }
    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        setBackground(Color.gray);
        g.setColor(Color.BLUE);
        g.fillRect(600, 0, 100, 600);
        Font font=new Font("微软雅黑",Font.BOLD,30);
        g.setFont(font);
        g.setColor(Color.BLACK);
        g.drawString("分数", 612, 100);
        if(souse==0)
        g.drawString(""+souse, 630, 150);
        if(souse>0&&souse<=90)
        g.drawString(""+souse, 623, 150);
        if(souse>90)
        g.drawString(""+souse, 612, 150);
        g.fillRect(headX, headY,10 ,10 );
        while(foodX==headX&&foodY==headY) {
            foodX=rand.nextInt(60)*10;
            foodY=rand.nextInt(56)*10;
        }
        g.setColor(Color.YELLOW);
        g.fillRect(foodX, foodY, 10, 10);
        if(O==0) {
            g.setColor(Color.red);
            g.drawString("按A开始游戏", 200, 300);
        }
        for(int i=0;i<body.size();i++) {
            Bufferbody.set(i+2,body.get(i));
        }
        for(int i=0;i<body.size();i++) {
            body.set(i,Bufferbody.get(i));
        }
        for(int i=0;i<body.size();i=i+2) {
            g.setColor(Color.green);
            g.fillRect(body.get(i), body.get(i+1), 10, 10);
        }
        if(O==-1) {
            g.setColor(Color.red);
            g.drawString("Game Over",200, 200);
            g.drawString("按R重新游戏", 200, 300);
        }
    }
    public void update(Graphics g) {
        if(iBuffer==null) {
            iBuffer=createImage(700,600);
            gBuffer=getGraphics();
        }
        gBuffer.setColor(getBackground());
        gBuffer.fillRect(0, 0, 700, 600);
        paint(gBuffer);
        g.drawImage(iBuffer, 0, 0, this);
    }
    public void move() {
        new Thread() {
            public void run() {
                while(true) {
                    System.out.print("");
                if(O==1) {
                    switch(direction) {
                    case South:
                        Bufferbody.set(0,headX);
                        Bufferbody.set(1,headY);
                        headY=headY+10;
                        repaint();
                        break;
                    case North:
                        Bufferbody.set(0,headX);
                        Bufferbody.set(1,headY);                                                                    
                        headY=headY-10;
                        repaint();
                        break;
                    case East:
                        Bufferbody.set(0,headX);
                        Bufferbody.set(1,headY);
                        headX=headX+10;
                        repaint();
                        break;
                    case West:
                        Bufferbody.set(0,headX);
                        Bufferbody.set(1,headY);                        
                        headX=headX-10;
                        repaint();
                        break;
                    }
                if(headX==foodX&&headY==foodY) {
                    Bufferbody.add(0);  
                    Bufferbody.add(0);  
                    body.add(Bufferbody.get(Bufferbody.size()-2));
                    body.add(Bufferbody.get(Bufferbody.size()-1));
                    souse=souse+10;
                    repaint();
                }
                if(headX<0||headY<0||headX==600||headY==560) {
                    O=-1;
                    repaint();
                    break;
                }
                for(int i=0;i<body.size();i=i+2) {
                    if(headX==body.get(i)&&headY==body.get(i+1)) {
                        O=-1;
                        repaint();
                        break;
                    }
                }
                }
                try {
                Thread.sleep(140);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }
                }
            }
        }.start();
    }
    @Override
    public void keyPressed(KeyEvent a) {
        // TODO Auto-generated method stub
        if(a.getKeyCode()==65&&O==0) {
            O=1;
            repaint();
            }
        if(O==1) {
        switch(a.getKeyCode()) {
        case KeyEvent.VK_UP:
            if(direction==East||direction==West)
            direction=North;
            break;
        case KeyEvent.VK_RIGHT:
            if(direction==South||direction==North)
            direction=East;
            break;
        case KeyEvent.VK_DOWN:
            if(direction==East||direction==West)
            direction=South;
            break;
        case KeyEvent.VK_LEFT:
            if(direction==South||direction==North)
            direction=West;
            break;
    }
        }
        if(a.getKeyCode()==82&&O==-1) {
            direction=South;
            foodX=300;
            foodY=300;
            headX=100;
            headY=100;
            souse=0;
            Bufferbody.clear();
            body.clear();
            setBufferbody();
            O=0;
            move();
            repaint();
        }
        if(a.getKeyCode()==32&&O==1) {
            O=0;
            repaint();
            }
        if(a.getKeyCode()==KeyEvent.VK_ESCAPE) {
        System.exit(0);
    }
        }
    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}

World类:

import javax.swing.*;

public class World extends JFrame{
public static void main(String[] args) {
JFrame f=new JFrame();
Snake s=new Snake();
f.setSize(700,600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(3);
f.setTitle("Snake");
f.add(s);
s.setBufferbody();
s.move();
f.addKeyListener(s);
f.setVisible(true);
}
}

1个回答

我测了两遍,看到的蛇是变长了的,能否改进一下,给蛇身画上竖线以便确定是否变长了。

weixin_45477457
单翡 谢谢,问题解决了
6 个月之前 回复
wojiushiwo945you
毕小宝 回复单翡: 闲来无事,根据你这段代码重新优化了一下,https://github.com/woodvine/snakegame
6 个月之前 回复
weixin_45477457
单翡 只要看分数有没有增加就能确定蛇是否变长,但是我有的时候吃到豆子分数却没有增加
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
我的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贪吃蛇"); } } ```
自己写的贪吃蛇代码,找不出bug,运行出来是黑屏,请大家帮忙看一下
#include<iostream.h> #include<time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include<windows.h> #define N 4 struct snake { int x; int y; }snk[100]; struct food { int x; int y; }food; void snake(int len)//初始化蛇身 { int i=0; srand(time(NULL)); snk[i].x=rand()%50+10; snk[i].y=rand()%30+10; switch(rand()%4) { case 0: for(i=1;i<len;i++) {snk[i].x=snk[i-1].x+1; snk[i].y=snk[i-1].y;}break; case 1: for(i=1;i<len;i++) {snk[i].x=snk[i-1].x-1; snk[i].y=snk[i-1].y;}break; case 2: for(i=1;i<len;i++) {snk[i].x=snk[i-1].x; snk[i].y=snk[i-1].y+1;}break; case 3: for(i=1;i<len;i++) {snk[i].x=snk[i-1].x; snk[i].y=snk[i-1].y-1;}break; } } void delay(int sec)//调节速度 { time_t start_time, cur_time; time(&start_time); do { time(&cur_time); } while((cur_time - start_time) < sec ); } void move(int len)//移动以及转向 { char direct; cin>>direct; struct snake head={snk[0].x,snk[0].y}; if(direct==NULL) { snk[0].x=2*snk[1].x-snk[0].x; snk[0].y=2*snk[1].y-snk[0].y; } if(direct=='W') { snk[0].x=3*snk[1].x-2*snk[0].x; snk[0].y=3*snk[1].y-2*snk[0].y; for(int i=len-1;i>1;i--) { snk[i].x=snk[i-1].x; snk[i].x=snk[i-1].x; } snk[1].x=head.x; snk[1].y=head.y; } if(direct=='A'||direct=='D') { snk[0].x=snk[0].x+snk[0].y-snk[1].y; snk[0].y=snk[0].y+snk[0].x-snk[1].x; } for(int i=len-1;i>1;i--) { snk[i].x=snk[i-1].x; snk[i].x=snk[i-1].x; } snk[1].x=head.x; snk[1].y=head.y; } void FOOD(int len)//食物出现如出现在蛇身上再次生成 { while(1) { int flag=0; srand(time(NULL)); food.x=rand()%50+10; food.y=rand()%30+10; for(int i=0;i<len;i++) if(food.x==snk[i].x&&food.y==snk[i].y) flag=1; if(flag==0) break; } } void print(int len) { int i,j,t; for(i=0;i<70;i++) cout<<"#"; for(j=1;j<48;j++) { cout<<"#"; for(i=1;i<68;i++) for(t=0;t<len;t++) { if(snk[t].x==i&&snk[t].y==j) cout<<"@"; else cout<<" "; } cout<<"#"; } for(i=0;i<70;i++) cout<<"#"; } void main() { int num; cout<<"1 start"<<endl<<"2 quit"; cin>>num; if (num==1) { int static len=N,score=0; snake(N); FOOD(len); while(1) { move(len); delay(2); if(snk[0].x==food.x&&snk[0].y==food.y) { len++; score++; FOOD(len); } if(snk[0].x==0||snk[0].x==69||snk[0].y==0||snk[0].y==49) { cout<<"game over"<<endl; cout<<score; break; } print(len); Sleep(60);//_sleep(); system("Cls"); } } else exit(1); }
求大神, 贪吃蛇的问题。
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #include <windows.h> #include "snake.h" int Score = 0; int snakespeed = 50; // 蛇的运行速度 // 角色行为 // 暂时不知道咋写 --! // 游戏框架 static void Game_Menu(void); // 主菜单界面 static void Start_Game(void); //开始游戏 static void Game_Help(void); // 游戏帮助 static void Game_Setting(void); // 游戏设置 static void Game_Over(void); // 结束游戏 void gotoxy(int x, int y); // 主函数 int main(void) { Game_Menu(); return 0; } void Game_Menu(void) { static char key; while(1) { system("cls"); system ("title 贪吃蛇"); system("DATE /T"); system("TIME /T"); //system("color "); //system(mode)// 写完再调整 printf("|_________________________________________________|\n"); printf("| * | 1.START |\n"); printf("| * * | 2.help |\n"); printf("| * | 3.game setting |\n"); printf("| * | 0.exit |\n"); printf("| * |____________________|\n"); printf("| * | |\n"); printf("| * | |\n"); printf("| * | |\n"); printf("| * | |\n"); printf("| * | |\n"); printf("| * * | |\n"); printf("| * * | |\n"); printf("|____________________________|____________________|\n"); //响应按键 key = getch(); switch(key){ case '1': Start_Game(); break; case '2': Game_Help(); break; case '3': Game_Setting(); break; case '0': Game_Over(); break; fflush(stdin); } } } void Start_Game(void) { static char ch; static int i, j; static int Game_Over_Flag = 0; // 初始化食物 srand((unsigned int)time(NULL)); food.x = rand() % (MAP_WIDTH - 2) + 1; // 应该是多余的 不知道为啥食物老是出现在0, 0 处 food.y = rand() % (MAP_HEIGHT - 2) + 1; // 初始化蛇 snake.x[0] = 2; snake.y[0] = 2; snake.x[1] = 3; snake.y[1] = 2; snake.node = 2; snake.direction = 3; snake.life = 3; // 初始化地图 system("cls"); // 不加这一句打印的是乱码-- 不知道为啥 for (i = 0; i < MAP_HEIGHT; i++) for (j = 0; j < MAP_WIDTH; j++) { if (i == 0 || i == MAP_HEIGHT-1 || j == 0 ||j == MAP_WIDTH-1) Map[i][j] = '.'; else Map[i][j] = ' '; } for (i = 0; i < MAP_HEIGHT; i++) puts(Map[i]); while(1) { while(!kbhit()) { // 初始化食物 if (food.yes == 1) { food.x = rand() % (MAP_WIDTH - 1) + 1; food.y = rand() % (MAP_HEIGHT - 1) + 1; food.yes = 0; // 已有食物 ,重置为1 } if (food.yes == 0) { gotoxy(food.x, food.y); putchar('g'); } for (i = snake.node-1; i >= 0; i--)// 从尾部开始比从头部开始具有更高的流畅性 { gotoxy(snake.x[i], snake.y[i]); putchar('*'); } for (i = snake.node-1; i > 0; i--) { snake.x[i] = snake.x[i-1]; snake.y[i] = snake.y[i-1]; } // 判断方向 if (snake.direction == 1) snake.y[0]--; else if(snake.direction == 2) snake.x[0]--; else if (snake.direction == 3) snake.y[0]++; else if (snake.direction = 4) snake.x[0]++; // 蛇是否撞到自己 for (i = 3; i < snake.node; i++) { if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0]) snake.life = 0; } // 蛇是否撞墙 if (snake.x[0] <= 0 || snake.x[0] >= MAP_WIDTH-1 || snake.y[0] <= 0 || snake.y[0] >= MAP_HEIGHT-1) snake.life = 0; // 生命值为0 退出游戏 if (snake.life == 0) { Game_Over(); Game_Over_Flag = 1; break; } // 蛇是否吃到食物 if (snake.x[0] == food.x && snake.y[0] == food.y) { snake.node++; // 蛇身变长 food.yes = 1; // 重置为1 不在刷新食物 Score += 100; } // gotoxy(snake.x[snake.node-1], snake.y[snake.node-1]); // 暂且选用高频刷新的方案 // putchar(' '); Sleep(snakespeed); system("cls"); for (i = 0; i < MAP_HEIGHT; i++) puts(Map[i]); printf("*****************************\n"); printf("当前分数: %d\n", Score); } // 选择方向 ch = getch(); switch(ch){ case 'w': snake.direction = 1; break; case 'a': snake.direction = 2; break; case 's': snake.direction = 3; break; case 'd': snake.direction = 4; break; } if (Game_Over_Flag == 1) break; } } // 游戏设置安排存在较大问题 void Game_Help(void) { char ch; system("cls"); printf("游戏版本:1.0\n"); printf("w,a,s,d控制移动,死亡后返回主菜单\n"); while((ch = getch()) == 'q') { system("cls"); return; } } void Game_Setting(void) { char ch; system("cls"); printf ("默认速度设置: 50\n"); printf("_________________\n"); printf("当前速度设置: %d\n", snakespeed); printf("请输入蛇的速度值大小\n"); scanf("%d", &snakespeed); printf("请稍后, 系统正在处理中.........\n"); Sleep(1000); printf("设置完毕!\n"); while((ch = getch()) == 'q') { system("cls"); return; } } void Game_Over() { system("cls"); gotoxy(MAP_WIDTH/2, MAP_HEIGHT/2); printf("游戏结束!!!\n"); Sleep(2000); system("cls"); return; } void gotoxy(int x, int y) { COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } 写了一个贪吃蛇,能运行, 可以玩,但是死过一次后再在主菜单调用Start_Game开始游戏时会闪退, 怎么回事 数据定义在头文件里
C语言贪吃蛇总是莫名奇妙卡住,我应该如何调试?
(我加了40C币的悬赏金,求帮忙!) (问题解决了必有重谢!!!!!) 这是我写的贪吃蛇,它总是莫名奇妙卡住,我不会调试, 哪位大神帮我看看问题出在哪? (要帮我定位哪里的代码出错了) (这个bug我也不知道是在哪,似乎它的出现挺随机的) Tips:运行的时候要先把控制台字号设为14号,然后用英文输入法输入 [我用codeblocks写的代码的百度网盘链接](https://pan.baidu.com/s/1cQgwdQP83tdlHoGshHZpzw "里面包括了我自己写的codeblocks项目的全部文件")
C1189 #error:EasyX is only for c++ 使用图形库easyx用C语言写贪吃蛇出现该问题,怎么解决?
如题![图片说明](https://img-ask.csdn.net/upload/202001/20/1579489746_661095.png) 将文件拓展名改成.cpp也没有用 求解答
跪求安卓贪吃蛇视频教程
从来没学过安卓开发 急用一个安卓贪吃蛇视频教程,那位大神能不吝发给我 谢了
求大神, 贪吃蛇的问题
怎么实现蛇的自动行走, 数组实现 struct snake{ int x[N]; int y[N]; int node; }
求大神帮助。从网上找了个贪吃蛇的代码,但是总是运行错误,求帮助,刚刚开始学习c++。
http://yun.baidu.com/share/link?shareid=2570961242&uk=3424030372
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++贪吃蛇程序
#include<iostream> #include<windows.h> #include<time.h> #include<conio.h> using namespace std; // 刷新当前屏幕 inline void Refresh(char q[][22], int grade, int gamespeed){     system("cls");     //  清屏  int i,j;  cout << endl;  for(i=0;i<22;i++){      cout << "\t";   for(j=0;j<22;j++)    cout<<q[i][j]<<' ';    //  输出贪吃蛇棋盘         if(i==0) cout << "\t等级为:" << grade;         if(i==4) cout << "\t自动前进时间";         if(i==6) cout << "\t间隔为:" << gamespeed << "ms";   cout<<endl;  } } int main(){     char tcsQipan[22][22];     //  贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)     int i,j;     for(i=1;i<=20;i++)         for(j=1;j<=20;j++)             tcsQipan[i][j]=' ';     //     初始化贪吃蛇棋盘中间空白部分     for(i=0;i<=21;i++)         tcsQipan[0][i] = tcsQipan[21][i] = '-';      //初始化贪吃蛇棋盘上下墙壁     for(i=1;i<=20;i++)         tcsQipan[i][0] = tcsQipan[i][21] = '|';      //初始化贪吃蛇棋盘左右墙壁     int tcsZuobiao[2][100];     //蛇的坐标数组     for(i=0; i<4; i++){         tcsZuobiao[0][i] = 1;         tcsZuobiao[1][i] = i + 1;     }     int head = 3,tail = 0;     for(i=1;i<=3;i++)         tcsQipan[1][i]='*';    //蛇身     tcsQipan[1][4]='#';       //蛇头     int x1, y1;           // 随机出米     srand(time(0));     do{   x1=rand()%20+1;   y1=rand()%20+1;  }while(tcsQipan[x1][y1]!=' ');  tcsQipan[x1][y1]='*';  cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;//准备开始;;  long start;     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进入倒计时:" << i << endl;   else    Refresh(tcsQipan,grade,gamespeed);  }     int timeover;     char direction = 77;  // 初始情况下,向右运动     int x,y;     while(1){         timeover = 1;         start = clock();         while((timeover=(clock()-start<=gamespeed))&&!kbhit());              //如果有键按下或时间超过自动前进时间间隔则终止循环         if(timeover){             getch();direction = getch();         }         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
贪吃蛇语法有问题 求各位大神帮帮忙
``` #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<time.h> const char Shead = '@';//蛇头 const char Sbody = '#';//蛇身 const char Sfood = '*';//食物 const char Snode = '.';//地图的每一个node const int High = 8;//地图的高 const int Long = 16;//地图的宽度 char GameMap[High][Long];//地图 int Key; //按键保存 int Sum = 1;//蛇的结束 int Over = 0; //蛇的生命(死亡) int dy[4] = {0,0,-1,1};//上下左右 int dx[4] = {1,-1,0,0}; struct Snake //定义蛇的结构体 { int x; int y;//位置 int now;//保存当前节点的方向,为0 1 2 3 分别为上下左右 }Snake[High*Long] //蛇的最大大小(node) void Initial();//地图的初始化 void Create_Food(); //随机构造食物 void Show();//刷新并显示地图 void Button();//取出按键并且判断方向 void Move();// 蛇的移动 void Check_Border();//检查蛇头是否越界 void Check_Head(int x,int y); int main(void) { Initial(); show(); return 0; } void Initial()//地图的初始化 { int i,j; int hx,hy; system("title 贪吃蛇");//窗口的标题 memset(GameMap,'.',sizeof(GameMap));//把地图Initial为'.' system("cls"); srand(time(0));//随即的某个种子 hx = rand()%Long;//产生随即的蛇头 hy = rand()%High; GameMap[hx][hy] = Shead; //待测试 Snake[0].x = hx;//待测试 Snake[0].y = hy;//初始化随即的蛇头 Snake[0].now = -1;//初始化方向 Create_Food();//随即生成食物 for(i = 0;i < High;i++) //地图的显示 { for(j = 0;j < Long;j++) pritnf("%c",GameMap[i][j]); printf("\n"); } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); printf("按任意方向键开始游戏\n"); getch();//接受一个按键 Button();//取出输入的按键,并且判断方向 } void Create_Food() { int fx,fy; while(1) { fx = rand()%High; fy = rand()%Long; 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"); printf("再来一次吧!\n"); getchar(); break; } system("cls");//清空地图并且显示地图 for(i = 0;i < High;i++) { for(j = 0;j <Long;j++) { printf("%c",GameMap[i][j]); printf("\n"); } } printf("霸气De蝈蝈★贪吃蛇小游戏!!!\n"); pritnf("按任意方向键开始游戏\n"); } } void Button() { if(kbhit =! 0) //kbhit检测是否输入按键,若有则返回一个非零值。 { while(kbhit =! 0) //可能存在许多的按键,要都取完,以最后一个为主 key = getch; 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(); //判断蛇头的目前坐标参数 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 >= High || Snake[0].y < 0 || Snake[0].y >= Long) over = 1; } void Check_Head() { 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; } ```
以MFC编程框架为基础,实现贪吃蛇功能
如题,需要贪吃蛇游戏源代码(介绍一些代码的作用,本人小白,作业要求,希望详细一点),要求。程序简介,功能模块划分。程序概要设计(概要设计列出新增的类,新增的数据变量,新增的函数申明,主要代码等,并介绍其含义)
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/201612/20/1482224576_783664.png)
贪吃蛇游戏源程序有了,不知如何封装?求大神解答
/*------------------------------ 贪吃蛇 *------------------------------*/ #include <cstdlib> #include <iostream> #include <windows.h> #include <conio.h> #include <time.h> #define uint unsigned int #define _X 10 #define _Y 5 #define WIDTH 60 #define HEIGHT 16 #define U 0 #define R 1 #define D 2 #define L 3 #define SUC 0 #define EAT 1 #define BUMP 2 using namespace std; /*--------------点的结构体 ----------------*/ struct PT { int x; int y; }; /*--------------结点的结构体 ----------------*/ struct Body { PT now; Body *last; Body *next; }; /*--------------蛇的结构体 ----------------*/ struct Snake { int dir; Body *head; Body *tail; uint bodylong; }snake; /*--------------全局变量 ----------------*/ HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE); char obj='H',snk='O',food=1; PT foodpt; uint n,score,level=150; unsigned char key; char *msg; char l; /*--------------长延时----------------*/ void delay(uint time) { for(int k=0;k<time/10;k++) { Sleep(10); if(kbhit()) key=getch(); } } /*--------------获取随机点坐标----------------*/ PT randpt() { PT pt; pt.x=rand()%(WIDTH-1)+1+_X; pt.y=rand()%(HEIGHT-1)+1+_Y; return pt; } /*--------------隐藏光标----------------*/ void hidecursor() { CONSOLE_CURSOR_INFO cursor_info; cursor_info.bVisible=false; cursor_info.dwSize=20; SetConsoleCursorInfo(hStdout,&cursor_info); } /*--------------开始gotoxy一系列的函数定义----------------*/ void gotoxy(int x,int y,char ch) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (hStdout,c); putchar(ch); } void gotoxy(int x,int y,char* ch) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (hStdout,c); puts(ch); } void gotoxy(PT pt,char ch) { COORD c; c.X = pt.x - 1; c.Y = pt.y - 1; SetConsoleCursorPosition (hStdout,c); putchar(ch); } void gotoxy(PT pt,char* ch) { COORD c; c.X = pt.x - 1; c.Y = pt.y - 1; SetConsoleCursorPosition (hStdout,c); puts(ch); } void gotoxy(PT pt) { COORD c; c.X = pt.x - 1; c.Y = pt.y - 1; SetConsoleCursorPosition (hStdout,c); } void gotoxy(int x,int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (hStdout,c); } /*--------------结束----------------*/ /*--------------清除一行的内容----------------*/ void clraline(int y) { gotoxy(1,y); for(int k=0;k<70;k++) { putchar(' '); } } /*--------------获取按键值给key 并返回键值----------------*/ char getkey() { key=getch(); return key; } /*--------------等待按键弹起----------------*/ void waitforkeyup() { while(kbhit()) Sleep(20); } /*--------------判断点是否在蛇身上----------------*/ bool isinsnk(PT pt) { Body *temp; temp=snake.head; while(temp!=NULL) { if(temp->now.x==pt.x&&temp->now.y==pt.y) return true; temp=temp->next; } return false; } /*--------------初始化函数---------------*/ void init() { Body *temp,*temp2; hidecursor(); system("cls"); gotoxy(_X+24,1,"By PL23K"); temp=snake.tail; while(temp!=NULL) { temp2=temp; temp=temp->last; delete temp2; } srand((int)time(0)); score=0; for(n=0;n<=WIDTH;n++) { gotoxy(_X+n,_Y,obj); gotoxy(_X+n,_Y+HEIGHT,obj); } for(n=0;n<=HEIGHT;n++) { gotoxy(_X,_Y+n,obj); gotoxy(_X+WIDTH,_Y+n,obj); } snake.dir=R; temp=new Body; snake.head=temp; snake.head->now.x=WIDTH/2+_X; snake.head->now.y=HEIGHT/2+_Y; snake.head->last=NULL; temp=NULL; temp=new Body; snake.head->next=temp; snake.head->next->now.x=snake.head->now.x-1; snake.head->next->now.y=snake.head->now.y; snake.head->next->last=snake.head; temp=NULL; temp=new Body; snake.head->next->next=temp; snake.tail=snake.head->next->next; snake.tail->last=snake.head->next; snake.tail->next=NULL; snake.tail->now.x=snake.tail->last->now.x-1; snake.tail->now.y=snake.tail->last->now.y; snake.bodylong=3; temp=snake.head; while(temp!=NULL) { gotoxy(temp->now.x,temp->now.y,snk); temp=temp->next; } gotoxy(_X+13,_Y-2,"Please chooce level : 1 2 3 "); l=getch(); while(l!='1'&&l!='2'&&l!='3') { Sleep(20); l=getch(); } switch(l) { case 1 : level=350; case 2 : level=250; case 3 : level=150; } waitforkeyup(); clraline(_Y-2); gotoxy(_X+10,_Y+HEIGHT+1,"Press \'F\' to start----Press \'Q\' to quit"); foodpt=randpt(); while(isinsnk(foodpt)) {foodpt=randpt();} gotoxy(foodpt,food); } /*--------------画个蛇的启动画面----------------*/ void drawsnk() { char c[10]=" "; gotoxy(1,1); cout<<c<<"\n"; cout<<c<<" /^\\/\^\\"<<endl; cout<<c<<" _|__| O|"<<endl; cout<<c<<" \\/ /~ \\_/ \\"<<endl; cout<<c<<" \\____|__________/ \\"<<endl; cout<<c<<" \\_______ \\"<<endl; cout<<c<<" `\\ \\ \\"<<endl; cout<<c<<" | | \\"<<endl; cout<<c<<" / / \\"<<endl; cout<<c<<" / / \\\\"<<endl; cout<<c<<" / / \\ \\"<<endl; cout<<c<<" / / \\ \\"<<endl; cout<<c<<" / / _----_ \\ \\"<<endl; cout<<c<<" / / _-~ ~-_ | |"<<endl; cout<<c<<" \( ( _-~ _--_ ~-_ _/ |"<<endl; cout<<c<<" \\ ~-____-~ _-~ ~-_ ~-_-~ /"<<endl; cout<<c<<" ~-_ _-~ ~-_ _-~ "<<endl; cout<<c<<" ~--______-~ ~-___-~"<<endl; gotoxy(27,22,"上: W 下:S 左:A 右:D"); while(!kbhit()) { gotoxy(1,20); cout<<c<<c<<c<<" Press any key to enter"; Sleep(200); gotoxy(1,20); cout<<c<<c<<c<<c<<c<<c<<c<<c; Sleep(200); } } /*--------------移动蛇----------------*/ int move() { PT next; int statu; Body *temp; switch(snake.dir) { case U : next.x=snake.head->now.x; next.y=snake.head->now.y-1; break; case R : next.x=snake.head->now.x+1; next.y=snake.head->now.y; break; case L : next.x=snake.head->now.x-1; next.y=snake.head->now.y; break; case D : next.x=snake.head->now.x; next.y=snake.head->now.y+1; break; } if(next.x==foodpt.x&&next.y==foodpt.y) { score+=10; snake.bodylong++; temp=new Body; temp->last=NULL; temp->next=snake.head; snake.head->last=temp; temp->now=next; snake.head=temp; gotoxy(next,snk); statu=EAT; } else if(next.x>=WIDTH+_X||next.x<=_X||next.y>=HEIGHT+_Y||next.y<=_Y||isinsnk(next)) { statu=BUMP; } else { snake.bodylong++; temp=new Body; temp->last=NULL; temp->next=snake.head; snake.head->last=temp; temp->now=next; snake.head=temp; temp=snake.tail; snake.tail=snake.tail->last; snake.tail->next=NULL; gotoxy(next,snk); gotoxy(temp->now,' '); delete temp; statu=SUC; } return statu; } /*--------------主函数----------------*/ int main(int argc, char *argv[]) { int statu; snake.head=NULL; snake.tail=NULL; drawsnk(); while(1) { init(); statu=SUC; getkey(); while(key!='f'&&key!='q') { Sleep(20); getkey(); } if(key=='f') { clraline(_Y+HEIGHT+1); gotoxy(_X+10,_Y+HEIGHT+1,"Start! Press \'Q\' to quit,\'R\' to restart"); waitforkeyup(); while(key!='r'&&key!='q'&&statu!=BUMP) { waitforkeyup(); switch(key) { case 'w' : if(snake.dir!=D) snake.dir=U;break; case 's' : if(snake.dir!=U) snake.dir=D;break; case 'd' : if(snake.dir!=L) snake.dir=R;break; case 'a' : if(snake.dir!=R) snake.dir=L;break; } gotoxy(_X+11,_Y-2); cout<<"Your score is: "<<score<<" You are choose level"<<l; statu=move(); if(statu==EAT) { foodpt=randpt(); while(isinsnk(foodpt)) {foodpt=randpt();} gotoxy(foodpt,food); } delay(level); } } else { break; } } clraline(_Y-1); gotoxy(_X+26,_Y-1,"GAME OVER"); waitforkeyup(); getch(); return EXIT_SUCCESS; } /*--------------OVER----------------*/
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() ```
visual studio 2019 和 xfec 有什么区别?
在网上看到了一个贪吃蛇的项目 说实验环境是 ·xfce终端 · g++编译器 · ncurses库 用visual studio2019 能实现吗?
自己用java一个贪吃蛇,但有两个小问题,希望大神解答
我使用java和swing编写了一个贪吃蛇的程序,可以顺利运行,但有两个小问题,一直不知道如何解决。第一个是当蛇吃到随机出来的点时,蛇的长度会加1,但蛇身后面会出来一个 新的点,随着蛇移动蛇身的距离而消失;第二个问题是有时候运行游戏会不能控制,希望大神费心解答一下。 ``` package game; import java.awt.Color; public class SnakeNode {//定义蛇身集合中的各个元素点 private int x; private int y; private Color color; public SnakeNode() { super(); // TODO Auto-generated constructor stub } public SnakeNode(int x, int y, Color color) { super(); this.x = x; this.y = y; this.color = color; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } } ``` ``` package game; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Random; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; public class MainGame extends JPanel{ private final int length = 20;//定义画板的长 private final int width = 30;//定义画板的宽 private final int unit = 20;//定义单位长度 private ArrayList<SnakeNode> snake = new ArrayList<>();//定义蛇身的集合 private int Direction;//定义蛇头的方向 private int Length ;//定义蛇身的长度 private SnakeNode newNode = new SnakeNode(1,1,Color.BLACK);//定义随机点 Timer time = new Timer(100,new ThingsListener()); public int getDirection() { return Direction; } public void setDirection(int direction) { Direction = direction; } public int getLength() { return Length; } public void setLength(int length) { Length = length; } public SnakeNode getNewNode() { return newNode; } public void setNewNode(SnakeNode newNode) { this.newNode = newNode; } public MainGame() {//初始化各项数据与方法 snake.add(new SnakeNode(width/2,length/2,Color.GREEN)); snake.add(new SnakeNode(width/2,length/2,Color.BLUE)); snake.add(new SnakeNode(width/2,length/2,Color.RED)); Direction = 1;//定义初始方向为向上 Length = 3;//蛇身长度为3 CreateNode();//产生随机点 this.addKeyListener(new KeyAdapter() {//捕捉键盘的按键事件 public void keyPressed(KeyEvent e) { int direction = 0;//定义一个按下按钮后要去的方向 switch(e.getKeyCode()) { case KeyEvent.VK_UP://按下向上,返回1 direction = 1; break; case KeyEvent.VK_DOWN://按下向下,返回-1 direction = -1; break; case KeyEvent.VK_LEFT://按下相左,返回2 direction = 2; break; case KeyEvent.VK_RIGHT://按下向右,返回-2 direction = -2; break; default: break; } if(direction + Direction !=0) {//不能反向运动 Direction = direction; Move(direction); repaint(); } } }); time.start(); } public void Move(int direction) {//定义蛇身移动的方法 int FirstX = snake.get(0).getX();//获取蛇第一个点 int FirstY = snake.get(0).getY();//获取蛇第二个点 switch(direction) { case 1: FirstY--; break; case -1: FirstY++; break; case 2: FirstX--; break; case -2: FirstX++; break; default: break; } if(FirstX == newNode.getX()&&FirstY == newNode.getY()) {//当碰到随机点时 getNode(); repaint(); } for(int x = 0; x < Length; x++) {//当碰到蛇身自己时 if((FirstX==snake.get(x).getX())&&(FirstY == snake.get(x).getY())) { Dead("你碰到自己啦~~~"); } } if(FirstX < 0 || FirstX > width -1 || FirstY < 0 || FirstY > length -1) { Dead("菜鸡,你撞墙啦~~~~~"); } for(int x = Length - 1; x > 0; x--) { snake.get(x).setX(snake.get(x-1).getX()); snake.get(x).setY(snake.get(x-1).getY()); } snake.get(0).setX(FirstX); snake.get(0).setY(FirstY); repaint(); } public void getNode() { SnakeNode addNode = new SnakeNode(newNode.getX(),newNode.getY(),newNode.getColor()); snake.add(addNode); Length++; for(int x = Length-1; x >0; x--) { snake.get(x).setX(snake.get(x-1).getX()); snake.get(x).setY(snake.get(x-1).getY()); snake.get(x).setColor(snake.get(x-1).getColor()); } snake.get(0).setX(addNode.getX()); snake.get(0).setY(addNode.getY()); snake.get(0).setColor(addNode.getColor()); CreateNode(); repaint(); } public void Dead(String s) { Date date = new Date(); SimpleDateFormat sd = new SimpleDateFormat(); String str2 = sd.format(date); String str = s +"\n" +"所以说游戏不得已将结束了"; JOptionPane.showMessageDialog(this, str2 + "\n" + str ); System.exit(0); } public void CreateNode() {//创造随机点的方法 int newX = 0; int newY = 0; Boolean flag = true; while(flag) { newX = new Random().nextInt(width); newY = new Random().nextInt(length); for(int i = 0; i < Length; i++) { if(snake.get(i).getX()==newX && snake.get(i).getY()==newY) { flag = true; break; } flag= false; } } Color color = new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255)); newNode.setX(newX); newNode.setY(newY); newNode.setColor(color); snake.get(0).setColor(newNode.getColor()); } class ThingsListener implements ActionListener {//设置一个监听器事件 public void actionPerformed(ActionEvent e) { Move(Direction); repaint(); } } protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(newNode.getColor()); g.fillOval(newNode.getX()*unit, newNode.getY()*unit, unit, unit); g.setColor(newNode.getColor()); g.drawRect(0, 0, width*unit, length*unit); for(int x = 0; x < Length; x++) { g.setColor(snake.get(x).getColor()); g.fillOval(snake.get(x).getX()*unit, snake.get(x).getY()*unit, unit, unit); } } } ``` ``` package game; import java.awt.Color; import javax.swing.JFrame; public class Test { public static void main(String[] args) { JFrame frame = new JFrame("贪吃蛇————————————made by chenjiaheng"); frame.setBackground(Color.white); frame.setBounds(0,0,800,500); MainGame sn = new MainGame(); frame.add(sn); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); sn.requestFocus(); } } ```
如何做贪吃蛇的教程思想
各位大佬好,小弟最近要做一个c#贪吃蛇,使用winform窗体应用程序,要有登录窗体,连接SqlServer数据库等等, 啊,这是第一次做游戏程序,头脑有点混乱,不知该如何下手,例如摄蛇么移动,吃食物,分数的实时统计,信息录入数据库等等,望各位大佬提供一些思想,不胜感激!
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 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...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
如何防止抄袭PCB电路板
目录 1、抄板是什么 2、抄板是否属于侵权 3、如何防止抄板 1、抄板是什么 抄板也叫克隆或仿制,是对设计出来的PCB板进行反向技术研究;目前全新的定义:从狭义上来说,抄板仅指对电子产品电路板PCB文件的提取还原和利用文件进行电路板克隆的过程;从广义上来说,抄板不仅包括对电路板文件提取、电路板克隆、电路板仿制等技术过程,而且包括对电路板文件进行修改(即改板)、对电子产品外形模具进行三维...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问