你是新手上路,C++学了一段时间了的小白吗?还在为学会了一些编程代码却不知如何应用而发愁吗?还在为自己代码能力有限不知道如何编写游戏而忧虑吗?不急,我们慢慢来,教你一步一步编写游戏代码,从零开始也能学会制作游戏!
设置一个游戏之前,最重要的是要构思,具有全局思维,思考我们要游戏实现的功能是什么。对于贪吃蛇,我们要实现的就是实现“蛇”的移动,和“食物”的变化,并计算吃掉的“食物”的数量,也即是死亡之后的分数。明细这个核心功能后,我们就可以开始编写程序了。
进入游戏,首先得有游戏界面开始才行,在这里我们可以利用打印图形的方法,打印出来即可。如下图:
贪吃蛇移动得要有个范围,不能让它满屏跑,不撞墙它不死,那就成了bug。这里我们设置围墙也只用把四边打印出来,围成长方形即可。
这里的贪吃蛇,我们设置成几个“■”连接成的方块。要使它移动,我们只用设置死循环,使贪吃蛇的“■”不断往前一个位置移动。同时设置读取键盘的输入,该变其方向。
这里我们食物用"⊙"表示,把它设置成随机,用rank()函数即可。
当蛇撞墙时,我们就需要用if语句判断一下,输出分数。这里使用score计数,每吃掉一个“食物”就加十分。
在运行中,我们设置了光标“-”的位置,避免从键盘读取贪吃蛇位置时,光标也随之移动。对于初学者来说,这部分代码可能有些生僻,不过,不使用这部分代码也是不影响游戏功能实现的。
代码如下:
#include
#include //system
#include //time
#include //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;
}
代码实现的难点主要在三个方面,一是光标的设置,二是读取键盘输入,实现对贪吃蛇的方向控制,三是设置“食物”的出现。但仔细阅读代码以及查阅资料,相信小白门也能入门,体会到编写代码的乐趣啦。
当然代码也可以进一步改进,如美化界面,加上图片等,就有待各位读者发挥自己的代码能力去改善了。