c语言贪吃蛇代码及设计报告(求,贪吃蛇 C语言代码 及其每一步的讲解)
本文目录
求,贪吃蛇 C语言代码 及其每一步的讲解
/* 贪吃蛇程序 by champking */#define N 200#include 《graphics.h》#include 《stdlib.h》#include 《dos.h》#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score = 0;/*得分*/int gamespeed = 100000;/*游戏速度自己调整*/struct Food{ int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/}food;/*食物的结构体*/struct Snake{ int x; int y; int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/}snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePlay(void);/*玩游戏具体过程*/void PrScore(void);/*输出成绩*//*主函数*/void main(void){ Init();/*图形驱动*/ DrawK();/*开始画面*/ GamePlay();/*玩游戏具体过程*/ Close();/*图形结束*/}/*图形驱动*/void Init(void){ int gd = DETECT, gm; initgraph(&gd, &gm, "c:\\tc"); cleardevice();}/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/void DrawK(void){/*setbkcolor(LIGHTGREEN);*/ setcolor(11); setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*设置线型*/ for(i = 50; i 《= 600; i += 10)/*画围墙*/ { rectangle(i, 40, i + 10, 49); /*上边*/ rectangle(i, 451, i + 10, 460);/*下边*/ } for(i = 40; i 《= 450; i += 10) { rectangle(50, i, 59, i + 10); /*左边*/ rectangle(601, i, 610, i + 10);/*右边*/ }}/*玩游戏具体过程*/void GamePlay(void){ randomize();/*随机数发生器*/ food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life = 0;/*活着*/ snake.direction = 1;/*方向往右*/ snake.x = 100;/*蛇头*/ snake.x = 100; snake.node = 2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ { if(food.yes == 1)/*需要出现新食物*/ { food.x = rand() % 400 + 60; food.y = rand() % 350 + 60; while(food.x % 10 != 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++; while(food.y % 10 != 0) food.y++; food.yes = 0;/*画面上有食物了*/ } if(food.yes == 0)/*画面上有食物了就要显示*/ { setcolor(GREEN); rectangle(food.x, food.y, food.x + 10, food.y - 10); } for(i = snake.node - 1; i 》 0; i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x; snake.y; } /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case 1: snake.x += 10; break; case 2: snake.x -= 10; break; case 3: snake.y -= 10; break; case 4: snake.y += 10; break; } for(i = 3; i 《 snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ { if(snake.x) { GameOver();/*显示失败*/ snake.life = 1; break; } } if(snake.x《55|| snake.y》455)/*蛇是否撞到墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=1; /*蛇死*/ } if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break; if(snake.x == food.y)/*吃到食物以后*/ { setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x, food.y, food.x + 10, food.y - 10); snake.x =- 20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes = 1;/*画面上需要出现新的食物*/ score += 10; PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i = 0; i 《 snake.node; i++) rectangle(snake.x + 10, snake.y - 10); delay(gamespeed); setcolor(0);/*用黑色去除蛇的的最后一节*/ rectangle(snake.x, snake.x - 10); } /*endwhile(!kbhit)*/ if(snake.life == 1)/*如果蛇死就跳出循环*/ break; key = bioskey(0);/*接收按键*/ if(key == ESC)/*按ESC键退出*/ break; else if(key == UP&&snake.direction!=4) /*判断是否往相反的方向移动*/ snake.direction=3; else if(key == RIGHT &&snake.direction != 2) snake.direction=1; else if(key == LEFT && snake.direction != 1) snake.direction = 2; else if(key == DOWN && snake.direction != 3) snake.direction = 4; }/*endwhile(1)*/}/*游戏结束*/void GameOver(void){ cleardevice(); PrScore(); setcolor(RED); settextstyle(0, 0, 4); outtextxy(200, 200, "GAME OVER"); getch();}/*输出成绩*/void PrScore(void){ char str; setfillstyle(SOLID_FILL, YELLOW); bar(50, 15, 220, 35); setcolor(6); settextstyle(0,0,2); sprintf(str, "score:%d", score); outtextxy(55, 20, str);}/*图形结束*/void Close(void){ getch(); closegraph();}
用c语言设计贪吃蛇游戏
// 《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) * WIDTHenum IsSnake {isSnake, isNotSnake, isFood};IsSnake map;struct snake { int x; int y; snake* next; snake(int x, int y, snake* n = NULL) { this -》 x = x;this -》 y = y;next = n; }}; // snaketypedef struct snake Snake;Snake* head = NULL; // queueSnake* tail = NULL; // queueint direct = 0; // directionRECT playground; // districtTCHAR szAppName = TEXT("-*- snake game -* "); // The project nameLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // message functionvoid Initializer();void Controller(Snake*,LPVOID); // control the snakevoid 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 == 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 = 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 = 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 == isSnake); map = isFood;} // put foodvoid 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 movingvoid Controller(Snake* temp,LPVOID lParam) {HWND hwnd;hwnd=(HWND)lParam; if (temp -》 x 《 0 || temp -》 x 》= LENGTH || temp -》 y 《 0 || temp -》 y 》= LENGTH|| map == 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 == isNotSnake) { // move map = isSnake;map = isNotSnake;snake* ptr = head;head = head -》 next;delete ptr;tail -》 next = temp;tail = temp;InvalidateRect(hwnd,NULL,FALSE); } else { // if eat food map = isSnake;tail -》 next = temp;tail = temp;PutFood();//InvalidateRect(hwnd,NULL,FALSE); }}
贪吃蛇算法的C语言程序设计报告
大哥,这个应该自己到网上找资源吧,要代码会很长很长的,记得大一的时候我们也要求做报告,我做了一个管理系统呵呵,网上找资源吧
更多文章:
translate full text(有没有实现chrome那样整个网页翻译过来的脚本)
2024年7月20日 07:38
includefile(include page>和<%@include file%>的区别)
2023年7月8日 13:20
统计字符串中字母个数(C#写程序,统计所给字符串中字母的个数、数字的个数和大写字母的个数)
2024年7月23日 16:12
html style标签(请问html文档中style标签属于块状元素吗)
2024年7月9日 13:44
kindeditor导入图片(asp.net上 kindeditor上传图片界面无法显示,一直在滚动)
2024年7月3日 22:18
三星481贴片机在线编程(三星贴片机sm481软件如何安装到电脑)
2024年7月21日 14:32
测试软件是什么工作(软件测试工程师具体是干什么的(软件测试员究竟做些什么))
2024年7月17日 04:34
sqlserver连接到服务器(怎么连接别的服务器的sqlserver)
2024年8月4日 22:50
excel 字符串转数组(Excel 用公式可以将一串文本转换成数组格式吗)
2024年7月20日 07:50
html烟花特效(怎样用canvas特性制作html5烟花的效果)
2024年5月18日 20:46
flow3d(flow3d中meshing左边的控制栏怎么打开)
2024年6月9日 20:45
c语言课后习题(学了没多久C语言,课后练习题完全不会怎么办有没有好一点的学习方法和诀窍)
2024年7月3日 10:11
eclipse怎么彻底删除干净(eclipse中怎样删除工程)
2024年7月21日 14:30
countblank函数怎么用(excel函数如何计数包括空值的单元格数目)
2024年7月11日 16:06