这个是我大一时候写的C++五子棋游戏(WIN API平台),功能还有很多不足,希望可以给你帮助!
另外你要记得:
程序一定要靠自己写,只有自己写才能发现自己的不足
希望可以给你帮助
#include
#define MAX 20
#define TextWidth 200
#define Time1 1
#define Time2 2
#define times 1
#define NO1 1
#define NO2 2
#define ERROR 0
#define NO 0
#define OK 1
int leng=1;
#define DEFAULT 0;
HDC hdc,hdc1,hdc2;
int xw,yw;
int iGame[MAX][MAX];
POINT point;
enum{Default,Player1,Player2}play;
enum{Stop,Play,Paush}plays;
void Init(HWND hwnd);
void paint(int play,int x,int y);
void chagePlayer();
int Look(int x,int y,int play);
void over(HWND hwnd,int play);
void timechage(HWND hwnd);
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
char szClassName[ ]="五子棋-WIN32版";
int WINAPI WinMain(HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance= hThisInstance;
wincl.lpszClassName= szClassName;
wincl.lpfnWndProc= WindowProcedure;
wincl.style= CS_DBLCLKS;
wincl.cbSize= sizeof(WNDCLASSEX);
wincl.hIcon= LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm= LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor= LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName= NULL;
wincl.cbClsExtra= 0;
wincl.cbWndExtra= 0;
wincl.hbrBackground=(HBRUSH) COLOR_BACKGROUND;
if(!RegisterClassEx(&wincl))
return 0;
hwnd= CreateWindowEx(
1,
szClassName,
szClassName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
ShowWindow(hwnd, nFunsterStil);
while(GetMessage(&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
static HPEN hpen,hpen1,hpen2;
static HBRUSH hbrush,hbrush1,hbrush2;
int x,y;
switch(message)/* handle the messages*/
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_F5:
Init(hwnd);
Rectangle(hdc,0,0,xw,yw);
for(x=0;x for(y=0;y { Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX); iGame[x][y]=Default; } SetTimer(hwnd,Time1,times,NULL); leng=1; plays=Play; break; case VK_F1: break; case VK_F2: SetTimer(hwnd,Time1,times,NULL); leng=1; plays=Play; break; case VK_F3: if(plays==Play) { KillTimer(hwnd,Time1); plays=Paush; } else if(plays==Paush) { SetTimer(hwnd,Time1,times,NULL); plays=Play; } break; } break; case WM_TIMER: switch(wParam) { case Time1: timechage(hwnd); break; } break; case WM_CREATE: plays=Stop; play=Player1; break; case WM_SIZE: xw=LOWORD(lParam); yw=HIWORD(lParam); xw-=TextWidth; InvalidateRect(hwnd,NULL,TRUE); break; case WM_LBUTTONDOWN: //获取但前鼠标坐标 point.x=LOWORD(lParam); point.y=HIWORD(lParam); //初始化设备DC Init(hwnd); //鼠标坐标换为数组坐标 x=(point.x)/(xw/MAX); y=(point.y)/(yw/MAX); if(plays==Stop)break; if(x { if(iGame[x][y]==Default&&plays==Play)//判断但前位置是否有棋子覆盖 { leng=1; paint(play,x,y); if(Look(x,y,play)) over(hwnd,play); chagePlayer(); } } break; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); Init(hwnd); Rectangle(hdc,0,0,xw,yw); for(x=0;x for(y=0;y { Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX); paint(iGame[x][y],x,y); } EndPaint(hwnd,&ps); break; case WM_DESTROY: PostQuitMessage(0);/* send a WM_QUIT to the message queue*/ break; default:/* for messages that we don't deal with*/ return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } void Init(HWND hwnd) { hdc1=GetDC(hwnd); hdc2=GetDC(hwnd); //初始背景 SelectObject(hdc,CreatePen(0,1,RGB(255,0,0))); SelectObject(hdc,CreateSolidBrush(RGB(0,0,0))); //初始玩家一图形 SelectObject(hdc1,CreatePen(0,1,RGB(0,0,0))); SelectObject(hdc1,CreateSolidBrush(RGB(0,255,0))); //初始玩家二图形 SelectObject(hdc2,CreatePen(0,1,RGB(0,0,0))); SelectObject(hdc2,CreateSolidBrush(RGB(0,0,255))); SetBkMode(hdc,0); Rectangle(hdc,xw+1,1,xw+30,yw); Rectangle(hdc,xw+31,29,xw+200,30); TextOut(hdc,xw+80,10,"五子棋",6); TextOut(hdc,xw+45,100,"F2-开始游戏",13); TextOut(hdc,xw+45,120,"F3-暂停/继续游戏",18); TextOut(hdc,xw+45,140,"F5-重新开始游戏",16); Rectangle(hdc,xw+31,180,xw+200,181); TextOut(hdc,xw+49,189,"帮助文档",15); TextOut(hdc,xw+45,210,"*建议最大化窗口游戏",19); TextOut(hdc,xw+45,240," 1)按 F2启动游戏",18); TextOut(hdc,xw+45,260," 2)鼠标点击棋盘",17); TextOut(hdc,xw+30,320,"注意:滚动条为限制时间",22); } void timechage(HWND hwnd) { if(play==Player1) { Rectangle(hdc1,xw+1,leng++,xw+30,yw); TextOut(hdc1,xw+33,30,"当前下棋主动权:玩家一",22); if(leng>yw) { KillTimer(hwnd,Time1); MessageBox(NULL,"时间到!玩家一您输了!","TimeOver",0); SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL); KillTimer(hwnd,Time1); } } else { TextOut(hdc2,xw+33,30,"当前下棋主动权:玩家二",22); Rectangle(hdc2,xw+1,leng++,xw+30,yw); if(leng>yw) { KillTimer(hwnd,Time1); MessageBox(NULL,"时间到!玩家二您输了!","TimeOver",0); SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL); KillTimer(hwnd,Time1); } } } void paint(int play,int x,int y)//画棋子 { switch(play) { case Player1: if(iGame[x][y]!=Default); Ellipse(hdc1,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX); iGame[x][y]=Player1; break; case Player2: if(iGame[x][y]!=Default); Ellipse(hdc2,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX); iGame[x][y]=Player2; break; } } void chagePlayer()//改变玩家 { if(play==Player1) play=Player2; else play=Player1; } int Look(int x,int y,int play)//检查模块 { int i,tempx,tempy; tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempy--,i++); if(i>=5) return OK;//向上核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempy++,i++); if(i>=5) return OK;//向下核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,i++); if(i>=5) return OK;//向左核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,i++); if(i>=5) return OK;//向右核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy--,i++); if(i>=5) return OK;//向左上核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy--,i++); if(i>=5) return OK;//向右上核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy++,i++); if(i>=5) return OK;//向左下核对 tempx=x;tempy=y; for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy++,i++); if(i>=5) return OK;//向右下核对 return NO; } void over(HWND hwnd,int play) { switch(play) { case Player1: KillTimer(hwnd,Time1); MessageBox(hwnd,"恭喜玩家一获得胜利","胜利",0); SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL); KillTimer(hwnd,Time1); plays=Stop; break; case Player2: KillTimer(hwnd,Time1); MessageBox(hwnd,"恭喜玩家二获得胜利","胜利",0); SendMessage(hwnd,WM_KEYDOWN,VK_F5,NULL); KillTimer(hwnd,Time1); plays=Stop; break; } } 黑暗之魂3中有很多游戏没有提示,教学的技巧,比如说跳劈、处决等。下面就给大家带来黑暗之魂3新手向各种基础知识普及,希望能给各位有所帮助 1、跳跃需要“跑”起来才能跳。跳劈是。跑加右手重击是跳劈,左手重击是战技键(ps:有些战技释放需要接右手轻击或重击。请注意盾分为战技盾和弹反盾,没有战技盾的情况下可以双持武器放战技)长按双持键可以双持左手武器(ps:有些怪不锁定更好打) 2、更换戒指装备道具是装备栏,而不是物品栏(分别是esc后的第一个和第二个)法术奇迹咒术一类的只能在篝火处更换 3、处决和背刺都是近身接右手轻击(ps:部分武器无法处决。据说有个cos沙法的dalao死于送灵火想处决别人) 4、不小心死掉了一大笔魂掉了不要惊慌,带上牺牲戒指即使不小心死了之前魂不会消失 5、匕首战技爬沼泽是非常好用的东西 6、宝箱怪推荐留一个不杀,不死人护符可以无限刷宝箱怪 7、在法兰老狼那可以观测到3个烽火的方向 8、梯子上下时按住空格可以加速,还可以喝果粒橙捏火吃艹,右手轻击是挥拳重击是蹬腿,连续按翻滚是跳下楼梯 9、部分道具扔地上别人看不见,别人扔的武器你只能看见你拥有的最高强化武器同等级或者比这个第等级的武器。 请不要捡陌生人扔的东西,因为有可能是外挂,可能被封号 10、迟钝减缓铝条回复速度,迟钝状态下铝条被打空了会被打出大硬直能被处决。所以迟钝别一味地架了盾不松手,可以在敌人攻击空挡的时候松盾偷偷会铝条(萌新PVP时夏几巴滚都比傻迟钝强) 铝条即使是剩下一丝丝也可以做任何一个耗费铝条的动作(例如蓄满力重击,虽然一口气砍完所以铝条很爽,但我个人不推荐这样,每次都留下点铝条保证自己能翻滚比较好) 11、大部分NPC都为友善的,不要乱砍NPC,如果打到NPC的话正常情况下砍3刀会转为敌对关系(ps:NPC受伤都算灰烬打的,敌对了可以去不死部落下水道找罪业女神赎罪解除敌对。“解除”敌对,不是“复活”,能随意砍的NPC只有撸到死一个|?ω?`)) 12、余火可以增加血量上限直到死为止(30%大概),只有余火状态下才能被NPC和玩家入侵,捏手指可以多召唤一个友善灵,灵体增加入侵几率提高,灵体越多越容易被入侵。 13、小怪弱的属性:人之脓弱火,龙弱雷,狗弱火,骷髅弱打击,入侵弱智(接下来,头盖骨很有用),骑士普遍弱暗,罪都伊露希尔某些怪(死李,大手子)弱出血(boss可以百度) 14、区域boss打了,在该区域不会被入侵(包括NPC)看不见白符(ps:有可能错过剧情)。红符依然可见。 15、灵体的划分:分为白灵(白色,金色),红灵(红色,紫色,金透红),誓约灵(蓝色,蓝透红)。关于灵体好坏的区分为,能锁定能打的是敌人,不能锁定打不到的为友军。不放心再砍两刀。(ps:正常情况下透红光的是坏东西) 当前区域中有其他灵体时不能坐篝火的,但是可以点火(爷爷:???)也就是说你被人入侵或者召唤了灵体后基本没有补给了,也无法下游戏,想要下游戏或者做篝火只能干掉除了你的所有人或者你自杀,友善灵可以用黑水晶秒杀,入侵灵只能杀死他,或者等他自己黑水晶。(ps:杀死敌对灵可以获得果粒橙和少量魂。黑水晶每个人出生都带翻翻背包或者按esc就可以看见。任何情况都不推荐拔线,遇见神族除外) 16、弓望远镜缩放左手轻击加切换物品和法术键可以调整倍率 17、留言按双持键可以切换留言方式(两行,带动作都可以) 18、这一点是最最最重要的魂3没有云存档,请手动备份存档,存档位置C:\Users\dell(主机名)\AppData\Roaming\DarkSoulsIII 19、誓约:带暗月之剑,青守,法兰守卫,吃神守卫是会被强制召唤的,一周目推图建议誓约带青教,被暗灵入侵时会有人来救你(ps:誓约灵不管,愿暗月保护你) 20、关于刷耳朵,剑艹武器防具耳朵耳朵还有耳朵一类的东西的时候要记得带寻宝4件套(宝箱头,结晶刺剑,硬币,金蛇戒指) 20、关于画符联机问题,分为白腊石和红腊石两种,正常情况是白符和红符两种,当你佩戴不同誓约时符的颜色会发生变化效果也有所区别。 只有等级相近切武器强化等级相近的人才能看见彼此的符(2人设密码无视等级和武器因素) 白符需要火主未打区域boss才能看见,红符没有boss限制(所以一般交易都是画红符) 21、关于负重问题 有个重量比,重量比分为0-29.99% 30-69.99% 70-99.99% 100+这几个档次 0-29.99跑的又快跳的又远翻滚无敌帧也长 30-69.99属于正常情况可以正常跑跳翻滚 70-99.99属于超重,走不动,跑的超慢,滚动感人 100+不能跑不能滚,走路感人 第一:学3d建模需要美术基础,但是不代表现在就需要美术基础 很多朋友想学3d建模,但是遗憾的是,圈内人总是对他们说,学3d建模需要有美术基础,你们有吗?然后很多没有美术基础的朋友,就耷拉着脑袋,灰溜溜的不学了。其实这完全是一种错误的认识,学美术和年龄无关,很多人的错误认知是美术这事是小孩子学的,其实完全不对,大人同样可以学美术,而且比小孩子学的还要好,学习美术这一块,花不了多上时间,不需要你去十年八年的去练习,把一些基础的关键的东西学会了,然后在慢慢的操作过程中,熟悉就可以了。而且3D建模和美术基础有一定的关系,但是关系不是太大,所以你现在不会没关系,可以一边学习3D建模,一边练习自己的美术知识,稍微学习一下就可以。我有很多朋友以前就是这么学的,现在他们都是很多游戏公司的部门负责人呢。天空飘来五个字:这都不是事。 第二:没有学不好的3D建模,只有不会学的人 有的人说3D建模有点难,我想说的是,请问什么简单?简单的事都是给一般人做的,而且都是一些没有前途的事情,你愿意做的话,也可以,但是我们凡是想学3D建模的,都是年轻人吧,年轻意味着无限的前途和希望,我们就是要逢山开路,遇水搭桥,不要把心思停留在难不难的问题上,做什么都不容易,把心思放在怎么学好3D建模上,这才是一个有前途的人应该考虑的问题。记住没有学不好的3D建模,只有不会学的人。二、游戏黑暗之魂3新手的各种基础知识普及分享
三、游戏建模需要哪些基础知识
上一篇:游戏装备基础知识大全图解
下一篇:游戏装备基础知识培训