/*------------------------------------------------------------
SNAKE.C -- Displays "贪吃蛇, Windows xp!" in client area
(c) author 心意, 2010.5.27
------------------------------------------------------------*/
#include <windows.h>
#include "SNAKE.h"
#include "resource.h"
#include <time.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("SNAKEGAME") ;
MSG msg ;
WNDCLASS 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 = (LPCSTR)IDR_MENU;
wndclass.lpszClassName = szAppName ;
hInst=hInstance;
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, // window class name
TEXT ("贪吃蛇"), // window caption
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |
WS_BORDER | WS_MINIMIZEBOX, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
320, // initial x size
345, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
InitGame();
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)
{
HDC hdc;
PAINTSTRUCT ps;
int wmID,wmEvent;
POINT pt[]={size/2,size/2,MAIN_WIDTH-size/2,size/2,MAIN_WIDTH-size/2,MAIN_HEIGHT-size/2,size/2,MAIN_HEIGHT-size/2};
switch (message)
{
case WM_TIMER:
WinkBlock(&cBlock);
if(!MoveSnake(&snake,snake[0].direct)){
KillTimer(hwnd,IDT_TIMER);
if(IDNO==MessageBox(hwnd,"对不起,游戏结束了,是否重新一局?","游戏结束",MB_OKCANCEL)){
}
}
break;
case WM_COMMAND:
wmID=LOWORD(wParam);
switch(wmID){
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUT, hwnd, (DLGPROC)About);
break;
case IDM_START:
StartGame();
break;
}
return 0;
case WM_SIZE:
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
BitBlt(hdc,0,0,320,300,hMemDC,0,0,SRCCOPY);
//TextOut(hdc,
EndPaint(hwnd,&ps);
return 0 ;
case WM_KEYDOWN:
switch(wParam){
case VK_LEFT:
MoveSnake(&snake,1);
break;
case VK_RIGHT:
MoveSnake(&snake,2);
break;
case VK_UP:
MoveSnake(&snake,3);
break;
case VK_DOWN:
MoveSnake(&snake,4);
break;
}
return 0;
case WM_DESTROY:
DeleteObject(pen);
DeleteObject(hMemDC);
if(hMemDC){
DeleteDC(hMemDC);
DeleteObject(bitMap);
}
DeleteObject(hBgBrush);
DeleteObject(hBlBrush);
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
void InitGame(){
HDC hdc;
int i;
POINT pt[]={size/2,size/2,MAIN_WIDTH-size/2,size/2,MAIN_WIDTH-size/2,MAIN_HEIGHT-2*size-size/2,size/2,MAIN_HEIGHT-2*size-size/2};
hdc=GetDC(hwnd);
hBgBrush=CreateSolidBrush(bgColor);
hBlBrush=CreateSolidBrush(blColor);//创建方块背景画刷
pen=CreatePen(PS_SOLID,1,liColor);
hMemDC=CreateCompatibleDC(hdc);
bitMap=CreateCompatibleBitmap(hdc,320,300);
SelectObject(hMemDC,hBgBrush);
SelectObject(hMemDC,bitMap);
SelectObject(hMemDC,pen);
//画网格线
for(i=size;i<MAIN_HEIGHT-2*size;i+=size){
MoveToEx(hMemDC,size,i,NULL);
LineTo(hMemDC,MAIN_WIDTH-size,i);
}
for(i=size;i<MAIN_WIDTH;i+=size){
MoveToEx(hMemDC,i,size,NULL);
LineTo(hMemDC,i,MAIN_HEIGHT-3*size);
}
//画边框线
Polyline(hMemDC,pt,4);
//memset(snake,0,MAX_LEVEL);
//memset(
//初使化完成,启动游戏
StartGame();
ReleaseDC(hwnd,hdc);
}
void StartGame(){
BLOCK *block;
block=snake;
block->direct=WEST;
block->x=9;
block->y=10;
FillBlock(block);
MakeBlock(&cBlock);
FillBlock(&cBlock);
SetTimer(hwnd,IDT_TIMER,500,NULL);
}
void MakeBlock(BLOCK *pBlock){
int xposition,yposition;
srand((unsigned)time(NULL));
xposition=rand()%WIDTH_COUNT;
yposition=rand()%HEIGHT_COUNT;
pBlock->x=xposition;
pBlock->y=yposition;
pBlock->direct=NONE;
}
void FillBlock(BLOCK *pBlock){
RECT rect;
rect.left=pBlock->x*size+size+1;
rect.top=pBlock->y*size+size+1;
rect.right=rect.left+size-1;
rect.bottom=rect.top+size-1;
FillRect(hMemDC,&rect,hBlBrush);
InvalidateRect(hwnd,&rect,TRUE);
}
int MoveSnake(BLOCK *psnake,int edir){
int i=0, idir,frontDir;
//保存最后面那个,就是第次移动要删除的那个Block
//idir=psnake->direct;
//psnake->direct=edir;
TCHAR buffer[20];
//lBlock=snake[COUNT-1];
lBlock.x=snake[COUNT-1].x;
lBlock.y=snake[COUNT-1].y;
idir=edir;
while(i<COUNT){
frontDir=(psnake+i)->direct;
(psnake+i)->direct=idir;
switch(idir){
case 1:
(psnake+i)->x-=1;
break;
case 2:
(psnake+i)->x+=1;
break;
case 3:
(psnake+i)->y-=1;
break;
case 4:
(psnake+i)->y+=1;
break;
}
idir=frontDir;
i++;
}
if(IsEndGame(psnake)){
return 0;
}
lBlock.direct=idir;
if(psnake[0].x==cBlock.x && psnake[0].y==cBlock.y){
MakeBlock(&cBlock);
EatBlock(&snake,&lBlock);
FillBlock(&snake);
return 1;
}
FillBlock(&snake);
//wsprintf(buffer,"蛇长度为:%d,最后一个x=%d,y=%d",COUNT,lBlock.x,lBlock.y);
//MessageBox(hwnd,buffer,"最后一个",MB_OK);
EraseBlock(&lBlock);
return 2;
}
void ChangeDirect(BLOCK *psnake,int edir){
psnake->direct=edir;
}
void EraseBlock(BLOCK *pBlock){
RECT rect;
rect.left=pBlock->x*size+size+1;
rect.top=pBlock->y*size+size+1;
rect.right=rect.left+size-1;
rect.bottom=rect.top+size-1;
FillRect(hMemDC,&rect,hBgBrush);
InvalidateRect(hwnd,&rect,TRUE);
}
void WinkBlock(BLOCK *pBlock){
static int status=1;
if(status){
EraseBlock(pBlock);
status=0;
}else{
FillBlock(pBlock);
status=1;
}
}
void EatBlock(BLOCK *pSnake,BLOCK *wBlock){
pSnake[COUNT].direct=wBlock->direct;
pSnake[COUNT].x=wBlock->x;
pSnake[COUNT].y=wBlock->y;
COUNT++;
}
BOOL IsEndGame(BLOCK *pSnake){
if(pSnake->direct==1 && pSnake->x<0){
return TRUE;
}else if(pSnake->direct==2 && pSnake->x>WIDTH_COUNT-1){
return TRUE;
}else if(pSnake->direct==3 && pSnake->y<0){
return TRUE;
}else if(pSnake->direct==4 && pSnake->y>HEIGHT_COUNT-1){
return TRUE;
}
r
纯windows 编程 贪吃蛇游戏代码
5星 · 超过95%的资源 需积分: 50 73 浏览量
2010-05-29
15:49:37
上传
评论 6
收藏 933KB RAR 举报
weikaty
- 粉丝: 6
- 资源: 8
最新资源
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
- 基于matlab+DWT的图像水印项目,数字水印+源代码+文档说明+图片+报告pdf
- (优秀毕业设计)基于python实现的数字图像可视化水印系统的设计与实现,多种数字算法实现+源代码+文档说明+理论演示pdf
- 基于DWT-DCT-SVD和deflate压缩的数字水印方法python源码+Gui界面+演示视频(高分毕业设计)
- 基于matlab实现DWT、DCT、SVD算法数字图像水印可视化系统+GUI界面+文档说明+详细注释(高分毕业设计)
- NCIAE-Data-Structure大一大二笔记
- 学习wireshark笔记
- digital-image-数据可视化笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页