线程问题(使C++小游戏里小球可以一边移动一边发射炮弹)

LeoHirasawa 2014-07-29 10:25:26
想编一个简易的VC++小游戏,就是游戏里小球(O)可以一边发射炮弹(*)一边移动那种,然后打出现的豆豆(*),我采用了多线程,但是当我发射时(双击空格键),小球就不移动了(键盘操控),还会消失一下,求大神帮我解决一下,我是纯新手,代码里好多地方都不完善还请大神见谅。。(如果有其他的毛病也顺便告诉我一下谢啦),下面是我的代码:(跪谢大神啦,代码很长。。。希望大神能能看完。。)


#include <windows.h>
#pragma comment(lib,"winmm.lib")
#include <iostream>
#include <string>
#include <conio.h>
#include <iomanip>
#include <ctime>
#include <vector>
using namespace std;
SYSTEMTIME sys;
DWORD WINAPI Fun1Proc(
LPVOID lpParameter
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter
);




class basic
{
public:
//在指定坐标处输出字符串
void outxy(int x,int y,string s)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
cout<<s<<endl;
}
//光标移动到指定坐标处
/* void gotoxy(int x,int y)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
}*/
//设置文本颜色
void setcolor(int a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
//接收键盘码
int inkey()
{
int c;
c=getch();
return c;
}
//隐藏光标
void hide_cursor()
{
HANDLE h_GAME = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
GetConsoleCursorInfo(h_GAME,&cursor_info);
cursor_info.bVisible=false; //不显示光标
SetConsoleCursorInfo(h_GAME,&cursor_info);
}
//显示光标
void show_cursor()
{
HANDLE h_GAME = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
GetConsoleCursorInfo(h_GAME,&cursor_info);
cursor_info.bVisible=true; //显示光标
SetConsoleCursorInfo(h_GAME,&cursor_info);
}
//延时函数,n-毫秒
// void delay(long n)
// {
// _sleep(n);
// }
//播放声音文件
void sound(char *s)
{
//PlaySound(s,0,0);//同步播放
PlaySound(s,0,1);//异步播放,可做为背景声音
}
};

class game:public basic
{

public:
int key1,key2,key3;//键值
int x,y;//小球坐标
int x1,y1;//左上角坐标
int x2,y2;//右下角坐标
int x3,y3;
int L0,H0;
string s,s2;
string b[30];//背景图案
int flag;
public:
game(int LL0,int HH0,int xx1,int yy1,int xx2,int yy2,int xx3,int yy3,string ss)
{
x1=xx1;y1=yy1;x2=xx2;y2=yy2;x3=xx3;y3=yy3;
L0=LL0;H0=HH0;
x=x1+5;y=y1;
s=ss;
key1=1;key2=1;key3=key2;
flag=1;
}

void background1();
void move();
void key();
void outxy(int x,int y,string s);
void delay(long n);
void erase();
void background();
void gotoxy(int x,int y);
void draw();

};


void game::gotoxy(int x,int y)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
}
void game::background()
{
SYSTEMTIME sys;

GetLocalTime(&sys); /* 获取系统时间*/
srand(sys.wMilliseconds); /*以毫秒作为seed*/
int a = rand() % 25; /*求出0到25之间的随机数*/
int b = rand() % 20; /*求出0到20之间的随机数*/
L0=a*3;
H0=b+3;

if(L0<100&&H0<17&&H0>4)
{
gotoxy(L0,H0);
cout<<"*";//豆豆
}
else background();

}
void game::draw()
{
x=x<x1?x1:x;
x=x>x2?x2:x;
y=y<y1?y1:y;
y=y>y2?y2:y;
gotoxy(x,y);
cout<<s;

}
void game::delay(long n)
{
_sleep(n);
}
void game::erase()
{
gotoxy(x,y);
for(int i=0;i<s.size();++i)
cout<<" ";
}
void game::outxy(int x,int y,string ss)
{
HANDLE h;//句柄,对象的索引
COORD c;//结构体,坐标值
c.X=x;
c.Y=y;
h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(h,c);
cout<<ss<<endl;
}

void game::move()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,(void*)this,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,(void*)this,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(40);
// erase();
draw();
}


void game::key()
{
while(key1!=27)
{
move();
key1=inkey();
if(key1==224)
{

key2=inkey();
key3=key2;
}
else if(key1==32)
{

key2=inkey();
key3=key2;
}

}
}


DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{
game* g = (game*) lpParameter;
switch(g->key2)
{
case 77:


++(g->x);
break;//right
case 75:
--(g->x);
break;//left
}
return 0;

}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{
game* g = (game*) lpParameter;
// erase();
switch(g->key3)
{
case 32:

while((g->y)>0)
{
(g->y)--;
// g->outxy(g->x,g->y,"O");
g->gotoxy(g->x,g->y);
cout<<"O";

g->delay(10);
g->outxy(g->x,g->y," ");

}
g->background();
(g->flag)++;
cout<<(g->flag);
if((g->flag)==10)
cout<<"游戏时间到";
break;
}
return 0;

}

int main()
{

game m1(20,4,1,30,110,32,5,6,"O");
m1.gotoxy(1,30);
cout<<"| |";

m1.hide_cursor();
m1.background();
m1.key();
m1.show_cursor();





return 0;
}
...全文
135 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeoHirasawa 2014-08-03
  • 打赏
  • 举报
回复
求大神啊~~没人来

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧