智能蛇游戏的学习体验
来源:互联网 发布:百知尚行 编辑:程序博客网 时间:2024/06/06 07:51
这次的实验相当于让我学到了c语言新的用途吧,原来一直被我唾弃的c语言也可以写出这么酷炫的游戏真的酷
1.首先就是实验中第一个通过不断刷新打印做出来的动态sin函数
简直就是太漂亮了,而且流畅得不行,源代码也一点都看不懂真的太棒了。
2.然后就是linux下非阻塞的输入控制贪吃蛇,源代码还是一样没看懂,不过先让我吐槽一下c语言吧,其实真的觉得c语言真的好低级啊,居然可以直接调用操作系统的api比如window.h和unix.h。这样不知道是好还是不好,这样如果用c语言写的软件如果想从window移植到linux都好改很多源码,可能放在c语言刚被发明出来的时候很理所当然但是放在现在的环境下就不能算是一个明智的选择了,但凡比较新一点的语言都是把跨平台放在一个比较高的优先级上,不过也正是因为c语言够低级才让它在嵌入式语言里的地位一家独大。
3.然后就是老师给出来的最直观的智能蛇了,通过距离来做出决策够简单够粗暴,如果想加点东西那就可以宽度优先搜索了,至少可以不用当心走到一半撞上自己的身体。还有一种很无脑的方法就是一直从墙的边缘绕圈来不断占领空间来限制money可能会随机生成的空间。如果没有障碍物就可以一直吃下去了。因为这种东西的随机性让想彻底解决贪吃蛇的选择问题变得近乎不可能了,所以要想效果好,想一步走一步是不可能的了,怎么才能做出抉择才能让之后的情形更好才是最关键的问题。
所以废话不多说,上强化学习吧。
// main.c// snake#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define BLANK_CELL ' '#define SNAKE_FOOD '$'#define WALL_CELL '*'//move by providing the x_index and y_indexvoid snake_move(int x_index,int y_index);//randomly put moneyvoid put_money();//print the framevoid output();//check for overint gameover();char map[12][13]= { "************", "*XXXXH *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "* *", "************" }; struct Point { int x; int y; }; /*Point x1; Point x2; Point x3; Point x4; Point x5;*/ struct Point snake_arr[20]; //={x1,x2,x3,x4,x5}; int snake_length=5; struct Point * head=&snake_arr[4]; struct Point * tail=&snake_arr[0]; int fruit_x=5,fruit_y=5; void random_generator_fruit() { fruit_x=rand()%10+1; fruit_y=rand()%10+1; map[fruit_y][fruit_x]='$'; for(int i=0;i<snake_length;i++) { if(snake_arr[i].x==fruit_x&&snake_arr[i].y==fruit_y) random_generator_fruit(); } } int process=1; int main() { srand((unsigned)time(NULL)); /*for(i=0;i<12;i++) { for(j=0;j<12;j++) { if(map[i][j]=='H') { break; } } }*/ for(int k=4;k>=0;k--) { snake_arr[k].x=k+1; snake_arr[k].y=1; /* for(int i=0;i<snake_length-1;i++) { snake_arr[i].x=snake_arr[i+1].x; snake_arr[i].y=snake_arr[i+1].y; }*/ } random_generator_fruit(); for(;gameover()!=-1&&process!=0;) { system("cls"); output(); char ch=getch(); switch(ch) { case 'w': case 'W': snake_move(0,-1); break; case 's': case 'S': snake_move(0,1); break; case 'a': case 'A': snake_move(-1,0); break; case 'd': case 'D': snake_move(1,0); break; } } printf("game over"); return 0; } void output() { for(int i=0;i<12;i++) { printf("%s\n",map[i]); } } void snake_move(int x_index,int y_index) { int temp_x=head->x+x_index,temp_y=head->y+y_index; for(int i=0;i<snake_length;i++) { if(snake_arr[i].x==temp_x&&snake_arr[i].y==temp_y) { process=0; return ; } } if(temp_x!=fruit_x||temp_y!=fruit_y) { map[tail->y][tail->x]=' '; map[head->y][head->x]='X'; map[head->y+y_index][head->x+x_index]='H'; for(int i=0;i<snake_length-1;i++) { snake_arr[i].x=snake_arr[i+1].x; snake_arr[i].y=snake_arr[i+1].y; } snake_arr[snake_length-1].x=temp_x; snake_arr[snake_length-1].y=temp_y; } else { map[head->y][head->x]='X'; map[head->y+y_index][head->x+x_index]='H'; snake_arr[snake_length].x=temp_x; snake_arr[snake_length].y=temp_y; head=&snake_arr[snake_length]; snake_length++; random_generator_fruit(); } } int gameover() { int flag=1; for(int i=0;i<snake_length;i++) { if(snake_arr[i].x<=0||snake_arr[i].x>=11||snake_arr[i].y<=0||snake_arr[i].y>=11) { flag=0; break; } } if(flag==0) { return -1; } return 1; }
阅读全文