• C语言写贪吃蛇


    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <Windows.h>
    #include <conio.h>
    
    /* 地图长和宽 */
    #define MAPHEIGHT 25
    #define MAPWIDTH 60
    #define SNAKSIZE 50
    
    // 数据结构设计
    int changeFlag = 0; // 蛇变化标记
    int key = 'w';
    
    // 食物位置
    struct _food_
    {
    	int x;
    	int y;
    }food;
    
    // 贪吃蛇数据结构
    struct snake
    {
    	int x[SNAKSIZE]; // 蛇坐标
    	int y[SNAKSIZE];
    	int len; // 当前长度
    	int speed; // 移动速度
    }mysnake;
    
    // cmd移动辅助函数
    void gotoxy(int x, int y)
    {
    	// 获取cmd窗口句柄
    	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    	// 光标位置
    	COORD coord;
    	coord.X = x;
    	coord.Y = y;
    	SetConsoleCursorPosition(handle, coord);
    }
    
    // 绘制地图
    void drawMap()
    {
    	srand((unsigned int)time(NULL));
    	// 食物
    	// 1.食物属性
    	food.x = rand() % (MAPWIDTH - 4) + 2;
    	food.y = rand() % (MAPHEIGHT - 2) + 1;
    		// 2.画食物
    	gotoxy(food.x, food.y);
    	printf("⊙");
    
    	// 蛇
    	// 1.蛇属性
    	mysnake.x[0] = MAPWIDTH / 2; // 定位在中间
    	mysnake.y[0] = MAPHEIGHT / 2;
    
    	// 2.画蛇
    	gotoxy(mysnake.x[0], mysnake.y[0]);
    	printf("■");
    	mysnake.len = 3;
    	mysnake.speed = 100;
    	for (int i = 1; i < mysnake.len; ++i) {
    		mysnake.x[i] = mysnake.x[i - 1] + 2;
    		mysnake.y[i] = mysnake.y[i - 1];
    		gotoxy(mysnake.x[i], mysnake.y[i]);
    		printf("■");
    	}
    
    	// 边框
    	// 1.左右
    	for (int i = 0; i < MAPHEIGHT; ++i) {
    		gotoxy(0, i);
    		printf("■");
    		gotoxy(MAPWIDTH, i);
    		printf("■");
    	}
    
    	// 2.上下
    	for (int i = 0; i < MAPWIDTH; ++i) {
    		gotoxy(i, 0);
    		printf("■");
    		gotoxy(i, MAPHEIGHT);
    		printf("■");
    	}
    }
    
    // 按键检测
    void keyDown()
    {
    	key = _getch();
    	switch (key)
    	{
    	case 'w':
    	case 'W':
    	case 72:
    		mysnake.y[0]--;
    		break;
    	case 's':
    	case 'S':
    	case 80:
    		mysnake.y[0]++;
    		break;
    	case 'a':
    	case 'A':
    	case 75:
    		mysnake.x[0] -= 2;
    		break;
    	case 'd':
    	case 'D':
    	case 77:
    		mysnake.x[0] += 2;
    		break;
    	default:
    		return;
    	}
    	gotoxy(mysnake.x[0], mysnake.y[0]);
    	printf("■");
    	changeFlag = 0;
    	gotoxy(MAPHEIGHT + 2, 0);
    }
    
    // 产生食物
    void createFood()
    {
    	if (mysnake.x[0] == food.x && mysnake.y[0] == food.y)
    	{
    		srand((unsigned int)time(NULL));
    		while (1) 
    		{
    			int flag = 1;
    			food.x = rand() % (MAPWIDTH - 4) + 2;
    			food.y = rand() % (MAPHEIGHT - 2) + 1;
    			for (int i = 0; i < mysnake.len; ++i) {
    				if (mysnake.x[i] == food.x && mysnake.y[i] == food.y) {
    					flag = 0;
    					break;
    				}
    			}
    			// 食物坐标要为偶数且不能在蛇的身上
    			if (flag && food.x % 2 == 0)
    				break;
    		}
    		gotoxy(food.x, food.y);
    		printf("⊙");
    		mysnake.len++;
    		changeFlag = 1;
    	}
    }
    
    // 蛇状态
    int snakeStatus()
    {
    	if (mysnake.x[0] == 0 || mysnake.x[0] == MAPHEIGHT - 2 
    		|| mysnake.y[0] == MAPWIDTH - 2 || mysnake.y[0] == 0) 
    	{
    		return 0;
    	}
    	for (int i = 1; i < mysnake.len; ++i) {
    		if (mysnake.x[i] == mysnake.x[0] && mysnake.y[i] == mysnake.y[0])
    			return 0;
    	}
    	return 1;
    
    }
    
    int main()
    {
    	drawMap();
    	while (1)
    	{
    		createFood();
    		Sleep(mysnake.speed);
    		keyDown();
    		if (!snakeStatus())
    			break;
    	}
    	MessageBox(NULL, TEXT("GameOver"), TEXT("提示"), MB_OK | MB_ICONWARNING);
    	return 0;
    }
    

      

  • 相关阅读:
    leetcode-滑动窗口
    leetcode刷题-双指针
    nlp
    机器学习
    tf-idf算法
    RNN和LSTM的理解
    DDD落地实践-战术实现心得
    DDD落地实践-战略设计心得
    测试平台系列(66) 数据驱动之基础Model
    Python小知识之对象的比较
  • 原文地址:https://www.cnblogs.com/veis/p/12950331.html
Copyright © 2020-2023  润新知