程序媛小白求助:C#贪吃蛇精灵游戏

我编了一个贪吃蛇的游戏,代码如下。编译无错误,但运行后蛇不会动啊~我真的真的不知道问题出在哪儿。多谢各位大神指教~
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;

namespace GreedySnake3
{

public partial class Form2 : Form
{
    Snake snack1 = new Snake(4);
    private System.Drawing.Color foodColor = System.Drawing.Color.Red;
    Bean food = new Bean();                  
    bool play = false;                       
    bool foodDraw = false;
    private void Form2_Load(object sender, EventArgs e)
    {
           pictureBox1.Paint += pictureBox1_Paint;
           timer1.Tick+=timer1_Tick;
    }

    public Form2()
    {
        InitializeComponent();
    }



    private void button1_Click(object sender, EventArgs e)
    {
        play = true;
        this.timer1.Enabled = true;
        this.timer1.Interval = 500;


    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;            
        DrawGameFrame(e.Graphics);   

        snack1.DrawSnack(e.Graphics);   

        if (foodDraw == false)
        {
            food.GetFoodPoint();
            foodDraw = true;
        }
        food.DrawFood(e.Graphics);   

        if (play)
        {
            snack1.SnackMoce(e.Graphics);

        }
        if (this.timer1.Enabled == true)
        {
            this.button1.Focus();
        }


    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (play)
        {
            snack1.Addsnack();
        }
        if (snack1.HeadPoint == food.Origin)
        {

            foodDraw = false;
            snack1.Addsnack();



        }
        if (snack1.Diedif())
        {
            timer1.Enabled = false;
            play = false;
            MessageBox.Show("Game Over!");

        }
    }


    public void DrawGameFrame(Graphics g)
    {
        for (int i = 0; i < this.pictureBox1.Width; i += 10)
            for (int j = 0; j < this.pictureBox1.Height; j += 10)
            {
                g.FillEllipse(Brushes.LightGreen, i, j, 10, 10);
            }
    }


    private void button1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.A  && snack1.Direction != 1)
            snack1.Direction = 2;
        else if (e.KeyCode == Keys.D && snack1.Direction != 2)
            snack1.Direction = 1;
        else if (e.KeyCode == Keys.W && snack1.Direction != 4)
            snack1.Direction = 3;
        else if (e.KeyCode == Keys.S && snack1.Direction != 3)
            snack1.Direction = 4;


    }



    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
    }




}
public class Bean
{
    Point origin=new Point(100,100);
    public Point Origin
    {
        get { return origin; }
        set { origin = value; }
    }
    public void GetFoodPoint()
        {
            Random random = new Random();
            int x = random.Next(1, 40)*10;
            int y = random.Next(1, 30)*10;
            origin = new Point(x, y);
        }
        public void DrawFood(Graphics g)
        {
            g.FillEllipse(Brushes.Red, origin.X, origin.Y, 10, 10);
        }
    }



public class Snake
{
    public Point startPoint = new Point(0, 0);
    Point addPoint;
    public ArrayList snackPoint = new ArrayList();
    Point headPoint;
    public Point HeadPoint
    {
        get { return headPoint; }
        set { headPoint = value; }
    }
    int direction = 1;
    public int Direction
    {
        get { return direction; }
        set { direction = value; }
    }


    public Snake(int lenth)
    {
        for (int i = 0; i < lenth; i++)
        {
            snackPoint.Add(startPoint);
            if (i == lenth - 1)
            {
                HeadPoint = startPoint;
                return;
            }
            startPoint = new Point(startPoint.X + 10, startPoint.Y);
        }
    }
    public void DrawSnack(Graphics g)
    {
        for (int i = 0; i < snackPoint.Count; i++)
        {
            g.FillEllipse(Brushes.Blue, ((Point)snackPoint[i]).X, ((Point)snackPoint[i]).Y, 10, 10);
        }
    }

    public void Addsnack()
    {
        if (direction == 1)
            addPoint = new Point(headPoint.X + 10, headPoint.Y);
        else if (direction == 2)
            addPoint = new Point(headPoint.X - 10, headPoint.Y);
        else if (direction == 3)
            addPoint = new Point(headPoint.X, headPoint.Y - 10);
        else if (direction == 4)
            addPoint = new Point(headPoint.X, headPoint.Y + 10);
        snackPoint.Add(addPoint);
        headPoint = addPoint;
    }


    public void RemoveSnackNode()
    {
        snackPoint.RemoveAt(0);
    }


    public void SnackMoce(Graphics g)
    {
        DrawSnack(g);
        RemoveSnackNode();
    }

    public bool Diedif()
    {
        for (int i = 0; i < snackPoint.Count - 1; i++)
        {
            if ((Point)snackPoint[i] == headPoint)
                return true;
        }

        if (headPoint.X < 0 || headPoint.X > 400 || headPoint.Y < 0 || headPoint.Y > 300)
            return true;
        return false;
    }
}

}

4个回答

pictureBox1 的paint 事件不会时时触发 在timer1_tick中添加 pictureBox1.Refresh(); 让它定时触发paint 重新绘制自己
private void timer1_Tick(object sender, EventArgs e)
{
if (play)
{
pictureBox1.Refresh();
snack1.Addsnack();

        }
        if (snack1.HeadPoint == food.Origin)
        {
            pictureBox1.Refresh();
            foodDraw = false;
            snack1.Addsnack();



        }
        if (snack1.Diedif())
        {
            pictureBox1.Refresh();
            timer1.Enabled = false;
            play = false;
            MessageBox.Show("Game Over!");

        }
    }

你的代码是直接复制粘贴的么?选中你的PictureBox1,在属性窗格里点闪电按钮,看Paint事件关联给pictureBox1_Paint了没有。

你的timer好像没有start

patricia1997
patricia1997 谢谢~在Form2_load里加了start之后还是不动
接近 4 年之前 回复

图片说明没有错误么

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何做贪吃蛇的教程思想
各位大佬好,小弟最近要做一个c#贪吃蛇,使用winform窗体应用程序,要有登录窗体,连接SqlServer数据库等等, 啊,这是第一次做游戏程序,头脑有点混乱,不知该如何下手,例如摄蛇么移动,吃食物,分数的实时统计,信息录入数据库等等,望各位大佬提供一些思想,不胜感激!
C#WINform的贪吃蛇程序,请问如何改初始长度?
代码是网上找的,我没找到设置初始长度的代码,能帮我看下吗 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 //蛇身初始状态,吃的算法 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } public class 蛇 { public static int D; public static int s=2; } void Add_food() //添加食物 { Label label = new Label(); label.Name = "Lab" + 蛇.s; label.BackColor = System.Drawing.Color.Red; label.Size = new System.Drawing.Size(10, 10); label.Margin = new System.Windows.Forms.Padding(0); label.ForeColor = System.Drawing.Color.Red; label.AutoSize = false; label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; Random rd = new Random(); tag1: label.Location = new System.Drawing.Point(rd.Next(0, 30) * 10, rd.Next(0, 30) * 10); for (int i = 1; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; if (label.Location == lo.Location) goto tag1; } this.Controls.Add(label); label.SendToBack(); panel1.SendToBack(); } private void button1_Click(object sender, EventArgs e) { Add_food(); } private void timer1_Tick(object sender, EventArgs e) { if (蛇.D == 1) { System.Windows.Forms.SendKeys.Send("{S}"); return; } if (蛇.D == 2) { System.Windows.Forms.SendKeys.Send("{W}"); return; } if (蛇.D == 3) { System.Windows.Forms.SendKeys.Send("{A}"); return; } if (蛇.D == 4) { System.Windows.Forms.SendKeys.Send("{D}"); return; }; } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.S && 蛇.D != 2) { timer1.Enabled = false; 蛇.D = 1; Label lb = (Label)this.Controls.Find("Lab" + 蛇.s, true)[0]; Label lbl = (Label)this.Controls.Find("Lab" + (蛇.s - 1), true)[0]; Point[,] Lo = new Point[101, 101]; for (int i = 1; i <= 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; Lo[i, i] = new Point(lo.Location.X, lo.Location.Y); } Label le = new Label(); le.Visible = false; if (e.KeyCode == Keys.S && 蛇.s > 2 && lbl.BackColor != System.Drawing.Color.Red && lab1.Location.Y != 290) { for (int i = 2; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; lo.Location = Lo[i - 1, i - 1]; } } if (lb.Location == new System.Drawing.Point(lab1.Location.X, lab1.Location.Y + 10)) { lb.BackColor = System.Drawing.Color.Black; le.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y); lab1.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y + 10); lb.Location = le.Location; this.Controls.Remove(le); 蛇.s++; Add_food(); timer1.Enabled = true; return; } for (int i = 1; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; if (lo.Location == new System.Drawing.Point(lab1.Location.X, lab1.Location.Y + 10)) { timer1.Enabled = false; MessageBox.Show("游戏结束!", "提示"); return; }; ; } if (e.KeyCode == Keys.S && lab1.Location.Y == 290) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:" + Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; lab1.Top = lab1.Top + 10; timer1.Enabled = true; } if (e.KeyCode == Keys.W && 蛇.D != 1) { timer1.Enabled = false; 蛇.D = 2; Label lb = (Label)this.Controls.Find("Lab" + 蛇.s, true)[0]; Label lbl = (Label)this.Controls.Find("Lab" + (蛇.s - 1), true)[0]; Point[,] Lo = new Point[101, 101]; for (int i = 1; i <= 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; Lo[i, i] = new Point(lo.Location.X, lo.Location.Y); } Label le = new Label(); le.Visible = false; if (e.KeyCode == Keys.W && 蛇.s > 2 && lbl.BackColor != System.Drawing.Color.Red && lab1.Location.Y != 0) { for (int i = 2; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("lab" + i, true)[0]; lo.Location = Lo[i - 1, i - 1]; } } if (lb.Location == new System.Drawing.Point(lab1.Location.X, lab1.Location.Y - 10)) { lb.BackColor = System.Drawing.Color.Black; le.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y); lab1.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y - 10); lb.Location = le.Location; this.Controls.Remove(le); 蛇.s++; Add_food(); timer1.Enabled = true; return; } for (int i = 1; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; if (lo.Location == new System.Drawing.Point(lab1.Location.X, lab1.Location.Y - 10)) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:" + Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; } if (e.KeyCode == Keys.W && lab1.Location.Y == 0) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:" + Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; lab1.Top = lab1.Top - 10; timer1.Enabled = true; } if (e.KeyCode == Keys.A && 蛇.D != 4) { timer1.Enabled = false; 蛇.D = 3; Label lb = (Label)this.Controls.Find("Lab" + 蛇.s, true)[0]; Label lbl = (Label)this.Controls.Find("Lab" + (蛇.s - 1), true)[0]; Point[,] Lo = new Point[101, 101]; for (int i = 1; i <= 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; Lo[i, i] = new Point(lo.Location.X, lo.Location.Y); } Label le = new Label(); le.Visible = false; if (e.KeyCode == Keys.A && 蛇.s > 2 && lbl.BackColor != System.Drawing.Color.Red && lab1.Location.X != 0) { for (int i = 2; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; lo.Location = Lo[i - 1, i - 1]; } } if (lb.Location == new System.Drawing.Point(lab1.Location.X - 10, lab1.Location.Y)) { lb.BackColor = System.Drawing.Color.Black; le.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y); lab1.Location = new System.Drawing.Point(lab1.Location.X - 10, lab1.Location.Y); lb.Location = le.Location; this.Controls.Remove(le); 蛇.s++; Add_food(); timer1.Enabled = true; return; } for (int i = 1; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; if (lo.Location == new System.Drawing.Point(lab1.Location.X - 10, lab1.Location.Y)) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:" + Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; } if (e.KeyCode == Keys.A && lab1.Location.X == 0) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:"+Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; lab1.Left = lab1.Left - 10; timer1.Enabled = true; } if (e.KeyCode == Keys.D && 蛇.D != 3) { timer1.Enabled = false; 蛇.D = 4; Label lb = (Label)this.Controls.Find("Lab" + 蛇.s, true)[0]; Label lbl = (Label)this.Controls.Find("Lab" + (蛇.s - 1), true)[0]; Point[,] Lo = new Point[101, 101]; for (int i = 1; i <= 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; Lo[i, i] = new Point(lo.Location.X, lo.Location.Y); } Label le = new Label(); le.Visible = false; if (e.KeyCode == Keys.D && 蛇.s > 2 && lbl.BackColor != System.Drawing.Color.Red && lab1.Location.X != 290) { for (int i = 2; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; lo.Location = Lo[i - 1, i - 1]; } } if (lb.Location == new System.Drawing.Point(lab1.Location.X + 10, lab1.Location.Y)) { lb.BackColor = System.Drawing.Color.Black; le.Location = new System.Drawing.Point(lab1.Location.X, lab1.Location.Y); lab1.Location = new System.Drawing.Point(lab1.Location.X + 10, lab1.Location.Y); lb.Location = le.Location; this.Controls.Remove(le); 蛇.s++; Add_food(); timer1.Enabled = true; return; } for (int i = 1; i < 蛇.s; i++) { Label lo = (Label)this.Controls.Find("Lab" + i, true)[0]; if (lo.Location == new System.Drawing.Point(lab1.Location.X + 10, lab1.Location.Y)) { timer1.Enabled = false; MessageBox.Show("游戏结束!", "提示"); return; }; ; } if (e.KeyCode == Keys.D && lab1.Location.X == 290) { timer1.Enabled = false; MessageBox.Show("游戏结束,本次得分为:"+Convert.ToString(蛇.s-1), "提示"); Application.Exit(); }; lab1.Left = lab1.Left + 10; timer1.Enabled = true; } } private void 开始ToolStripMenuItem_Click(object sender, EventArgs e) { Add_food(); } private void 简单ToolStripMenuItem_Click(object sender, EventArgs e) { timer1.Interval = 150; } private void 困难ToolStripMenuItem_Click(object sender, EventArgs e) { timer1.Interval = 20; } private void 一般ToolStripMenuItem_Click(object sender, EventArgs e) { timer1.Interval = 80; } private void 暂停ToolStripMenuItem_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(1000); MessageBox.Show("继续?", ""); } private void 结束ToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } } }
visual studio 2019 和 xfec 有什么区别?
在网上看到了一个贪吃蛇的项目 说实验环境是 ·xfce终端 · g++编译器 · ncurses库 用visual studio2019 能实现吗?
求助:基于liunx的多线程小游戏
最近需要做一个基于liunx的多线程小游戏,看了很多都只看到有贪吃蛇。希望各位大神能帮我想一下还有什么多线程的小游戏,最好能给我一个例子(代码和解释)。跪谢各位大神!!!
C语言贪吃蛇小游戏的一些问题
做个贪吃蛇游戏,想实现这样的功能:假如在10秒内玩家没能操控蛇吃到食物,那么食物就会刷新,重新出现在另一个坐标。不知道如何实现这样的功能。用Sleep()延迟函数可以吗
java贪吃蛇怎样设置向左时不能向右
package moonsake; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class MPanel extends JPanel implements KeyListener/*实现接口KeyListener开始监听键盘输入*/ ,ActionListener{ private ImageIcon title = new ImageIcon("title.jpg"); private ImageIcon right = new ImageIcon("right.png"); private ImageIcon body = new ImageIcon("body.png"); private ImageIcon down = new ImageIcon("down.png"); private ImageIcon left = new ImageIcon("left.png"); private ImageIcon up = new ImageIcon("up.png"); private ImageIcon food = new ImageIcon("food.png"); int len = 3;//长度 int score = 0;//分数 private static int speed =150; int[] snakex = new int[750]; int[] snakey = new int[750]; String fx = "R"; //反向R, L, U, D boolean isStared = false;//暂停字体 boolean isEnd = false;//结束 boolean flag = false; Timer timer = new Timer( speed,this); int foodx; int foody; Random rand = new Random(); public MPanel(){ initsnake(); //设置焦点为自己 this.setFocusable(true); //设置自己为键盘监听对象 this.addKeyListener(this); timer.start(); foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } public void initsnake() { len = 3; snakex[0] = 100; snakey[0] = 100; snakex[1] = 75; snakey[1] = 100; snakex[2] = 50; snakey[2] = 100; fx = "R"; score = 0; } public void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.WHITE); title.paintIcon(this, g, 25, 11); g.fillRect(25,75 , 850, 600); g.drawString("长度:"+len, 750, 35); g.drawString("分数:"+score, 750, 50); //暂停语句 if(isStared == false) { g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("Press Space to Start!!!", 225, 300); } //结束语句 if(!isEnd == false) { g.setColor(Color.RED); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("END: Press Space to Restart!!!", 175, 300); } //画蛇头 switch (fx) { case "R": right.paintIcon(this, g, snakex[0], snakey[0]); break; case "L": left.paintIcon(this, g, snakex[0], snakey[0]); break; case "U": up.paintIcon(this, g, snakex[0], snakey[0]); break; case "D": down.paintIcon(this, g, snakex[0], snakey[0]); break; } //食物 food.paintIcon(this, g, foodx, foody); //循环画出蛇身体 for(int i=1; i<len; i++) { body.paintIcon(this, g, snakex[i], snakey[i]); } } @Override public void keyTyped(KeyEvent e) { } //监听按下空格键 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if(keyCode == KeyEvent.VK_SPACE) { if(isEnd) {//重新开始 isEnd = !isEnd; initsnake(); }else { isStared = !isStared; } repaint(); }else if(keyCode == KeyEvent.VK_RIGHT) { fx = "R"; }else if(keyCode == KeyEvent.VK_LEFT) { fx = "L"; }else if(keyCode == KeyEvent.VK_UP) { fx = "U"; }else if(keyCode == KeyEvent.VK_DOWN) { fx = "D"; } } @Override public void keyReleased(KeyEvent e) { } //移动蛇 @Override public void actionPerformed(ActionEvent e) { //实现空格暂停 if(isStared && !isEnd) { //画蛇身体 for(int i=len-1; i>0; i--) { snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //画蛇头 //实现头的移动 switch (fx) { case "R": snakex[0] = snakex[0] + 25; if(snakex[0] >850) isEnd = !isEnd;//当蛇到边界时,重新开始 break; case "L": snakex[0] = snakex[0] - 25; if(snakex[0] <25) isEnd = !isEnd; break; case "U": snakey[0] = snakey[0] - 25; if(snakey[0] <75) isEnd = !isEnd; break; case "D": snakey[0] = snakey[0] + 25; if(snakey[0] >650) isEnd = !isEnd; break; } //蛇吃食物长大 if(snakex[0] == foodx && snakey[0] == foody) { len++; score +=10; speed -=30; foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } //检测蛇是否重叠 for(int i=1; i<len; i++) { if(snakex[i] == snakex[0] && snakey[i] == snakey[0]) { isEnd = !isEnd; } } repaint(); } timer.start(); } }
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++贪吃蛇程序
#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
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; } ```
我的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贪吃蛇"); } } ```
贪吃蛇游戏源程序有了,不知如何封装?求大神解答
/*------------------------------ 贪吃蛇 *------------------------------*/ #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----------------*/
急求一个Java小程序,可用eclipse以及JDK运行,比如贪吃蛇啥啥小游戏都行,很着急!
急求一个Java小程序,可用eclipse以及JDK运行,比如贪吃蛇啥啥小游戏都行,很着急!
关于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; }
Python代码哪里错了??怎么可以运行??
#!/usr/bin/env python #_*_ coding: utf-8 _*_ # pygame游戏库 sys操控python运行时的环境 import pygame,sys,random #这个模块包含各种pygame所使用的常量 from pygame.locals import * #1.定义颜色变亮 #0-255 0黑色 255白色 redColor = pygame.Color(255,0,0) #背景为黑色 blackColor = pygame.Color(0,0,0) #贪吃蛇为白色 whiteColor = pygame.Color(255,255,255) #2.定义游戏结束的函数 def gameOver(): pygame.quit() sys.exit() #3.定义main函数-->定义我们的入口函数 用户 def mian(): #3.1初始化pygame pygame.init() #3.2定义一个变量来控制速度 fpsClock = pygame.time.Clock() #3.3>创建pygame显示层,说白了创建一个界面 playSurface = pygame.display.set_mode((640,480)) pygame.display.set_caption('贪吃蛇') #3.4>初始化变量 #初始化贪吃蛇的起始坐标位置 我们以(100,100)为基准 snakePosition = [100,100] #初始化贪吃蛇的长度列表中有几个元素就代表有几段身体 snakeBody =[[100,100],[100,100][60,100]] #初始化目标方块的位置 targetPosition = [300,300] #目标方块的标记 目的:判断是否吃掉了这个目标方块,1就是没有吃掉, 0 吃掉 targetflag = 1 #初始化方向 --> 往右 direction = 'right' #定义一个方向变量(人为控制 案件有关系) changeDirection = direction #以上为准备工作 #3.5>pygame中 while Ture: for event in pygame.event.get(): #从队列中获取事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: if event.key == K_RIGHT: changeDirection = 'right' if event.key == K_LIFT: changeDirection = 'left' if event.key == K_UP: changeDirection = 'up' if event.key == K_DOWN: changeDirection = 'down' # 对应该键盘上的Esc if event.key == K_ESCAPE: pygame.event.post(pygame.event.Event(QUIT)) #3.6>确定方向 if changeDirection == 'left' and not direction == 'right': direction = changeDirection if changeDirection == 'right' and not direction == 'left': direction = changeDirection if changeDirection == 'up' and not direction == 'down': direction = cahngeDirection if changeDirection == 'down' and not direction == 'up': direction = changeDirection #3.7>根据方向移动蛇头 if direction == 'right': snakePosition[0] += 20 if direction == 'left': snakePosition[0] += 20 if direction == 'up' : snakePosition[0] +=20 if direction == 'down': snakePosiotion[0] += 20 #3.8增加蛇的长度 snakeBody.insert(0,list(snakePosition)) #如果贪吃蛇的位置和目标方块的位置重合 意味着蛇吃掉它了 目标方块为0 if snakePosition[0] == targetPosition[0] and snakePosition[1] == targetPosition[1]: targetflag = 0 else: snakBody.pop() if targetflag == 0: x= random.randrange(1,32) y = random.randrange(1,24) targetPosition = [int(x*20),int(y*20)] targetflag = 1 #3.9填充背景颜色 playSurface.fill(blackColor) for position in snakeBody: #画蛇 pygame.draw.rect(playSurface,whiteColor,Rect(position[0],position[1],20,20)) #画目标方块 pygame.draw.rect(playSurface,redColor,redColor, Rect(targetPosition[0],targetPosition[1],20,20)) #第一个参数surface:指定一个surface,在这个区域内控制,界面 #第二个参数color:颜色 #第三个参数 Rect:返回一个矩形((x,y), (width,height)) #第四个参数 width:标示线条的粗细 width=0填充 实心儿 width= 1空心儿 #4.更新显示到屏幕表面 pygame.display.flip() #判断是否游戏结束 if snakePosition[0] > 620 or snakePosition[0] < 0: gameOver() elif snakePosition[1] > 460 or sankePosition[1] < 0: gameOver() #控制游戏速度 fpsClock.tick(5) #5.启动这个入口函数 if __name__ == "__main__": main()
c++ 怎么从键盘上获取方向键
本人小白 想编一个简单的贪吃蛇游戏 但不知道怎么从键盘获取方向键 求教 最好有列子
贪吃蛇游戏:为什么我按住方向键不放时,我的贪吃蛇像卡的一样
``` package game; import java.awt.Button; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; public class Window extends JFrame implements Runnable { static int x1 = 500;// 蛇头横坐标 static int y1 = 400;// 蛇头纵坐标 Button b[] = new Button[50];// 蛇数组 Button fruit = new Button();// 水果 boolean flag = true;// 判断是否吃到果实 int x, y;// 水果坐标 Thread t; int reverse;// 方向 boolean reve = true;// 方向标志 public Window() { t = new Thread(this); b[0] = new Button();// 蛇头 b[0].setBounds(x1, y1, 20, 20); b[0].setBackground(Color.blue); add(b[0]); for (int i = 1; i < 50; i++) { b[i] = new Button();// 蛇长度 } if (flag) {// 水果的随机位置 while (flag) { x = (int) (25 + Math.random() * 1175); y = (int) (1 + Math.random() * 800); System.out.println("x-->" + x); System.out.println("y-->" + y); fruit.setBounds(x, y, 20, 20); fruit.setBackground(Color.yellow); add(fruit); flag = false; } } setLayout(null); setTitle("Retro Snaker"); setSize(1200, 800); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void run() { while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } switch (reverse) { case 0:// 上 { y1 -= 20; b[0].setBounds(x1, y1, 20, 20); break; } case 1:// 下 { y1 += 20; b[0].setBounds(x1, y1, 20, 20); break; } case 2:// 左 { x1 -= 20; b[0].setBounds(x1, y1, 20, 20); break; } case 3:// 右 { x1 += 20; b[0].setBounds(x1, y1, 20, 20); break; } default: break; } } } } class Move extends Window implements ActionListener, KeyListener { Window w; Button go;// 开始按键 public Move() { go = new Button("开始"); go.setBounds(25, 0, 50, 25); go.addActionListener(this); add(go); } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) {// 上 y1 -= 20; reverse = 0; System.out.println("上"); } if (e.getKeyCode() == KeyEvent.VK_DOWN) {// 下 y1 += 20; reverse = 1; System.out.println("下"); } if (e.getKeyCode() == KeyEvent.VK_LEFT) {// 左 x1 -= 20; reverse = 2; System.out.println("左"); } if (e.getKeyCode() == KeyEvent.VK_RIGHT) {// 右 x1 += 20; reverse = 3; System.out.println("右"); } this.repaint(); } public void keyReleased(KeyEvent e) { } public void actionPerformed(ActionEvent e) { if (e.getSource() == go) { t.start(); go.addKeyListener(this); } } } ```
JVAV写贪吃蛇小游戏,用线程实现窗口重绘,然后用键盘指令改变小蛇的方向,请问怎么让小蛇只根据指令移动?
![图片说明](https://img-ask.csdn.net/upload/201906/05/1559710703_639058.png) 现在的程序能够实现通每隔200ms小蛇自动往前跑一格,通过键盘指令能够改变方向,但是我不想让它自动跑,只想实现给它指令它才移动,请问怎么实现? 这是蛇的活动类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Timer; /** * 这个类代表贪吃蛇的活动场所 * @author * @version */ public class Yard extends Frame { /* * 画图的线程 * */ Timer timer = new Timer(); PaintThread paintThread = new PaintThread(); private boolean gameOver = false; //游戏是否结束 /** * 行数 */ public static final int ROWS = 30; /* * 列数 * */ public static final int COLS = 30; /* * 活动区域大小 * */ public static final int BLOCK_SIZE = 15; //设置显示字属性 private Font fontGameOver = new Font("宋体", Font.BOLD, 50); //分数 private int score = 0; /* * 记录开始时候的时间 * */ private long beginTime=0; /* *实例化Snake和Egg的对象 * */ Snake s = new Snake(this); Egg e = new Egg(); /* * 抽象类 Image 是表示图形图像的所有类的超类。 * 必须以特定于平台的方式获取图像。 * */ Image offScreenImage = null; /* * 此函数的功能是:设置窗口的大小、位置、可见,以及点击事件和键盘事件,最后开启了绘图线程 * */ public void launch() { /* * 指定窗口的位置,窗口的左上角的位置为(90,10).是相对父窗口的相对位置 * */ this.setLocation(90, 10); /* * 设定窗口的大小 * 宽度width:COLS*BLOCK_SIZE * 高度hight:ROWS*BLOCK_SIZE * */ this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 为窗口添加监听器 * */ this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); /* * 将窗口设置可见 * */ this.setVisible(true); /* * 为窗口添加键盘事件 * */ this.addKeyListener(new KeyMonitor()); new Thread(paintThread).start(); } public static void main(String[] args) { Yard y=new Yard(); y.beginTime=System.currentTimeMillis(); y.launch(); } /* * 将变量gameOver设置为true,使得在paint()函数中将使得线程停止 * */ public void stop() { gameOver = true; } @Override public void paint(Graphics g) { /* * 获取此图形上下文的颜色 * */ Color c = g.getColor(); /* * 指定图形上下文的颜色 * */ g.setColor(Color.GRAY); /* * 用当前的颜色来填充指定的区域 * */ g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 再一次的指定颜色为:黑灰色???????为什么要再一次的设定??? * 原因在于:我们想将绘图的颜色与文字显示的不一样 * */ g.setColor(Color.DARK_GRAY); //画出横线 /* * drawLine(int x1, int y1, int x2, int y2) * 函数的功能为: * 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 * 通过下面的两个for循环就会在图形化对象上画出表格 * */ for(int i=1; i<ROWS; i++) { g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i); } for(int i=1; i<COLS; i++) { g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS); } g.setColor(Color.YELLOW);//设定颜色,为下面显示文字信息做准备 /* * drawString(String str, int x, int y) *使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。 * */ g.drawString("使用说明:使用方向键控制方向,F1--停止,F2--停止后恢复,F5--重新开始" , 10, 40); g.drawString("目前分数:" + score, 10, 60); g.drawString("加分规则:每吃一个加5分,加油!" , 10, 80); g.drawString("已经使用的时间:"+(System.currentTimeMillis()-beginTime)/1000 , 10, 100); /* * 检测游戏是否结束,当游戏结束时,则提示游戏“game over”,而且将界面恢复到初始界面的状态,且终止绘图线程 * */ if(gameOver) { g.setFont(fontGameOver); g.drawString("game over!", 90, 170); g.drawString("在玩一次,请按F5", 10, 250); g.drawString(" ", 200, 230);//???这个用意何在?? paintThread.pause(); } if(score>100) { g.drawString("好棒!!!", 90, 170); g.drawString("你已经超过"+score+",继续加油", 10, 230); } /* * 将图形界面设置为刚开始的颜色 * */ g.setColor(c); s.eat(e); e.draw(g); s.draw(g); } @Override public void update(Graphics g) { if(offScreenImage == null) { /* * public Image createImage(int width, * int height) * 创建一幅用于双缓冲的、可在屏幕外绘制的图像 * */ offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); } /* * getGraphics() *创建供绘制闭屏图像(off-screen image)使用的图形上下文。 * */ Graphics gOff = offScreenImage.getGraphics(); paint(gOff); /* * drawImage(Image img, int x, int y, ImageObserver observer) * 绘制指定图像中当前可用的图像。 * */ g.drawImage(offScreenImage, 0, 0, null); } private class PaintThread implements Runnable { private boolean running = true; private boolean pause = false; public void run() { while(running) {//线程将一直处于运行当中,只有在游戏结束的时候 if(pause) continue; else repaint();//如果组件是轻量级组件,则会尽快调用paint()方法或者是调用update() try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public void pause() { this.pause = true; } public void reStart() { this.pause = false; s = new Snake(Yard.this); gameOver = false; score=0; } public void gameOver() { running = false; } } /* * 此函数的功能为:检测我们是否按下F2,若按下,则重新启动线程,即重新开始游戏 * */ private class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F5) { paintThread.reStart();//重新开始游戏 } else if(key==KeyEvent.VK_F1){ paintThread.pause=true;//暂停 } else if(key==KeyEvent.VK_F2){ paintThread.pause=false;//从暂停中恢复 } s.keyPressed(e); } } /** * 拿到所得的分数 * @return 分数 */ public int getScore() { return score; } /** * 设置所得的分数 * @param score 分数 */ public void setScore(int score) { this.score = score; } } ``` 这是小蛇类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; /** * 代表蛇 * @author * */ public class Snake { /* * 头结点 * */ private Node head = null; /* * 尾结点 * */ private Node tail = null; /* * 大小 * */ private int size = 0; /* * 开始游戏时: * 初始位置:(20,30) * 初始运动方向:Dir.L * */ private Node n = new Node(20, 30, Dir.L); /* * Yard的对象属性; * */ private Yard y; /* * 构造函数 * */ public Snake(Yard y) { /* * 将初始结点给头结点和尾结点,size初始化为 1, * */ head = n; tail = n; size = 1; this.y = y; } /* * 节点类 * */ private class Node { int w = Yard.BLOCK_SIZE; int h = Yard.BLOCK_SIZE; int row , col; Dir dir = Dir.L; Node next = null; Node prev = null; Node(int row, int col, Dir dir) { this.row = row; this.col = col; this.dir = dir; } void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLACK); g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h); g.setColor(c); } } // 从尾加,代码与下面一个函数的代码功能相似,这里不再分析 public void addToTail() { Node node = null; switch(tail.dir) { case L : node = new Node(tail.row, tail.col + 1, tail.dir); break; case U : node = new Node(tail.row + 1, tail.col, tail.dir); break; case R : node = new Node(tail.row, tail.col - 1, tail.dir); break; case D : node = new Node(tail.row - 1, tail.col, tail.dir); break; } tail.next = node; node.prev = tail; tail = node; size ++; } // 从头加,下面的代码比较简单,相信大家应该都能理解 public void addToHead() { Node node = null; switch(head.dir) { case L : node = new Node(head.row, head.col - 1, head.dir); break; case U : node = new Node(head.row - 1, head.col, head.dir); break; case R : node = new Node(head.row, head.col + 1, head.dir); break; case D : node = new Node(head.row + 1, head.col, head.dir); break; } // node.next = head; // head.prev = node; // head = node; /* * 上面这种写法与下面这种写法一致,不过下面这种写法我更容易理解 * */ head.prev=node; node.next=head; head=node; size ++; } public void draw(Graphics g) { if(size <= 0) return; move(); for(Node n = head; n != null; n = n.next) { n.draw(g); } } /* * 移动过程所要做的操作:在运动方向增加一个节点,在尾部减去一个节点,并且检测是否已经死亡 * */ private void move() { addToHead(); deleteFromTail(); checkDead(); } private void checkDead() { if(head.row < 2 || head.col < 0 || head.row > Yard.ROWS || head.col > Yard.COLS) { y.stop(); } /* * 头节点与身体的某一个节点相撞,也标志着结束 * */ for(Node n = head.next; n != null; n = n.next) { if(head.row == n.row && head.col == n.col) { y.stop(); } } } /* * 删除尾节点 * */ private void deleteFromTail() { if(size == 0) return; tail = tail.prev; tail.next = null; } public void eat(Egg e) { /* * boolean intersects(Rectangle r) * 确定此 Rectangle 是否与指定的 Rectangle 相交。 * 若相交,表示我们吃到了一个点 ,则导致蛇的长度变长并且在出现一个点,并且加5分,否则什么也不做 * */ if(this.getRect().intersects(e.getRect())) { e.reAppear(); this.addToHead(); //吃了加5分 y.setScore(y.getScore() + 5); } } private Rectangle getRect() { /* * 构造了一个格子大小的区域 * */ return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE * head.row, head.w, head.h); } /* * 接收从键盘的按键事件,然后采取相应的解决方案 * */ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT : /* * 当按键为左的时候,只要前进方向不是右,即可转向 * */ if(head.dir != Dir.R) head.dir = Dir.L; break; case KeyEvent.VK_UP : /* * 当按键为"上",只要前进方向不是"下",就可以转向 * */ if(head.dir != Dir.D) head.dir = Dir.U; break; case KeyEvent.VK_RIGHT : /* * 当按键为"右"的时候,只要前进方向不是"左",就可以转向 * */ if(head.dir != Dir.L) head.dir = Dir.R; break; case KeyEvent.VK_DOWN : /* * 当按键为"下"的时候,只要前进方向不是"上",就可以转向 * */ if(head.dir != Dir.U) head.dir = Dir.D; break; } } } ``` 求大神解答 hen'ji
纯C贪吃蛇运行有时会卡死,求大佬帮助?
#include<stdio.h> #include<time.h> #include<windows.h> #include<conio.h> #define U 1 //上 #define D 2 //下 #define L 3 //左 #define R 4 //右 typedef struct SNAKE //蛇身的一个节点 { int x; int y; struct SNAKE *next; }snake; /*****全局变量定义*****/ short c; //颜色设置 int score=0,add=10; //总得分与每次吃食物得分 int status,sleeptime=200; //每次运行的时间间隔 snake *head, *food; //蛇头指针,食物指针 snake *q; //遍历蛇的时候用到的指针 int endgamestatus=0; //游戏结束的情况 1:撞到墙;2:咬到自己;3:主动退出游戏 /******函数声明******/ void Pos(int x,int y); //设置光标位置 void color(short x) ; //颜色 void welcometogame(); //开始界面 void snakecolor(); //蛇身颜色选择 void createMap(); //创建地图 void scoreandtips(); //游戏界面右侧的得分和小提示 void newsnake(); //初始化蛇身 void createfood(); //生成食物 int biteself(); //判断是否咬到了自己 void cantcrosswall(); //设置蛇撞墙的情况 void speedup(); //加速 void speeddown(); //减速 void snakemove(); //控制蛇前进方向 void keyboardControl(); //控制键盘按键 void endgame(); //游戏结束 void choose(); //游戏失败之后的选择 void explation(); //游戏说明 void color(short x) ; //颜色 void snakecolor(); //蛇身颜色选择 /*****光标定位*****/ void Pos(int x,int y)//设置光标位置 { COORD pos; HANDLE handle; CONSOLE_CURSOR_INFO cci; pos.X=x; pos.Y=y; handle=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(handle,pos); GetConsoleCursorInfo(handle,&cci); cci.bVisible = 0; SetConsoleCursorInfo(handle,&cci); } /****颜色****/ void color(short c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色 } /****开始界面****/ void welcometogame() { int n; color(11); Pos(43,10); printf("贪 吃 蛇"); Pos(25, 22); printf("1.开始游戏"); Pos(45, 22); printf("2.游戏说明"); Pos(65, 22); printf("3.退出游戏"); Pos(40,25); printf("请选择 1 2 3:"); scanf("%d", &n); //输入选项 switch (n) { case 1: system("cls"); snakecolor(); system("cls"); createMap(); //创建地图 newsnake(); //初始化蛇身 createfood(); //创建食物 keyboardControl(); //按键控制 break; case 2: explation(); //游戏说明函数 break; case 3: exit(0); //退出游戏 break; default: color(4); Pos(40,26); printf("请输入1—3之间的数!"); Pos(40,27); printf("按任意键继续"); getch(); //输入任意键 system("cls"); //清屏 welcometogame(); } } /****蛇身颜色选择****/ void snakecolor() { Pos(41,10); printf("请选择蛇的颜色\n"); Pos(37,12); color(1); printf("蓝色--1\n"); Pos(51,12); color(2); printf("绿色--2\n"); Pos(37,14); color(4); printf("红色--4\n"); Pos(51,14); color(5); printf("紫色--5\n"); Pos(37,16); color(6); printf("黄色--6\n"); Pos(51,16); color(7); printf("白色--7\n"); Pos(37,18); color(4); printf("请输入颜色后对应数字:"); scanf("%d",&c); if(c!=1&&c!=2&&c!=4&&c!=5&&c!=6&&c!=7) { Pos(37,19); printf("请输入正确的数字!"); Pos(37,20); printf("按任意键继续"); getch(); system("cls"); snakecolor(); } } /****创建地图****/ void createMap() { int i, j; for(i=0;i<58;i+=2)//打印上下边界 { Pos(i,0); color(2); printf("□"); Pos(i,26); printf("□"); } for(i=1;i<26;i++)//打印左右边界 { Pos(0,i); printf("□"); Pos(56,i); printf("□"); } for(i = 2;i<56;i+=2) //打印中间网格 { for(j = 1;j<26;j++) { Pos(i,j); color(3); printf("■"); } } } /****得分及提示****/ void scoreandtips() { Pos(64,8); color(2); printf("得分:%d ",score); Pos(64,14); printf("每个食物得分:%d分",add); Pos(64,16); printf("不能穿墙,不能咬到自己"); Pos(64,18); printf("用↑ ↓ ← →分别控制蛇的移动"); Pos(64,20); printf("游戏速度会随吃到食物而加快"); Pos(64,22); printf("F1 为加速,F2 为减速"); Pos(64,24); printf("space:暂停游戏"); Pos(64,26); printf("ESC :退出游戏"); } /****初始化蛇身****/ void newsnake() { snake *tail; int i; tail=(snake*)malloc(sizeof(snake));//从蛇尾开始创建链表,以x,y设定开始的位置 tail->x=24; tail->y=5; tail->next=NULL; for(i=1;i<=4;i++) { head=(snake*)malloc(sizeof(snake)); head->next=tail; head->x=24+2*i; head->y=5; tail=head; } while(tail!=NULL)//从头到尾,输出蛇身 { Pos(tail->x,tail->y); color(c); printf("■"); tail=tail->next; } } /****食物生成****/ void createfood() { snake *fod; srand((unsigned)time(NULL)); fod=(snake*)malloc(sizeof(snake)); while((fod->x%2)!=0) //保证x为偶数,使得食物能与蛇头对齐 { fod->x=rand()%52+2; } fod->y=rand()%24+1; q=head; while(q!=NULL) { if(q->x==fod->x && q->y==fod->y) //判断蛇身是否与食物重合 { fod=NULL; free(fod); createfood(); } q=q->next; } food=fod; Pos(fod->x,fod->y); color(4); printf("★"); } /****咬到自己****/ int biteself() { snake *self; //定义self为蛇身上的一个节点 self=head->next; //self是蛇头之外的蛇身上的节点 while(self!=NULL) { if(self->x==head->x && self->y==head->y) //如果self和蛇身上的节点重合 { endgamestatus=2; //返回第二种情况 endgame(); //出现游戏结束界面 } else { self=self->next; } } return 0; } /****不能穿墙****/ void cantcrosswall() { if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) //如果蛇头碰到了墙壁 { endgamestatus=1; //返回第一种情况 endgame(); //出现游戏结束界面 } } /****加速****/ void speedup() { if(sleeptime>=50) { sleeptime=sleeptime-5; add=add+1; } } /****减速****/ void speeddown() { if(sleeptime<350) //如果时间间隔小于350 { sleeptime=sleeptime+20; //时间间隔加上20 add=add-2; //每吃一次食物的得分减2 } } /****移动****/ void snakemove() //蛇前进,上U,下D,左L,右R { snake *nexthead; cantcrosswall(); nexthead=(snake*)malloc(sizeof(snake)); //为下一步开辟空间 if(status==U) { nexthead->x=head->x; //向上前进时,x坐标不动,y坐标-1 nexthead->y=head->y-1; nexthead->next=head; head=nexthead; q=head; //指针q指向蛇头 if(nexthead->x==food->x && nexthead->y==food->y) //如果下一个有食物 下一个位置的坐标和食物的坐标相同 { while(q!=NULL) { Pos(q->x,q->y); color(c); printf("■"); //原来食物的位置 q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作 } score=score+add; //吃了一个食物,在总分上加上食物的分 speedup(); //加速 createfood(); //创建食物 } else { while(q->next->next!=NULL) //如果没遇到食物 { Pos(q->x,q->y); color(c); printf("■"); //蛇正常往前走,输出当前位置的蛇身 q=q->next; //继续输出整个蛇身 } Pos(q->next->x,q->next->y); //经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置 color(3); printf("■"); free(q->next); //进行输出■之后,释放指向下一位的指针 q->next=NULL; //指针下一位指向空 } } if(status==D) { nexthead->x=head->x; //向下前进时,x坐标不动,y坐标+1 nexthead->y=head->y+1; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y) //有食物 { while(q!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } score=score+add; speedup(); createfood(); } else //没有食物 { while(q->next->next!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(status==L) { nexthead->x=head->x-2; //向左前进时,x坐标向左移动-2,y坐标不动 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y)//有食物 { while(q!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } score=score+add; speedup(); createfood(); } else //没有食物 { while(q->next->next!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(status==R) { nexthead->x=head->x+2; //向右前进时,x坐标向右移动+2,y坐标不动 nexthead->y=head->y; nexthead->next=head; head=nexthead; q=head; if(nexthead->x==food->x && nexthead->y==food->y)//有食物 { while(q!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } score=score+add; speedup(); createfood(); } else //没有食物 { while(q->next->next!=NULL) { Pos(q->x,q->y); color(c); printf("■"); q=q->next; } Pos(q->next->x,q->next->y); color(3); printf("■"); free(q->next); q->next=NULL; } } if(biteself()==1) //判断是否会咬到自己 { endgamestatus=2; endgame(); } } /****控制****/ void keyboardControl() { status=R; //初始蛇向右移动 while(1) { scoreandtips(); if(GetAsyncKeyState(VK_UP) && status!=D) //GetAsyncKeyState函数用来判断函数调用时指定虚拟键的状态,VK_UP代表↑ { status=U; //如果蛇不是向下前进的时候,按上键,执行向上前进操作 } else if(GetAsyncKeyState(VK_DOWN) && status!=U) //如果蛇不是向上前进的时候,按下键,执行向下前进操作 { status=D; } else if(GetAsyncKeyState(VK_LEFT)&& status!=R) //如果蛇不是向右前进的时候,按左键,执行向左前进 { status=L; } else if(GetAsyncKeyState(VK_RIGHT)&& status!=L) //如果蛇不是向左前进的时候,按右键,执行向右前进 { status=R; } if(GetAsyncKeyState(VK_SPACE)) //按暂停键,执行pause暂停函数 { while(1) { Sleep(300); //sleep()函数,头文件#include <unistd.h> 令进程暂停,直到达到里面设定的参数的时间。 if(GetAsyncKeyState(VK_SPACE)) //按空格键暂停 { break; } } } else if(GetAsyncKeyState(VK_ESCAPE)) { endgamestatus=3; //按esc键,直接到结束界面 break; } else if(GetAsyncKeyState(VK_F1)) //按F1键,加速 { speedup(); } else if(GetAsyncKeyState(VK_F2)) //按F2键,减速 { speeddown(); } Sleep(sleeptime); snakemove(); } } /****游戏说明****/ void explation() { system("cls"); Pos(30,8); printf("1. 不能穿墙,不能咬到自己"); Pos(30,11); printf("2. 用↑.↓.←.→分别控制蛇的移动"); Pos(30,14); printf("3. 游戏速度会随吃到食物而加快"); Pos(30,17); printf("4. F1 为加速,F2 为减速"); Pos(30,20); printf("5. 按空格键暂停游戏,再按空格键继续"); Pos(30,21); printf("6. ESC :退出游戏"); _getch(); //按任意键返回主界面 system("cls"); welcometogame(); } /****游戏结束****/ void endgame() { system("cls"); if(endgamestatus==1) { color(4); Pos(43,9); printf("GAME OVER !"); Pos(43,12); printf("您撞到墙了"); } else if(endgamestatus==2) { Pos(43,9); color(4); printf("GAME OVER !"); Pos(43,12); printf("您咬到自己了"); } else if(endgamestatus==3) { Pos(43,9); color(4); printf("已结束游戏"); } Pos(43,15); printf("您的得分是: %d",score); choose(); } /****结束选择****/ void choose() { int n; Pos(25,23); printf("Continue ------ 1"); Pos(52,23); printf("Exit ------ 2"); Pos(45,25); printf("选择: "); scanf("%d", &n); switch (n) { case 1: system("cls"); //清屏 score=0; //分数归零 sleeptime=200; //设定初始速度 add = 10; //使add设定为初值,吃一个食物得分10,然后累加 welcometogame(); break; case 2: exit(0); //退出游戏 break; default: Pos(35,27); printf("输入有误 重新输入!"); Pos(35,28); printf("按任意键继续"); system("pause >nul"); endgame(); choose(); break; } } /****主函数****/ int main() { system("mode con cols=100 lines=30"); //设置控制台的宽高 welcometogame(); keyboardControl(); endgame(); return 0; }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
MySQL数据库总结
文章目录一、数据库简介二、MySQL数据类型(5.5版本)三、Sql语句(1)Sql语句简介(2)数据定义语言DDLcreate,alter,drop(3)数据操纵语言DMLupdate,insert,delete(4)数据控制语言DCLgrant,revoke(5)数据查询语言DQLselect(6)分组查询与分页查询group by,limit四、完整性约束(单表)五、多表查询六、MySQL数
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问