线程问题(使C++小游戏里小球可以一边移动一边发射炮弹)
想编一个简易的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;
}
...全文
相关推荐
基于QT的捕鱼达人小游戏
是一款比较简单的捕鱼达人小游戏,功能还没做全,实现了基本的捕鱼功能,可供新手学习,共享资源,希望有所帮助,有问题的可以私信。
C++实现坦克大战小游戏EGE图形界面
C++ EGE 实现坦克大战小游戏,供大家参考,具体内容如下 因为有过一次用EGE写小游戏的经验,所以这一次写坦克大战快了很多。并且使用对象编程也简化了很多编程时繁琐的步骤。 写出坦克大战使我在学习编程的道路上又迈出了一大步。 如果您需要图片素材的,我可以单独发给您。 技术环节: 编译环境:Windows VS2019 需求: 控制坦克移动发射炮弹,炮弹可以消灭敌军坦克,且可以消灭砖块。坦克遇到方块会被挡住。敌军消灭我军三次或基地被毁则游戏失败,共摧毁十次敌方坦克游戏胜利。 思路: 先写出坦克的父类,我方坦克类和敌方坦克类继承坦克父类,实例化我方坦克和敌方坦克。地图使用list容器存储。 在代
java多线程控制小球程序
java 多线程 小球不断在一个框里弹来弹去 可以多个小球不同时间发射
基于c++的捕鱼达人小游戏
基于qt5,c++语言编写,使用sqlite3数据库实现登录注册,登录成功进入小游戏主页面,可以选择游戏模式,实现炮台发射炮弹对小鱼进行捕获,项目有待进一步完善(如背景音乐,捕鱼分数及炮弹个数的统计)
C++坦克大战完整代码.zip
这是我找来的坦克大战完整代码,拿去参考 玩法如下:按P发射,按WASD进行移动,消灭敌人,守护阵营


进程/线程/DLL
