用c语言设计贪吃蛇游戏

贪吃蛇游戏
【游戏规则】 游戏开始时弹出初始菜单,游戏者按任意键进入游戏。游戏者用←↓→↑键来控制蛇在游戏场景内运动,每吃到一个食物,游戏者得10分,分数累加结果会在计分板上显示;与此同时蛇身长出一节。当贪吃蛇的头部撞击到游戏场景边框或者蛇的身体时游戏结束,并显示游戏者最后得分。

// <Copyright liaoqb>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

const int LENGTH = 40;
const int WIDTH = 10;
const int RANGE = 50;
const int BeginLength = 5;
const int speed = 300;
#define SNAKE_COLOR RGB(176, 196, 222)
#define BACKGROUND_COLOR RGB(255, 255, 0)
#define DRAW_SNAKE(x) (x) * WIDTH

enum IsSnake {isSnake, isNotSnake, isFood};

IsSnake map[LENGTH][LENGTH];

struct snake {
  int x;
  int y;
  snake* next;

  snake(int x, int y, snake* n = NULL) {
    this -> x = x;
this -> y = y;
next = n;
  }
};  // snake

typedef struct snake Snake;

Snake* head = NULL;  // queue
Snake* tail = NULL;  // queue
int direct = 0;  // direction
RECT playground;  // district
TCHAR szAppName[] = TEXT("-*- snake game -* ");  // The project name

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  // message function
void Initializer();
void Controller(Snake*,LPVOID);  // control the snake
void Move(HWND);
void PutFood();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) {
  MSG msg;
  HWND hwnd;
  WNDCLASS wndclass;

  while (TRUE) {
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpfnWndProc = WndProc;
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
wndclass.style = CS_HREDRAW | CS_VREDRAW;

if (!RegisterClass(&wndclass)) {
 MessageBox(NULL, TEXT("Please try again!!!"), szAppName, MB_ICONERROR);
 return 0;
}
break;
  }

  hwnd = CreateWindow(szAppName, TEXT("<^_^> Snake Game <^_^>"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);

  ShowWindow(hwnd, SW_NORMAL);
  UpdateWindow(hwnd);

  while (TRUE) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
 if (msg.message == WM_QUIT)
   break;

 TranslateMessage(&msg);
 DispatchMessage(&msg);
} else {
 Move(hwnd);
}
  }

  return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
  HDC hdc;
  PAINTSTRUCT ps;
  HBRUSH hBrush;

  switch (message) {
  case WM_DESTROY:
PostQuitMessage(0);
return 0;

  case WM_CREATE:
Initializer();
MoveWindow(hwnd, RANGE, RANGE, WIDTH * LENGTH + RANGE * 3, WIDTH * LENGTH + RANGE * 3, TRUE);
return 0;

  case WM_KEYDOWN:
switch (wParam) {
case VK_LEFT:
 if (direct != VK_RIGHT)
direct = VK_LEFT;
 break;

case VK_RIGHT:
 if (direct != VK_LEFT)
direct = VK_RIGHT;
 break;

case VK_UP:
 if (direct != VK_DOWN)
direct = VK_UP;
 break;

case VK_DOWN:
 if (direct != VK_UP)
direct = VK_DOWN;
 break;

default:
 break;
}
return 0;

  case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetViewportOrgEx(hdc, RANGE, RANGE, NULL);
hBrush = CreateSolidBrush(BACKGROUND_COLOR);
SelectObject(hdc, hBrush);
Rectangle(hdc,playground.left, playground.top, playground.right, playground.bottom);
DeleteObject(hBrush);

hBrush = CreateSolidBrush(SNAKE_COLOR);
SelectObject(hdc,hBrush);

for (int i = 0; i < LENGTH; ++i) {
 for (int j = 0; j < LENGTH; ++j) {
if (map[i][j] == isSnake || map[i][j] == isFood) {
 Rectangle(hdc, DRAW_SNAKE(i), DRAW_SNAKE(j), DRAW_SNAKE(i + 1), DRAW_SNAKE(j + 1));
}
 }
}
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
  }

  return DefWindowProc(hwnd, message, wParam, lParam);
}

void Initializer() {
  for (int i = 0; i < LENGTH; ++i) {
for (int j = 0; j < LENGTH; ++j) {
 map[i][j] = isNotSnake;
}
  }
  for (i = 0; i < BeginLength; ++i) {
if (i == 0) {
 head = tail = new snake(i, 0);
} else {
 snake* temp = new snake(i, 0);
 tail -> next = temp;
 tail = temp;
}
map[i][0] = isSnake;
  }
  playground.left = playground.top = 0;
  playground.right = playground.bottom = WIDTH * LENGTH;
  direct = VK_RIGHT;
  PutFood();
}

void PutFood() {
  srand(static_cast<unsigned>(time(NULL)));
  int x, y;

  do {
    x = rand() % LENGTH;
y = rand() % LENGTH;
  } while (map[x][y] == isSnake);

  map[x][y] = isFood;
}  // put food

void Move(HWND hwnd) {
  snake* temp;

  switch (direct) {
  case VK_LEFT:
temp = new snake(tail -> x - 1, tail -> y);
break;

  case VK_RIGHT:
temp = new snake(tail -> x + 1, tail -> y);
break;

  case VK_UP:
temp = new snake(tail -> x, tail -> y - 1);
break;

  case VK_DOWN:
temp = new snake(tail -> x, tail -> y + 1);
break;
  }

  Controller(temp,hwnd);
  //InvalidateRect(hwnd,NULL,FALSE);
  Sleep(speed);  // control speed
}  // snake moving

void Controller(Snake* temp,LPVOID lParam) {
HWND hwnd;
hwnd=(HWND)lParam;
  if (temp -> x < 0 || temp -> x >= LENGTH || temp -> y < 0 || temp -> y >= LENGTH
|| map[temp -> x][temp -> y] == isSnake) {  // the snake is died
    MessageBox(NULL,TEXT("<Copyright liaoqb> Sorry !!! Game Over !!! <Copyright liaoqb>"),szAppName,0);
delete temp;

while (head != NULL) {
 Snake* ptr = head;
 head = head -> next;
 delete ptr;
}
head = tail = temp = NULL;
Initializer();
return;
  } else if (map[temp -> x][temp -> y] == isNotSnake) {  // move
    map[temp -> x][temp -> y] = isSnake;
map[head -> x][head -> y] = isNotSnake;
snake* ptr = head;
head = head -> next;
delete ptr;
tail -> next = temp;
tail = temp;
InvalidateRect(hwnd,NULL,FALSE);
  } else {  // if eat food
    map[temp -> x][temp -> y] = isSnake;
tail -> next = temp;
tail = temp;
PutFood();
//InvalidateRect(hwnd,NULL,FALSE);
  }
}

追问

可以运行吗??

追答

可以

追问

那为什么我把这个复制到vc6.0显示不能运行啊。。

追答

你是直接双击打开,然后编译运行吗?

追问

复制 然后调试

追答

你有没有先创建application工程

解压后双击.dsw文件

追问

还是不明白=_=

追答

那用这个吧,比较简单

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-06-19

求用c语言编写的贪吃蛇程序
key = _getch; \/\/ 获取用户按键操作用以控制蛇的移动方向等。\/\/ 根据按键更新蛇的状态...此处需要根据key的值来改变蛇的direction属性。if break; \/\/ 如果按下'q',则退出游戏循环。} } int main { initGame; \/\/ 游戏初始化 gameLoop; \/\/ 开始游戏循环 return 0; \/\/ 程序结束 } 这是...

贪吃蛇c语言源代码
下面是一个简单的贪吃蛇游戏的C语言实现框架,不包含完整的图形界面,但展示了游戏逻辑的基本结构。此示例使用控制台字符来模拟蛇的移动和食物的生成。请注意,这只是一个概念性的实现,实际应用中可能需要借助图形库(如SDL、OpenGL或Windows API)来创建图形界面。```c include include include \/\/ 注意...

求,贪吃蛇 C语言代码 及其每一步的讲解
void DrawK(void);\/*开始画面*\/ void GameOver(void);\/*结束游戏*\/ void GamePlay(void);\/*玩游戏具体过程*\/ void PrScore(void);\/*输出成绩*\/ \/*主函数*\/ void main(void){ Init();\/*图形驱动*\/ DrawK();\/*开始画面*\/ GamePlay();\/*玩游戏具体过程*\/ Close();\/*图形结束*\/ } \/...

怎样用C语言编写一个小游戏?
void gtxy( int x,int y); \/\/以下声明要用到的几个自编函数 void csh( ); \/\/初始化界面 void keymove( ); \/\/按键操作移动蛇 void putFod( ); \/\/投放食物 int Over( ); \/\/游戏结束(1是0否)void setColor(unsigned short p, unsigned short q); \/\/设定显示颜色 int main(...

c语言 贪吃蛇 程序
include <windows.h> define BEG_X2 define BEG_Y1 define WID20 define HEI20 HANDLE hout;typedef enum {UP, DOWN, LEFT, RIGHT} DIR;typedef struct Snake_body { COORD pos;\/\/蛇身的位置 struct Snake_body *next;\/\/下一个蛇身 struct Snake_body *prev;\/\/前一个蛇身 }SNAKE, *PSNAKE;...

C语言课程设计,贪吃蛇应该怎么做?
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。 2.2程序整体设计说明 一个游戏要有开始部分...

求C语言贪吃蛇代码能在DEV上运行通过的贪吃蛇,不要TC上的啊我们老师上课...
求C语言贪吃蛇代码能在DEV上运行通过的贪吃蛇,不要TC上的啊我们老师上课给在DEV我们运行了一次跪求跪求... 求C语言贪吃蛇代码能在DEV上运行通过的贪吃蛇,不要TC上的啊我们老师上课给在DEV我们运行了一次跪求跪求 展开 ...

贪吃蛇游戏退出界面c语言程序
\/*玩游戏具体过程*\/ Close();\/*图形结束*\/ } \/*图形驱动*\/ void Init(void) { int gd=DETECT,gm; initgraph(&gd,&gm,"c:\\\\tc"); cleardevice(); } \/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*\/ void DrawK(void) { \/*setbkcolor(LIGHTGREEN);*\/ ...

保姆级配置git与使用+C语言编写贪吃蛇
git push -u origin master C语言编写贪吃蛇程序的步骤如下:使用vim编辑器编写代码:vim tanchishe.c 编辑完成后保存并退出:按下esc键,然后输入:wq 编译代码:gcc tanchishe.c 运行代码:.\/a.out 以上内容由Zeee撰写并发布于地平线开发者社区,原始文档和代码链接请点击此处一键直达。

c语言 贪吃蛇 求大食物代码。ps:每吃四个食物随机出现一个加大分值的...
typedef struct snake { int a;int b;struct snake *u;struct snake *n;}snake,*snake1;typedef struct food { int a;int b;}food;int main(){ char c,c0 = 'd';int i,j,k,n=1,t,at;snake p,q;snake *dd,*dd0,*dd1,*dd2;food f;srand(time(NULL));p.u = NULL;p....

相似回答