#include <windows.h>
#include<iostream>
#include<cmath>
#include <process.h>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define pi 3.141592653
//**********游戏属性设置******************//
#define R 13 //球半径
#define SrhPrecision 180 //SrhPrecision为球前半部碰撞点搜索精度。此处默认为 180分度
#define time_ms 500 //一局时间设定 68*time_ms 毫秒
//球运动步长
#define step0 1//0_red球
#define step1 1//1_green球
#define step2 1//2_blue球
//球运动睡眠时间ms
#define slp_t0 3//0_red球
#define slp_t1 4//1_green球
#define slp_t2 5//2_blue球
//********************************************
typedef struct{
float x;
float y;
int flag;
} fMouseClick;
typedef fMouseClick ElemType;
typedef struct { //用于存每笔上点坐标的动态数组
ElemType *elem;
int length;
int listsize;
} fSqList;
//-----------------声明全局变量------------------------------------
fSqList L;
HWND globalhWnd;
static int winPot[700][700]; //该数组用于标记700*700窗口中所有像素 ^_^
int flagPlusPlus=0; //用于标记区分每一笔画o(∩_∩)o
//碰撞坐标
float xStr0,yStr0;
float xStr1,yStr1;
float xStr2,yStr2;
//*****************高级属性设置***************************8
//球的始发坐标
float x0_0=350-25,y0_0=400;//Red 0
float x0_1=350+25,y0_1=400;//Green 1
float x0_2=350,y0_2=420;//Blue 2
//洞口坐标
float Xend0=250,Yend0=45;//红 0
float Xend1=350,Yend1=45;//黄 1
float Xend2=450,Yend2=45;//蓝 2
/*********************************************************/
void InitList(fSqList &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
L.length=0;
L.listsize=LIST_INIT_SIZE;
}
void InsertLast(fSqList &L,ElemType e)
{
if(L.length>=L.listsize)
{
L.elem=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
L.listsize+=LISTINCREMENT;
}
L.elem[L.length]=e;
L.length++;
}
//******************************functions前向声明****************************
int ifstrike(float ang1,float x0,float y0,float& xStr,float& yStr,int ball_num);
int strike(float&ang1,float x0,float y0,float& xStr,float& yStr);
DWORD WINAPI ThreadFunc(LPVOID n);
DWORD WINAPI ThreadFunc1(LPVOID n);
DWORD WINAPI ThreadFunc2(LPVOID n);
VOID Thread(PVOID pvoid);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
//***************************************************************************
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)// WinMain函数
{
/****************初始化******/
InitList(L);
for(int i=0;i<700;i++) //将边界赋值1 以划定球运动区域
{
winPot[i][21]=1;
winPot[i][660]=1;
winPot[0][i]=1;
winPot[685][i]=1;
}
/****************************/
static wchar_t szAppName[] = TEXT ("Form1") ;
HWND hwnd ;
MSG msg ;
WNDCLASSW wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("InkBall (Leon)"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
700,// initial x size
700,// initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int x1,y1;
switch (message)
{
case WM_CREATE:
_beginthread (Thread, 0, NULL) ;//生产多线程-时间条
globalhWnd=hwnd;
HANDLE hTread;
DWORD threadId;
hTread=CreateThread(NULL,0,ThreadFunc,NULL,0,&threadId);//创建线程 球0
HANDLE hTread1;
DWORD threadId1;
hTread1=CreateThread(NULL,0,ThreadFunc1,NULL,0,&threadId1);//创建线程 球1
HANDLE hTread2;
DWORD threadId2;
hTread2=CreateThread(NULL,0,ThreadFunc2,NULL,0,&threadId1);//创建线程 球2
return 0 ;
case WM_PAINT:
//保持MessageBox始终前端
HWND hwnd1;
hwnd1=::FindWindow(TEXT("#32770"), TEXT("InkBall_Game"));//搜索当前MessageBox句柄
SetWindowPos(hwnd1, HWND_TOPMOST,0,0,0,0,3) ;//保持hwnd1在最前端
PAINTSTRUCT ps ;//画洞口
HDC hdc;
hdc= BeginPaint (hwnd, &ps) ;
HPEN hPen1,hPen2,hPen3;
HBRUSH hbrush;
hbrush=CreateSolidBrush(RGB(100,100,100));
SelectObject(hdc,hbrush);
hPen1=CreatePen (PS_SOLID,8, RGB(255,100,100)) ;
SelectObject (hdc, hPen1) ;
Ellipse (hdc, Xend0+R+5, Yend0+R+5, Xend0-R-5, Yend0-R-5) ;
DeleteObject(hPen1);
hPen2=CreatePen (PS_SOLID,8, RGB(100,255,100)) ;
SelectObject (hdc, hPen2) ;
Ellipse (hdc, Xend1+R+5, Yend1+R+5, Xend1-R-5, Yend1-R-5) ;
DeleteObject(hPen2);
hPen3=CreatePen (PS_SOLID,8, RGB(100,100,255)) ;
SelectObject (hdc, hPen3) ;
Ellipse (hdc, Xend2+R+5, Yend2+R+5, Xend2-R-5, Yend2-R-5) ;
DeleteObject(hPen3);
DeleteObject(hbrush);
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_LBUTTONDOWN :
x1=LOWORD(lParam);
y1=HIWORD (lParam);
if(x1>=0 && x1<=685 && y1>=0 && y1<=660)
{
flagPlusPlus++;
winPot[x1][y1]=flagPlusPlus; //mark the pix
fMouseClick fmouseClick1;//记录坐标点
fmouseClick1.x=x1;
fmouseClick1.y=y1;
fmouseClick1.flag=flagPlusPlus;
InsertLast(L,fmouseClick1);
}
return 0;
case WM_MOUSEMOVE :
if(wParam & MK_LBUTTON)
{
HDC hdc ;
hdc=GetDC(hwnd);
HPEN hPen;
hPen=CreatePen (PS_SOLID, 8, RGB(0,0,0)) ;
SelectObject (hdc, hPen) ;
int x2,y2;
x2=LOWORD(lParam);
y2=HIWORD(lParam);
SetPixel(hdc,x2,y2,BLACK_BRUSH);
POINT apt[2];
apt[0].x=x1;apt[0].y=y1;
apt[1].x=x2;apt[1].y=y2;
Polyline (hdc, apt, 2) ;
winPot[x2][y2]=flagPlusPlus;//---标记该点成为障碍
ReleaseDC (hwnd, hdc) ;
x1=x2;
y1=y2;
fMouseClick fmouseClick2;//记录坐标点
fmouseClick2.x=x2;
fmouseClick2.y=y2;
fmouseClick2.flag=flagPlusPlus;
InsertLast(L,fmouseClick2);
}
return 0;
case WM_LBUTTONUP:
fMouseClick fmouseClick3;//记录坐标点
fmouseClick3.x=LOWORD(lParam);
fmouseClick3.y=HIWORD(lParam);
fmouseClick3.flag=flagPlusPlus;
InsertLast(L,fmouseClick3);
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/************************************************************************/
/* 清除已经绘制的圆 */
/**********************************************************************/
void clearEllipse(HDC hdc,float x,float y)
{
//创建白色的画笔和画刷
HPEN hpen=CreatePen(PS_SOLID,5,RGB(255,255,255));
HBRUSH hbrush=CreateSolidBrush(RGB(255,255,255));
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
Ellipse (hdc, x+R, y+R, x-R, y-R) ;//用白色的矩形覆盖原图
DeleteObject(hpen);
DeleteObject(hbrush);
}
/************************************************************************/
/* 绘制圆 */
墨球(InkBall)
3星 · 超过75%的资源 需积分: 36 150 浏览量
2008-07-19
03:48:34
上传
评论 2
收藏 103KB RAR 举报
w1shi2wei3
- 粉丝: 11
- 资源: 6
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈