C++简单贪吃蛇游戏——入门游戏编程(详细)

你是新手上路,C++学了一段时间了的小白吗?还在为学会了一些编程代码却不知如何应用而发愁吗?还在为自己代码能力有限不知道如何编写游戏而忧虑吗?不急,我们慢慢来,教你一步一步编写游戏代码,从零开始也能学会制作游戏!


一、前言

设置一个游戏之前,最重要的是要构思,具有全局思维,思考我们要游戏实现的功能是什么。对于贪吃蛇,我们要实现的就是实现“蛇”的移动,和“食物”的变化,并计算吃掉的“食物”的数量,也即是死亡之后的分数。明细这个核心功能后,我们就可以开始编写程序了。

二、代码实现

第一步:游戏界面

进入游戏,首先得有游戏界面开始才行,在这里我们可以利用打印图形的方法,打印出来即可。如下图:
在这里插入图片描述

第二步:围墙的设置

贪吃蛇移动得要有个范围,不能让它满屏跑,不撞墙它不死,那就成了bug。这里我们设置围墙也只用把四边打印出来,围成长方形即可。

第三步:贪吃蛇的设置与移动

这里的贪吃蛇,我们设置成几个“■”连接成的方块。要使它移动,我们只用设置死循环,使贪吃蛇的“■”不断往前一个位置移动。同时设置读取键盘的输入,该变其方向。

第四步:食物的设置

这里我们食物用"⊙"表示,把它设置成随机,用rank()函数即可。

第五步:得分的计算

当蛇撞墙时,我们就需要用if语句判断一下,输出分数。这里使用score计数,每吃掉一个“食物”就加十分。

第六步:完善代码

在运行中,我们设置了光标“-”的位置,避免从键盘读取贪吃蛇位置时,光标也随之移动。对于初学者来说,这部分代码可能有些生僻,不过,不使用这部分代码也是不影响游戏功能实现的。

三、完整代码

代码如下:

     #include<stdio.h>
    #include<Windows.h>//system
    #include<time.h>//time
    #include<conio.h>//kbhit

    char dir = 1;//方向
    int snake_x[1005], snake_y[1005], snake_len, head = 2, score = 0;
    int food_x, food_y;//食物的坐标
    void gotoxy(int x, int y){
    
     //将光标移动到x,y坐标
    	COORD pos;
    	HANDLE hOutput;
    	pos.X = x;
    	pos.Y = y;
    	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleCursorPosition(hOutput, pos);
    }
    void gotoprint(int x, int y){
    
    
    	gotoxy(x, y); printf("■");
    }
    void creatgraph() {
    
    
    	for (int i = 0; i<58; i += 2) {
    
     //打印上下边框
    		gotoprint(i, 0);//打印第一行
    		gotoprint(i, 26);//打印最后一行
    	}
    	for (int i = 1; i < 26; i++) {
    
     //打印左右边框
    		gotoprint(0, i);//打印第一列
    		gotoprint(56, i);//打印最后一列
    	}
    	gotoprint(14,15);gotoprint(14,16);gotoprint(14,17);
    	snake_x[2] = 14; snake_y[2] = 15;//初始化蛇的坐标
    	snake_x[1] = 14; snake_y[1] = 16;
    	snake_x[0] = 14; snake_y[0] = 17;
    }
    void welcome() {
    
    
    	gotoxy(15,6);  printf("/**********************************************/\n");
    	gotoxy(15,8);  printf("/*                                            */\n");
    	gotoxy(15,10); printf("/*        欢迎来到  贪吃蛇小游戏 !            */\n");
    	gotoxy(15,12); printf("/*                                            */\n");
    	gotoxy(15,14); printf("/**********************************************/\n\n\n\n\n\n");
    	system("pause"); system("cls");//清除屏幕
    }
    void gotodelete(int x, int y){
    
    //清楚x,y坐标的内容
    	gotoxy(x, y); printf("  ");
    }
    void creatfood() {
    
    //创建食物
        while (1) {
    
    
            food_y = rand() % (25) + 1;//控制食物不超出边界
            food_x = rand() % (53) + 2;
            if (food_x % 2 != 0) food_x = food_x+1;
            int flag = 0;
            for (int i = head; i > head - snake_len; i--) {
    
    //判断食物的坐标与蛇的坐标是否重合
                if (snake_x[i] == food_x && snake_y[i] == food_y) flag = 1;
            }
            if (!flag) break;
        }
    	gotoxy(food_x, food_y); printf("⊙");
    }

    void Running() {
    
    //游戏引擎
        int snake_len = 3, tx, ty;//下一步的坐标
        creatfood();
        while(1) {
    
    
            if (_kbhit()) dir = _getch();//从键盘上获取按键
            if (dir == 'w') {
    
    //上
                tx = snake_x[head];
                ty = snake_y[head] - 1;
            }
            else if (dir == 's') {
    
    //下
                tx = snake_x[head];
                ty = snake_y[head] + 1;
            }
            else if (dir == 'a') {
    
    //左
                tx = snake_x[head] - 2;
                ty = snake_y[head];
            }
            else if (dir == 'd') {
    
    //右
                tx = snake_x[head] + 2;
                ty = snake_y[head];
            }
            else continue;//按其他任意键暂停
            if (tx < 1 || tx > 54 || ty < 1 || ty > 25) break;//达到边界就退出
				int judge=0;			//吃到自己就退出
				for(int i=head-1;i>head-snake_len;i--) 
				if (snake_x[head]==snake_x[i]&&snake_y[head]==snake_y[i]) judge=1;
				if(judge) break;		//吃到自己就退出(细心的读者提出的Bug,修改啦~) 
           	if (tx == food_x && ty == food_y) {
    
    
                score += 10; snake_len++; creatfood();//重新随机食物
            }
            else gotodelete(snake_x[head-snake_len+1], snake_y[head-snake_len+1]);
            head++;
            snake_x[head] = tx;
            snake_y[head] = ty;
            gotoprint(tx, ty); gotoxy(0, 27);//消除光标干扰
            Sleep(200);//暂停200毫秒
        }
        system("cls");//清除屏幕
        gotoxy(40, 10); printf("Game Over!  Your Score is: %d\n", score);
        system("pause");
    }
    int main() {
    
    
        system("color 0B");//改变字体颜色
        welcome();
        creatgraph();
        Running();
        return 0;
    }



四、总结

代码实现的难点主要在三个方面,一是光标的设置,二是读取键盘输入,实现对贪吃蛇的方向控制,三是设置“食物”的出现。但仔细阅读代码以及查阅资料,相信小白门也能入门,体会到编写代码的乐趣啦。
当然代码也可以进一步改进,如美化界面,加上图片等,就有待各位读者发挥自己的代码能力去改善了。

猜你喜欢

转载自blog.csdn.net/TaloyerG/article/details/113048503