Cpp能否使用线程完成贪吃蛇PVP?

第一次发帖,是编程小白。
现在希望能做一个贪吃蛇PVP,两个玩家在同一个地图中各自控制自己的蛇竞速。
因为蛇是自动前进的,需要不断滚动地走几个函数,读键值,转向,判定啥的。
因为能力有限,只看了关于线程的一些知识,想问各位能否只用线程就完成上述贪吃蛇PVP,使两条蛇行动互不干扰?能不能描述一下较为具体的做法?
以及是否还有其他方法?谢谢

可以的,代码大概是这样的

#include <iostream>
#include <thread>

using namespace std;
//创建线程

void show(){
    while(1){
        //操作
    }
}
int main() {
    thread snake1(show);
    //可继续添加
    return 0;
}


我不是特别确定程序功能,所以只能给出一个大概的代码片段

因为🐍始终处于运动状态,还是添加线程的比较好,怕界面会卡顿,
主线程,用来实时更新界面和捕获用户输入
子线程1,🐍1的位置信息,实时修改,因为本着子线程不能控制ui的原理,修改之后将数据给主线程,主线程更新界面
子线程2,同上,更新🐍2的。
至于方向,速度等需求,主线程封装好接口,用户输入后,你调用函数,做相应的修改就好了。

用多线程可以实现你的需求。一个贪吃蛇对象启动一个线程,在线程函数里执行当前蛇的行为。
具体细节可参考C++代码实现贪吃蛇游戏,非常适合C++初学者入门的项目!_计算机编程老师的博客-CSDN博客_c++easyx贪吃蛇

有单人的,可以参考一下


#include <stdio.h>
#include <windows.h>
#include<conio.h>
#include <stdlib.h>
#include<time.h>
  
#define X 23//地图的x轴
#define Y 75//地图的y轴
  
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
  
#define WAIT_TIME 180//等待蛇刷新的时间,可以说是速度  修改可变速
  
int map_0[X][Y];//地图
int Snake[X*Y][2]; // 蛇
int Slength; //蛇的长度
int direction;
int score=0;
  
bool pdEatFood=false;
  
void csh();
void huaMap();
void huaSnake();
void gotoxy(int x,int y);
void move();
void intokey();
int check(int x,int y);
void putfood();
bool gameover();
void dy_fs();
  
int main() {
    csh();
    huaMap();
    putfood();
    Sleep(5000);
    while(1) {
        huaSnake();
        Sleep(WAIT_TIME);
        intokey();
        move();
        dy_fs();
        if(gameover()) {
            system("cls");          //清除屏幕内容
            printf("Game Over\n");
            system("pause");
            getchar();
            break;
        }
        if(map_0[Snake[0][0]][Snake[0][1]]==-1) {
            map_0[Snake[0][0]][Snake[0][1]]=0;
            pdEatFood=true;
            putfood();
            score+=1;
        }
    }
    return 0;
}
void csh() { //初始化
    srand((unsigned)time(NULL)); //设置种子为现在的时间
    Slength=4;
    gotoxy(0,0);
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //清除光标
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    int x,y;
    Snake[0][0]=X/2;
    Snake[0][1]=Y/2;
    for(x=0; x<X; x++) {
        map_0[x][0]=1;
        map_0[x][Y-1]=1;
    }
    for(y=0; y<Y-1; y++) {
        map_0[0][y]=1;
        map_0[X-1][y]=1;
    }
    for(x=1; x<4; x++) { //初始化蛇的坐标
        Snake[x][0]=Snake[0][0]+x;
        Snake[x][1]=Snake[0][1];
    }
    direction=UP;
  
}
void huaMap() { //画地图
    int x,y;
    for(x=0; x<X; x++) {
        for(y=0; y<Y; y++) {
            if(map_0[x][y]==1) {
                printf("#");
            }
            if(map_0[x][y]==0) {
                printf(" ");
            }
        }
        printf("\n");
    }
}
void huaSnake() { //画蛇
    int x;
    gotoxy(Snake[0][0],Snake[0][1]);
    printf("O");
    for(x=1; x<Slength; x++) {
        gotoxy(Snake[x][0],Snake[x][1]);
        printf("#");  
    }
}
void gotoxy(int i,int j) { //移动光标
    COORD position= {j,i};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}
void move() {
    int i;
    gotoxy(Snake[Slength-1][0],Snake[Slength-1][1]);//擦除尾巴
    printf(" ");
    for(i=Slength-1; i>0; i--) { //从尾巴开始,每一个点的位置等于它前面一个点的位置
        Snake[i][0]=Snake[i-1][0];
        Snake[i][1]=Snake[i-1][1];
    }
    switch(direction) {
        case UP:
            Snake[0][0]--;
            break;
        case DOWN:
            Snake[0][0]++;
            break;
        case LEFT:
            Snake[0][1]--;
            break;
        case RIGHT:
            Snake[0][1]++;
            break;
    }
    if(pdEatFood) {
        Slength++;
        pdEatFood=false;
    }
  
}
void intokey() {
    if(kbhit()!=0) {        //kbhit()函数 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
        char in;
        while(!kbhit()==0)  //如果玩家输入了多个按键,以最后一个按键为准
            in=getch();
        switch(in) {
            case 'w':
            case 'W':
                if(direction!=DOWN)         //防止缩头
                    direction=UP;
                break;
            case 's':
            case 'S':
                if(direction!=UP)
                    direction=DOWN;
                break;
            case 'a':
            case 'A':
                if(direction!=RIGHT)
                    direction=LEFT;
                break;
            case 'd':
            case 'D':
                if(direction!=LEFT)
                    direction=RIGHT;
                break;
            case 'p':
            case 'P':
                gotoxy(X,0);
                system("pause");
                gotoxy(X,0);
                printf("                   ");  //  消去下面的按任意键继续
                break;
        }
    }
}
int check(int ii,int jj) { // 检查是否能投放食物
    if(map_0[ii][jj]==1)
        return 0;
    if(ii==0 || jj==0 || ii==X-1 || jj==Y-1)
        return 0;
    int i;
    for(i=0; i<Slength; i++) {
        if(ii==Snake[i][0] && jj==Snake[i][1])
            return 0;
    }
    return 1;
}
void putfood() {
    int i,j;
    do {
        i=rand()%X;
        j=rand()%Y;
    } while(check(i,j)==0);
    map_0[i][j]=-1;
    gotoxy(i,j);
    printf("$");
}
bool gameover() {
    bool isgameover=false;
    int sX,sY;
    sX=Snake[0][0],sY=Snake[0][1];
    if(sX==0 || sX==X-1 || sY==0 || sY==Y-1)
        isgameover=true;
    int i;
    for(i=1; i<Slength; i++) {
        if(sX==Snake[i][0] && sY==Snake[i][1])
            isgameover=true;
    }
    return isgameover;
}
void dy_fs() {
    gotoxy(X,0);
    printf("(c)Geek------2018.1.22");
    gotoxy(X+1,0);
    printf("最终得分: %d",score);
}