怎样用C语言编出一些用java编写小游戏戏

2013年10月 Linux/Unix社区大版内专家分月排行榜第二2013年9月 Linux/Unix社区大版内专家分月排行榜第二
2013年12月 Linux/Unix社区大版内专家分月排行榜第三2013年11月 Linux/Unix社区大版内专家分月排行榜第三2013年6月 Linux/Unix社区大版内专家分月排行榜第三
2014年2月 C/C++大版内专家分月排行榜第二2013年4月 C/C++大版内专家分月排行榜第二2013年3月 C/C++大版内专家分月排行榜第二2012年12月 C/C++大版内专家分月排行榜第二2012年11月 C/C++大版内专家分月排行榜第二2012年8月 C/C++大版内专家分月排行榜第二
2014年12月 C/C++大版内专家分月排行榜第三2014年5月 C/C++大版内专家分月排行榜第三2014年3月 C/C++大版内专家分月排行榜第三2013年12月 C/C++大版内专家分月排行榜第三2013年10月 C/C++大版内专家分月排行榜第三2013年9月 C/C++大版内专家分月排行榜第三2013年7月 C/C++大版内专家分月排行榜第三2013年5月 C/C++大版内专家分月排行榜第三2013年2月 C/C++大版内专家分月排行榜第三2013年1月 C/C++大版内专家分月排行榜第三2012年9月 C/C++大版内专家分月排行榜第三
2014年2月 C/C++大版内专家分月排行榜第二2013年4月 C/C++大版内专家分月排行榜第二2013年3月 C/C++大版内专家分月排行榜第二2012年12月 C/C++大版内专家分月排行榜第二2012年11月 C/C++大版内专家分月排行榜第二2012年8月 C/C++大版内专家分月排行榜第二
2014年12月 C/C++大版内专家分月排行榜第三2014年5月 C/C++大版内专家分月排行榜第三2014年3月 C/C++大版内专家分月排行榜第三2013年12月 C/C++大版内专家分月排行榜第三2013年10月 C/C++大版内专家分月排行榜第三2013年9月 C/C++大版内专家分月排行榜第三2013年7月 C/C++大版内专家分月排行榜第三2013年5月 C/C++大版内专家分月排行榜第三2013年2月 C/C++大版内专家分月排行榜第三2013年1月 C/C++大版内专家分月排行榜第三2012年9月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2015年11月 扩充话题大版内专家分月排行榜第一2015年7月 扩充话题大版内专家分月排行榜第一2015年1月 扩充话题大版内专家分月排行榜第一2014年9月 扩充话题大版内专家分月排行榜第一(补)2013年9月 扩充话题大版内专家分月排行榜第一2013年8月 扩充话题大版内专家分月排行榜第一2013年7月 扩充话题大版内专家分月排行榜第一
2016年3月 扩充话题大版内专家分月排行榜第二2015年12月 扩充话题大版内专家分月排行榜第二2015年6月 扩充话题大版内专家分月排行榜第二2015年2月 扩充话题大版内专家分月排行榜第二2014年10月 扩充话题大版内专家分月排行榜第二2014年8月 扩充话题大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"title":"做游戏,学编程(C语言) 6 数组之空战游戏","author":"tongjingHHU","content":"利用数组,我们可以在空战游戏中实现多台敌机、发射闪弹等效果。大家可以用之前教程的思路,尝试分步骤实现:飞机的显示、单个敌机、多个敌机、发射常规子弹、发射闪弹,以下是完整的代码。#include &stdio.h&\n#include &stdlib.h&\n#include &conio.h&\n#include &windows.h&\n\n#define High 15
// 游戏画面尺寸\n#define Width 25\n#define EnemyNum 5 // 敌机个数\n\n// 全局变量\nint position_x,position_y; // 飞机位置\nint enemy_x[EnemyNum],enemy_y[EnemyNum];
// 敌机位置\nint canvas[High][Width] = {0}; // 二维数组存储游戏画布中对应的元素\n
// 0为空格,1为飞机*,2为子弹|,3为敌机@\ // 得分\nint BulletW // 子弹宽度\nint EnemyMoveS // 敌机移动速度\n\nvoid gotoxy(int x,int y)
//光标移动到(x,y)位置\n{\n
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n
SetConsoleCursorPosition(handle,pos);\n}\n\nvoid startup() // 数据初始化\n{\n\tposition_x = High-1;\n\tposition_y = Width/2;\n\tcanvas[position_x][position_y] = 1;\t\n\\n\tfor (k=0;k&EnemyNk++)\n\t{\n\t\tenemy_x[k] = rand()%2;\n\t\tenemy_y[k] = rand()%W\n\t\tcanvas[enemy_x[k]][enemy_y[k]] = 3;\n\t}\n\tscore = 0;\n\tBulletWidth = 0;\n\tEnemyMoveSpeed = 20;\n}\n\nvoid show()
// 显示画面\n{\n\tgotoxy(0,0);
// 光标移动到原点位置,以下重画清屏\n\tint i,j;\n\tfor (i=0;i&Hi++)\n\t{\n\t\tfor (j=0;j&Wj++)\n\t\t{\n\t\t\tif (canvas[i][j]==0)\n\t\t\t\tprintf(\" \");
输出空格\n\t\t\telse if (canvas[i][j]==1)\n\t\t\t\tprintf(\"*\");
输出飞机*\n\t\t\telse if (canvas[i][j]==2)\n\t\t\t\tprintf(\"|\");
输出子弹|\n\t\t\telse if (canvas[i][j]==3)\n\t\t\t\tprintf(\"@\");
输出飞机@\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n\tprintf(\"得分:%d\\n\",score);\n\tSleep(20);\n}\t\n\nvoid updateWithoutInput()
// 与用户输入无关的更新\n{\n\tint i,j,k;\n\tfor (i=0;i&Hi++)\n\t{\n\t\tfor (j=0;j&Wj++)\n\t\t{\n\t\t\tif (canvas[i][j]==2) \n\t\t\t{\n\t\t\t\tfor (k=0;k&EnemyNk++)\n\t\t\t\t{\n\t\t\t\t\tif ((i==enemy_x[k]) && (j==enemy_y[k]))
// 子弹击中敌机\n\t\t\t\t\t{\n\t\t\t\t\t\tscore++;
// 分数加1\n\t\t\t\t\t\tif (score%5==0 && EnemyMoveSpeed&3)
// 达到一定积分后,敌机变快\n\t\t\t\t\t\t\tEnemyMoveSpeed--;\n\t\t\t\t\t\tif (score%5==0)
// 达到一定积分后,子弹变厉害\n\t\t\t\t\t\t\tBulletWidth++;\n\t\t\t\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 0;\n\t\t\t\t\t\tenemy_x[k] = rand()%2;
// 产生新的飞机\n\t\t\t\t\t\tenemy_y[k] = rand()%W\n\t\t\t\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 3;\n\t\t\t\t\t\tcanvas[i][j] = 0;
// 子弹消失\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// 子弹向上移动\n\t\t\t\tcanvas[i][j] = 0;\n\t\t\t\tif (i&0)\n\t\t\t\t\tcanvas[i-1][j] = 2;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic int speed = 0;
\n\tif (speed&EnemyMoveSpeed)\n\t\tspeed++;\n\n\tfor (k=0;k&EnemyNk++)\n\t{\n\t\tif ((position_x==enemy_x[k]) && (position_y==enemy_y[k]))
// 敌机撞到我机\n\t\t{\n\t\t\tprintf(\"失败!\\n\");\n\t\t\tSleep(3000);\n\t\t\tsystem(\"pause\");\n\t\t\texit(0);\n\t\t}\n\n\t\tif (enemy_x[k]&High)
// 敌机跑出显示屏幕\n\t\t{\n\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 0;\n\t\t\tenemy_x[k] = rand()%2;
// 产生新的飞机\n\t\t\tenemy_y[k] = rand()%W\n\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 3;\n\t\t\tscore--;
// 减分\n\t\t}\n\n\t\tif (speed == EnemyMoveSpeed)\n\t\t{\n\t\t\t// 敌机下落\n\t\t\tfor (k=0;k&EnemyNk++)\n\t\t\t{\n\t\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 0;\n\t\t\t\tenemy_x[k]++;\t\t\t\n\t\t\t\tspeed = 0;\n\t\t\t\tcanvas[enemy_x[k]][enemy_y[k]] = 3;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid updateWithInput()
// 与用户输入有关的更新\n{\n\\n\tif(kbhit())
// 判断是否有输入\n\t{\n\t\tinput = getch();
// 根据用户的不同输入来移动,不必输入回车\n\t\tif (input == 'a' && position_y&0) \n\t\t{\n\t\t\tcanvas[position_x][position_y] = 0;\n\t\t\tposition_y--;
// 位置左移\n\t\t\tcanvas[position_x][position_y] = 1;\n\t\t}\n\t\telse if (input == 'd' && position_y&Width-1)\n\t\t{\n\t\t\tcanvas[position_x][position_y] = 0;\n\t\t\tposition_y++;
// 位置右移\n\t\t\tcanvas[position_x][position_y] = 1;\n\t\t}\n\t\telse if (input == 'w')\n\t\t{\n\t\t\tcanvas[position_x][position_y] = 0;\n\t\t\tposition_x--;
// 位置上移\n\t\t\tcanvas[position_x][position_y] = 1;\n\t\t}\n\t\telse if (input == 's')\n\t\t{\n\t\t\tcanvas[position_x][position_y] = 0;\n\t\t\tposition_x++;
// 位置下移\n\t\t\tcanvas[position_x][position_y] = 1;\n\t\t}\n\t\telse if (input == ' ')
// 发射子弹\n\t\t{\n\t\t\tint left = position_y-BulletW\n\t\t\tint right = position_y+BulletW\n\t\t\tif (left&0)\n\t\t\t\tleft = 0;\n\t\t\tif (right&Width-1)\n\t\t\t\tright = Width-1;\n\t\t\\n\t\t\tfor (k=k&=k++) // 发射闪弹\n\t\t\t\tcanvas[position_x-1][k] = 2; // 发射子弹的初始位置在飞机的正上方\n\t\t}\t\t\n\t}\n}\n\nint main()\n{\n\tstartup();
// 数据初始化\t\n\twhile (1)
// 游戏循环执行\n\t{\n\t\tshow();
// 显示画面\n\t\tupdateWithoutInput();
// 与用户输入无关的更新\n\t\tupdateWithInput();
// 与用户输入有关的更新\n\t}\n\treturn 0;\n}\n\n这个代码快200行了,大家吃透这个代码,相信对C语言的基本语法和逻辑结构都有了较好的掌握。思考题:尝试让敌机也发射子弹,增加形状血量不一样的敌机boss。下一个教程,学习EasyX图形交互功能----flappy bird源代码:","updated":"T01:36:36.000Z","canComment":false,"commentPermission":"anyone","commentCount":22,"likeCount":175,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T09:36:36+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-f5d72828fbd36e2d01aa5f_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":22,"likesCount":175},"":{"title":"一个C语言控制台小游戏:是男人就坚持100秒","author":"qu-lan-gan-shen-yuan-yu-22","content":"=============================更新一下忍不住想说一下gotoxy()这个函数,因为以后的代码都不会用的它了。这个函数里参数如果是gotoxy(0,0)时,可以当做system(\"cls\")来使用,而且不会有cls的闪屏问题,控制台更新会变得流程许多。但这个函数也有缺陷,因为它的用处是跳到某一个坐标点开始重新打印,如果没有重新打印到的地方不会更新。比如对于打印\"#\"这个符号在某一行的n个空格的后面,每打印一次n--,并且用gotoxy来清屏,那最后打印出来不会是\"#\"以gif的形式左移,而是#########所以用gotoxy时,一行打印必须固定多少个,要更新的部分不能清屏就不管,也要用空格覆盖掉刚刚接触这个函数的时候不知道这个性质,也没有人告诉我,所以当时的flappy bird存在墙往前推后面的墙不刷新去掉,过了很久才反应过来是为什么。========================================================在学会多维数组后,可以用二维数组当做地图来使用,这里来展示一下一个利用二维数组制作的小游戏:是男人就坚持100秒。因为我只是一名大一的学生,代码水平有限,深知自己的不足,希望得到各位的指导,并且能对不熟悉这类小游戏写法的同学一点帮助。======================================================================是男人就坚持一百秒的游戏要素:对二维数组静态地图及边框的打印对玩家控制单位的引入地图的刷新及玩家对单位的控制敌人单位的引入敌人单位的追逐碰撞失败的判定记录游戏时间判定胜负游戏的一些优化和设计======================================================================通过对这些要素的逐个实现,一个完整的小游戏就得到完成,下面就展示一些我的思路对各个要素的实现代码。最终版代码的结构======================================================================对1~3部分元素的实现:首先定义一个二维数组a[100][100]为地图,定义边框位置top=0,bottom,left=0,right,bottom和right由用户自己输入,从而定义下边框,然后设定a[][]=不同值时打印不同的东西,对边框部分的数组值在初始化函数将之赋值,并且在后续部分不再改变边框部分的值,但对其他部分每次循环都先全部赋值为打印空格的值。定义玩家坐标player_x,player_y,在updatewithinput()部分不断把a[player_x][player_y]=1,并且用读取键盘函数判定玩家的控制,从而改变player_x,player_y,进而改变玩家单位的打印位置。#include&conio.h&\n#include&time.h&\n#include&stdlib.h&\n#include&stdio.h&\n#include&windows.h&\nint a[100][100];\nint i, j,\nint top = 0, bottom, right, left = 0;\nint player_x, player_y;\nint con = 1;\nvoid gotoxy(int x, int y);//类似于清屏函数\nvoid HideCursor();//清除光标的函数\n\n/*初始化数据*/void startup()\n{\n\tprintf(\"请输入地图宽,长\\n\");\n\tscanf(\"%d%d\", &bottom, &right);\n\tfor (i = i& i++)\n\t{\n\t\tfor (j = j& j++)\n\t\t{\n\t\t\tif (i == 0 || i == bottom - 1)\n\t\t\t\ta[i][j] = 3;//打印上下边框
3控制\n\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (j == 0 || j == right - 1)\n\t\t\t\t\ta[i][j] = 4;//打印左右边框
4控制\n\t\t\t}\n\t\t}\n\t}\n\tplayer_x = rand() % (bottom - 1) + 1;\n\tplayer_y = rand() % (right - 1) + 1;//随机初始位置坐标\n\tHideCursor();\n\tsystem(\"cls\");\n}\n/*与控制有关的更新*/void updatewithinput()\n{\n\tif (kbhit())\n\t{\n\t\tif ((GetAsyncKeyState(0x41) & 0x8000) ? 1 : 0)//a\n\t\t\tplayer_y -= 2;\n\t\telse\tif ((GetAsyncKeyState(0x44) & 0x8000) ? 1 : 0)//d\n\t\t\tplayer_y += 2;\n\t\tif ((GetAsyncKeyState(0x57) & 0x8000) ? 1 : 0)//w\n\t\t\tplayer_x -= 2;\n\t\telse if ((GetAsyncKeyState(0x53) & 0x8000) ? 1 : 0)//s\n\t\t\tplayer_x += 2;\n\t}\n\tFlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));\n\n\tfflush(stdin);\n}\n/*打印游戏内容*/void show()\n{\n\tgotoxy(0, 0);\n\tfor (i = 0; i& i++)\n\t{\n\t\tfor (j = 0; j& j++)\n\t\t{\n\t\t\tif (a[i][j] == 0)\n\t\t\t\tprintf(\" \");\n\t\t\telse if (a[i][j] == 1)\n\t\t\t\tprintf(\"@\");\n\t\t\telse if (a[i][j] == 3)\n\t\t\t\tprintf(\"-\");\n\t\t\telse if (a[i][j] == 4)\n\t\t\t\tprintf(\"|\");\n\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n}\n/*与控制无关的更新*/void updatewithoutinput()\n{\n\tfor (i = top + 1; i&bottom - 1; i++)\n\t{\n\t\tfor (j = left + 1; j&right - 1; j++)\n\t\t{\n\t\t\ta[i][j] = 0;\n\t\t}\n\t}\n\ta[player_x][player_y] = 1;//确定玩家位置 用1控制\n}\nint main()\n{\n\tstartup();\n\twhile (con)\n\t{\n\t\tshow();\n\t\tupdatewithoutinput();\n\t\tupdatewithinput();\n\t}\n}\nvoid gotoxy(int x, int y)//类似于清屏函数\n{\n\tHANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\tCOORD\n\tpos.X =\n\tpos.Y =\n\tSetConsoleCursorPosition(handle, pos);\n}\nvoid HideCursor()//清除光标的函数\n{\n\tCONSOLE_CURSOR_INFO cursor_info = { 1, 0 };\n\tSetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隐藏输入符号\n}\n======================================================================在实现上面的代码之后就要引入敌人对玩家的追逐和碰撞失败的判定,并且要加入对时间的记录来判定是否达到100秒。同时用预留在while()的判定里的con来控制游戏的结束。敌人的引入与玩家的方法类似,只是要对敌人的坐标使用数组来定义多个敌人的坐标enemy_x[20],同时在updatewithouinput()里面持续给地图二维数组a[enemy_x[k]][enemy_y[k]]赋值为打印敌人的数值。敌人个数也定义enemy_number,由玩家输入控制。敌人与玩家碰撞的判定是让刷新放在打印enmy_x[k],enemy_y[x]先经由chase()函数改变,这时候如果a[enemy_x[k]][enemy_y[k]]与打印玩家的数值相等,就说明是追逐上了。同理对a[player_x][player_y]如果对于 对时间的控制则是用clock()函数,记录开始的时间,再在循环里记录现在的时间,两个时间的差值就是游戏进行的时间。#include&conio.h&\n#include&time.h&\n#include&stdlib.h&\n#include&stdio.h&\n#include&windows.h&\nint a[100][100];\nint enemy_x[50];int enemy_y[50];\nint enemy_\nint i, j,\nint top = 0, bottom, right, left = 0;\nint player_x, player_y;\nint con = 1;\nfloat startTime, endT\nvoid gotoxy(int x, int y);//类似于清屏函数\nvoid HideCursor();//清除光标的函数\n/*记录开始时间*/void start_time()\n{\n\tstartTime = clock();\n}//记录开始时间\n/*记录现在时间*/void now_time()\n{\n\tendTime = clock();\n}\n/*判定游戏结束后的胜负*/void timejudge()\n{\n\tif ((endTime - startTime) / 1000.0 &= 100)\n\t{\n\t\tprintf(\"You lose!!!\\n\");\n\t\tfor (int s = 0; s&3; s++)\n\t\t\tsystem(\"pause\");\n\t}\n\telse\n\t{\n\t\tsystem(\"cls\");\n\t\tprintf(\"You win!!!\\n\");\n\t\tfor (int w = 0; w&5; w++)\n\t\t\tsystem(\"pause\");\n\t}\n}\n/*判定游戏是否应该结束*/void judge()\n{\n\tfor (k = 0; k & enemy_ k++)\n\t\tif (a[enemy_x[k]][enemy_y[k]] == 1 || a[player_x][player_y] == 2)\n\t\t{\n\t\tcon = 0;\n\t\ttimejudge();\n\t\t}\n}\n\n/*敌人对玩家的追逐*/void chase()\n{\n\tfor (k = 0; k & enemy_ k++)\n\t{\n\t\tif (enemy_x[k]&player_x)\n\t\t\tenemy_x[k]--;\n\t\telse if (enemy_x[k]&player_x)\n\t\t\tenemy_x[k]++;\n\t\tif (enemy_y[k]&player_y)\n\t\t\tenemy_y[k]--;\n\t\telse if (enemy_y[k]&player_y)\n\t\t\tenemy_y[k]++;\n\t}\n}\n/*初始化数据*/void startup()\n{\n\tprintf(\"请输入地图宽,长\\n\");\n\tscanf(\"%d%d\", &bottom, &right);\n\tprintf(\"请输入敌人个数\\n\");\n\tscanf(\"%d\", &enemy_number);\n\tstart_time();\n\tfor (i = i& i++)\n\t{\n\t\tfor (j = j& j++)\n\t\t{\n\t\t\tif (i == 0 || i == bottom - 1)\n\t\t\t\ta[i][j] = 3;//打印上下边框
3控制\n\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (j == 0 || j == right - 1)\n\t\t\t\t\ta[i][j] = 4;//打印左右边框
4控制\n\t\t\t}\n\t\t}\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t{\n\t\tenemy_x[k] = rand() % (bottom - 1) + 1;\n\t\tenemy_y[k] = rand() % (right - 1) + 1;//随机敌人初始位置坐标\n\n\t}\n\tplayer_x = rand() % (bottom - 1) + 1;\n\tplayer_y = rand() % (right - 1) + 1;//随机初始位置坐标\n\tHideCursor();\n\tsystem(\"cls\");\n}\n/*与控制有关的更新*/void updatewithinput()\n{\n\tif (kbhit())\n\t{\n\t\tif ((GetAsyncKeyState(0x41) & 0x8000) ? 1 : 0)//a\n\t\t\tplayer_y -= 2;\n\t\telse\tif ((GetAsyncKeyState(0x44) & 0x8000) ? 1 : 0)//d\n\t\t\tplayer_y += 2;\n\t\tif ((GetAsyncKeyState(0x57) & 0x8000) ? 1 : 0)//w\n\t\t\tplayer_x -= 2;\n\t\telse if ((GetAsyncKeyState(0x53) & 0x8000) ? 1 : 0)//s\n\t\t\tplayer_x += 2;\n\t}\n\tFlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));\n\n\tfflush(stdin);\n}\n/*打印游戏内容*/void show()\n{\n\tgotoxy(0, 0);\n\tfor (i = 0; i& i++)\n\t{\n\t\tfor (j = 0; j& j++)\n\t\t{\n\t\t\tif (a[i][j] == 0)\n\t\t\t\tprintf(\" \");\n\t\t\telse if (a[i][j] == 1)\n\t\t\t\tprintf(\"@\");\n\t\t\telse if (a[i][j] == 2)\n\t\t\t\tprintf(\"#\");\n\t\t\telse if (a[i][j] == 3)\n\t\t\t\tprintf(\"-\");\n\t\t\telse if (a[i][j] == 4)\n\t\t\t\tprintf(\"|\");\n\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n\tnow_time();\n\tprintf(\"\\n\");\n\tprintf(\"%.3f s\\n\", (endTime - startTime) / 1000.0);\n}\n/*与控制无关的更新*/void updatewithoutinput()\n{\n\tfor (i = top + 1; i&bottom - 1; i++)\n\t{\n\t\tfor (j = left + 1; j&right - 1; j++)\n\t\t{\n\t\t\ta[i][j] = 0;\n\t\t}\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t{\n\t\tif (enemy_y[k] &= left + 1)\n\t\t\tenemy_y[k] = left + 1;\n\t\tif (enemy_y[k] &= right - 2)\n\t\t\tenemy_y[k] = right - 2;\n\t\tif (enemy_x[k] &= top)\n\t\t\tenemy_x[k] = top + 1;\n\t\tif (enemy_x[k] &= bottom - 2)\n\t\t\tenemy_x[k] = bottom - 2;\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t\ta[enemy_x[k]][enemy_y[k]] = 2;//确定敌人位置 用2控制\n\n\ta[player_x][player_y] = 1;//确定玩家位置 用1控制\n\tif (((enemy_time_2 - enemy_time_1) % enemy_speed) == 0)\n\t\tchase();\n\tjudge();\n\tnever_coincide();\n}\nint main()\n{\n\tstartup();\n\twhile (con)\n\t{\n\t\tshow();\n\t\tupdatewithoutinput();\n\t\tupdatewithinput();\n\t}\n}\nvoid gotoxy(int x, int y)//类似于清屏函数\n{\n\tHANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\tCOORD\n\tpos.X =\n\tpos.Y =\n\tSetConsoleCursorPosition(handle, pos);\n}\nvoid HideCursor()//清除光标的函数\n{\n\tCONSOLE_CURSOR_INFO cursor_info = { 1, 0 };\n\tSetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隐藏输入符号,否则会很闪很闪,。\n}\n=====================================================================在完成上面的部分后,游戏的基础也就做完了,但是游戏还是存在各种各样的问题,比如多个敌人的坐标如果是游戏过程中变得相等,那后面它们所经历的运算是完全相同的,永远不会分开,对于这个情况就一个加入一个函数对这种情况给予一个扰动。敌人的运行速度也不能控制,可能会显得太快了,需要对敌人的运行速度进行一些限制,但sleep函数会影响影响的流畅而不方便用,也得写入东西来解决,同时要限制玩家单位和敌人都在地图的框内。对于这些问题进行一些优化,就得到了我现在的最终版。#include&conio.h&\n#include&time.h&\n#include&stdlib.h&\n#include&stdio.h&\n#include&windows.h&\nint a[100][100];\nint enemy_x[50];int enemy_y[50];\nint enemy_\nint i, j,\nint top = 0, bottom, right, left = 0;\nint player_x, player_y;\nint con = 1;\nfloat startTime, endT\nint enemy_time_1, enemy_time_2;\nint enemy_\nvoid gotoxy(int x, int y);//类似于清屏函数\nvoid HideCursor();//清除光标的函数\n/*记录开始时间*/void start_time()\n{\n\tstartTime = clock();\n\tenemy_time_1 = clock();\n}//记录开始时间\n/*记录现在时间*/void now_time()\n{\n\tendTime = clock();\n\tenemy_time_2 = clock();\n}\n/*判定游戏结束后的胜负*/void timejudge()\n{\n\tif ((endTime - startTime) / 1000.0 &= 100)\n\t{\n\t\tprintf(\"You lose!!!\\n\");\n\t\tfor (int s = 0; s&3; s++)\n\t\t\tsystem(\"pause\");\n\t}\n\telse\n\t{\n\t\tsystem(\"cls\");\n\t\tprintf(\"You win!!!\\n\");\n\t\tfor (int w = 0; w&5; w++)\n\t\t\tsystem(\"pause\");\n\t}\n}\n/*判定游戏是否应该结束*/void judge()\n{\n\tfor (k = 0; k & enemy_ k++)\n\t\tif (a[enemy_x[k]][enemy_y[k]] == 1 || a[player_x][player_y] == 2)\n\t\t{\n\t\tcon = 0;\n\t\ttimejudge();\n\t\t}\n}\n/*因为多个敌人可能重合在一个坐标上,故给重合部分一个扰动*/void never_coincide()\n{\n\tint a,\n\tfor (a = 0; a&enemy_ a++)\n\t\tfor (b = 0; b&enemy_ b++)\n\t\t\tif (a != b)\n\t\t\t\tif (enemy_x[a] == enemy_x[b] && enemy_y[a] == enemy_y[b])\n\t\t\t\t{\n\t\tenemy_x[a] += rand() % 2 - 1;\n\t\tenemy_y[a] += rand() % 2 - 1;\n\t\t\t\t}\n}\n/*敌人对玩家的追逐*/void chase()\n{\n\tfor (k = 0; k & enemy_ k++)\n\t{\n\t\tif (enemy_x[k]&player_x)\n\t\t\tenemy_x[k]--;\n\t\telse if (enemy_x[k]&player_x)\n\t\t\tenemy_x[k]++;\n\t\tif (enemy_y[k]&player_y)\n\t\t\tenemy_y[k]--;\n\t\telse if (enemy_y[k]&player_y)\n\t\t\tenemy_y[k]++;\n\t}\n}\n/*初始化数据*/void startup()\n{\n\tprintf(\"请输入地图宽,长\\n\");\n\tscanf(\"%d%d\", &bottom, &right);\n\tprintf(\"请输入敌人个数\\n\");\n\tscanf(\"%d\", &enemy_number);\n\tprintf(\"请输入敌人速度(1最大,4最小)\\n\");\n\tscanf(\"%d\", &enemy_speed);\n\tif (enemy_speed&4)\n\t\tenemy_speed = 4;\n\tstart_time();\n\tfor (i = i& i++)\n\t{\n\t\tfor (j = j& j++)\n\t\t{\n\t\t\tif (i == 0 || i == bottom - 1)\n\t\t\t\ta[i][j] = 3;//打印上下边框
3控制\n\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (j == 0 || j == right - 1)\n\t\t\t\t\ta[i][j] = 4;//打印左右边框
4控制\n\t\t\t}\n\t\t}\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t{\n\t\tenemy_x[k] = rand() % (bottom - 1) + 1;\n\t\tenemy_y[k] = rand() % (right - 1) + 1;//随机敌人初始位置坐标\n\n\t}\n\tplayer_x = rand() % (bottom - 1) + 1;\n\tplayer_y = rand() % (right - 1) + 1;//随机初始位置坐标\n\tHideCursor();\n\tsystem(\"cls\");\n}\n/*与控制有关的更新*/void updatewithinput()\n{\n\tif (kbhit())\n\t{\n\t\tif ((GetAsyncKeyState(0x41) & 0x8000) ? 1 : 0)//a\n\t\t\tplayer_y -= 2;\n\t\telse\tif ((GetAsyncKeyState(0x44) & 0x8000) ? 1 : 0)//d\n\t\t\tplayer_y += 2;\n\t\tif ((GetAsyncKeyState(0x57) & 0x8000) ? 1 : 0)//w\n\t\t\tplayer_x -= 2;\n\t\telse if ((GetAsyncKeyState(0x53) & 0x8000) ? 1 : 0)//s\n\t\t\tplayer_x += 2;\n\t}\n\tFlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));\n\tif (player_y &= left + 1)\n\t\tplayer_y = left + 1;\n\telse if (player_y &= right - 2)\n\t\tplayer_y = right - 2;\n\tif (player_x &= top)\n\t\tplayer_x = top + 1;\n\telse if (player_x &= bottom - 2)\n\t\tplayer_x = bottom - 2;\n\n\tfflush(stdin);\n}\n/*打印游戏内容*/void show()\n{\n\tgotoxy(0, 0);\n\tfor (i = 0; i& i++)\n\t{\n\t\tfor (j = 0; j& j++)\n\t\t{\n\t\t\tif (a[i][j] == 0)\n\t\t\t\tprintf(\" \");\n\t\t\telse if (a[i][j] == 1)\n\t\t\t\tprintf(\"@\");\n\t\t\telse if (a[i][j] == 2)\n\t\t\t\tprintf(\"#\");\n\t\t\telse if (a[i][j] == 3)\n\t\t\t\tprintf(\"-\");\n\t\t\telse if (a[i][j] == 4)\n\t\t\t\tprintf(\"|\");\n\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n\tnow_time();\n\tprintf(\"\\n\");\n\tprintf(\"%.3f s\\n\", (endTime - startTime) / 1000.0);\n}\n/*与控制无关的更新*/void updatewithoutinput()\n{\n\tfor (i = top + 1; i&bottom - 1; i++)\n\t{\n\t\tfor (j = left + 1; j&right - 1; j++)\n\t\t{\n\t\t\ta[i][j] = 0;\n\t\t}\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t{\n\t\tif (enemy_y[k] &= left + 1)\n\t\t\tenemy_y[k] = left + 1;\n\t\tif (enemy_y[k] &= right - 2)\n\t\t\tenemy_y[k] = right - 2;\n\t\tif (enemy_x[k] &= top)\n\t\t\tenemy_x[k] = top + 1;\n\t\tif (enemy_x[k] &= bottom - 2)\n\t\t\tenemy_x[k] = bottom - 2;\n\t}\n\tfor (k = 0; k&enemy_ k++)\n\t\ta[enemy_x[k]][enemy_y[k]] = 2;//确定敌人位置 用2控制\n\n\ta[player_x][player_y] = 1;//确定玩家位置 用1控制\n\tif (((enemy_time_2 - enemy_time_1) % enemy_speed) == 0)\n\t\tchase();\n\tjudge();\n\tnever_coincide();\n}\nint main()\n{\n\tstartup();\n\twhile (con)\n\t{\n\t\tshow();\n\t\tupdatewithoutinput();\n\t\tupdatewithinput();\n\t}\n}\nvoid gotoxy(int x, int y)//类似于清屏函数\n{\n\tHANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\tCOORD\n\tpos.X =\n\tpos.Y =\n\tSetConsoleCursorPosition(handle, pos);\n}\nvoid HideCursor()//清除光标的函数\n{\n\tCONSOLE_CURSOR_INFO cursor_info = { 1, 0 };\n\tSetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//隐藏输入符号\n}\n======================================================================对于游戏的优化还有很多可以做的部分,比如可以在不同时间范围内自动改变敌人速度,改变敌人的追逐方式实现包围玩家,大家可以自行改进游戏。过几天我也会给出我的小组的课设游戏教程,我只是一名大一的学生,代码水平有限,深知自己的不足,希望能得到大家友善的评价,谢谢。课设游戏的Into_Limbo的代码量:演示视频gif可以直接打开,虽然百度云里面的视频没有经过压制有点大,但还是希望能被别人看看的,毕竟是蛮长时间才做出来的。这个游戏只是对Playdead工作室的Limbo的拙劣模仿,还加入了武器等攻击的系统,破坏了原作的精髓,只是我们小组的练习作业,希望不会有素材的版权问题。","updated":"T11:47:06.000Z","canComment":false,"commentPermission":"anyone","commentCount":51,"likeCount":235,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T19:47:06+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-1bbc035c3a0fde6929d43ef_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":51,"likesCount":235},"":{"title":"做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码","author":"tongjingHHU","content":"经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了\n。利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果\n。EasyX安装包下载链接:官网还提供了一套非常好的入门教程,大家可以自学:对应的目录:–––––––––––––––––学习完后,大家可以试着将前面教程中学习的生命游戏、反弹球、flappy bird、空战游戏用EasyX重新实现,达到类似这样的效果:大家可以在网上搜索诸如“flappy bird游戏素材”,下载对应的图片和音乐素材。也可以直接在原始游戏中截图,ps出需要的素材。下面是用EasyX实现的flappy bird需要的图片:素材代码可由百度云盘下载:,首先大家可以运行flappy bird\\easyx bird\\Debug\\happyhappy.exe 文件看看游戏效果。以下为游戏代码,大家可以参考:/*\n画面大小350*600\n鸟的大小100*70\n柱子宽处宽度140,窄处宽度100,宽处厚度30,颜色\n*/\n#include&graphics.h&\n#include&stdio.h&\n#include&stdlib.h&\n#include&conio.h&\n#include &time.h&\n// 引用 Windows Multimedia API\n#pragma comment(lib,\"Winmm.lib\")\nvoid print();\nvoid begin();\nvoid printstone();//人家才不是作柱子的呢\nvoid bird();//控制鸟的下降和上升\nvoid judgement();//判断语句\nvoid scoleprint();\nvoid endorretry();\nint bird_x=150,bird_y=300,i=0,k=0;//鸟的左上角坐标\nint scole=0,t=0;\nint stone_x1,stone_y1;//上截柱子左下坐标\nint stone_x2,stone_y2;//上截柱子左下坐标\nIMAGE backgrand,bird1[4],bird2[4],scole1[10],scole2[10],stone_up1,stone_up2,stone_down1,stone_down2\n,stone_up3,stone_up4,stone_down3,stone_down4;//图片储存变量\n\nMOUSEMSG\t\t// 定义鼠标消息\nint main()\n{\n\tif(t==0)\n\t{\n\t\tbegin();\n\t\tt++;\n\t}\n\t\n\tif(t)\n\t\tprint();\n\tgetch();//制造停顿\n\tbird_y=300;bird_x=150;i=0;k=0;scole=0;\n\t\n\twhile(1)\n\t{\n\t\tbird();\n\t\tprint();\n\t\tjudgement();\n\t}\n\tclosegraph();\n\treturn 0;\n}\nvoid print()\n{\n\tputimage(0, 0, &backgrand);//背景图像\n\tprintstone();//画柱子\n\tputimage(bird_x, bird_y,&bird1[i%3],NOTSRCERASE);\n\tputimage(bird_x, bird_y,&bird2[i%3],SRCINVERT);\n\tif(k%5==0)\n\t\ti++;\n\tk++;\n\tscoleprint();\n\tFlushBatchDraw();\t\t// 绘制\t\n}\nvoid printstone()//柱子移动规律/哭\n{\n
Sleep(30);\n\tif(stone_x1&210)//此时画面存在两根柱子\n\t{\n\t\t\n\t\tputimage(stone_x1, stone_y1, &stone_up2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1, &stone_up1,SRCINVERT);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down1,SRCINVERT);\n\t\tputimage(stone_x2, stone_y2, &stone_up4,NOTSRCERASE);\n\t\tputimage(stone_x2, stone_y2, &stone_up3,SRCINVERT);\n\t\tputimage(stone_x2, stone_y2+750, &stone_down4,NOTSRCERASE);\n\t\tputimage(stone_x2, stone_y2+750, &stone_down3,SRCINVERT);\n\t\tstone_x1--;stone_x2--;\n\t}\n\telse if(stone_x1==210)//左柱子消失,将stone_x2,stone_y2值归位\n\t{\n\t\tstone_x2=stone_x1;\n\t\tstone_y2=stone_y1;\n\t\tputimage(stone_x1, stone_y1, &stone_up2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1, &stone_up1,SRCINVERT);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down1,SRCINVERT);\n\t\tstone_x1--;\n\t\tstone_x2--;\n\t}\n\telse if(stone_x1&210&&stone_x1&0)//画面只存在一根柱子的情况\n\t{\n\t\tputimage(stone_x1, stone_y1, &stone_up2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1, &stone_up1,SRCINVERT);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down1,SRCINVERT);\n\t\tstone_x1--;\n\t\tstone_x2--;\t \n\t}\n\tif(stone_x1==0)//柱子左端到站,生成新柱子\n\t{\t
\n\t\tstone_y1=rand()%310-555;\n\t\tstone_x1=350;\n\t\tputimage(stone_x1, stone_y1, &stone_up2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1, &stone_up1,SRCINVERT);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down2,NOTSRCERASE);\n\t\tputimage(stone_x1, stone_y1+750, &stone_down1,SRCINVERT);\n\t\tstone_x1--;\n\t\tstone_x2--;\n\t}\n}\n\nvoid begin()\n{\n\tmciSendString(\"open \\\"..\\\\..\\\\sounds\\\\background.mp3\\\" alias music \", NULL, 0, NULL);//背景音乐\n\tmciSendString(\"play music\", NULL, 0, NULL);\n\tinitgraph(350,600);\n\t// 获取窗口句柄\n\tHWND hwnd = GetHWnd();\n\t// 设置窗口标题文字\n\tSetWindowText(hwnd, \"江超群制作\");\n\tIMAGE\n\tloadimage(&beforegame,\"..\\\\..\\\\素材库\\\\beforegame.jpg\");\n\tputimage(0,0,&beforegame);\n\tSleep(1000);\n\tgetch();\n\tBeginBatchDraw();// 开启批量绘图模式\n\tloadimage(&backgrand, \"..\\\\..\\\\素材库\\\\backgroundfd.jpg\");//载入背景图片\n\t//鸟\n\tloadimage(&bird2[0], \"..\\\\..\\\\素材库\\\\bird1-2.gif\");\n\tloadimage(&bird1[0], \"..\\\\..\\\\素材库\\\\bird1-1.gif\");\n\tloadimage(&bird2[1], \"..\\\\..\\\\素材库\\\\bird2-2.gif\");\n\tloadimage(&bird1[1], \"..\\\\..\\\\素材库\\\\bird2-1.gif\");\n\tloadimage(&bird2[2], \"..\\\\..\\\\素材库\\\\bird3-2.gif\");\n\tloadimage(&bird1[2], \"..\\\\..\\\\素材库\\\\bird3-1.gif\");\n\tloadimage(&bird2[3], \"..\\\\..\\\\素材库\\\\bird4-2.gif\");\n\tloadimage(&bird1[3], \"..\\\\..\\\\素材库\\\\bird4-1.gif\");\n\t//柱子\n\tloadimage(&stone_up1,\"..\\\\..\\\\素材库\\\\stone_up1.gif\");\n\tloadimage(&stone_up2,\"..\\\\..\\\\素材库\\\\stone_up2.gif\");\n\tloadimage(&stone_down1,\"..\\\\..\\\\素材库\\\\stone_down1.gif\");\n\tloadimage(&stone_down2,\"..\\\\..\\\\素材库\\\\stone_down2.gif\");\n\tloadimage(&stone_up3,\"..\\\\..\\\\素材库\\\\stone_up1.gif\");\n\tloadimage(&stone_up4,\"..\\\\..\\\\素材库\\\\stone_up2.gif\");\n\tloadimage(&stone_down3,\"..\\\\..\\\\素材库\\\\stone_down1.gif\");\n\tloadimage(&stone_down4,\"..\\\\..\\\\素材库\\\\stone_down2.gif\");\n\t//数字\n\tloadimage(&scole1[0],\"..\\\\..\\\\素材库\\\\0_1.jpg\");\n\tloadimage(&scole2[0],\"..\\\\..\\\\素材库\\\\0_2.jpg\");\n\tloadimage(&scole1[1],\"..\\\\..\\\\素材库\\\\1_1.jpg\");\n\tloadimage(&scole2[1],\"..\\\\..\\\\素材库\\\\1_2.jpg\");\n\tloadimage(&scole1[2],\"..\\\\..\\\\素材库\\\\2_1.jpg\");\n\tloadimage(&scole2[2],\"..\\\\..\\\\素材库\\\\2_2.jpg\");\n\tloadimage(&scole1[3],\"..\\\\..\\\\素材库\\\\3_1.jpg\");\n\tloadimage(&scole2[3],\"..\\\\..\\\\素材库\\\\3_2.jpg\");\n\tloadimage(&scole1[4],\"..\\\\..\\\\素材库\\\\4_1.jpg\");\n\tloadimage(&scole2[4],\"..\\\\..\\\\素材库\\\\4_2.jpg\");\n\tloadimage(&scole1[5],\"..\\\\..\\\\素材库\\\\5_1.jpg\");\n\tloadimage(&scole2[5],\"..\\\\..\\\\素材库\\\\5_2.jpg\");\n\tloadimage(&scole1[6],\"..\\\\..\\\\素材库\\\\6_1.jpg\");\n\tloadimage(&scole2[6],\"..\\\\..\\\\素材库\\\\6_2.jpg\");\n\tloadimage(&scole1[7],\"..\\\\..\\\\素材库\\\\7_1.jpg\");\n\tloadimage(&scole2[7],\"..\\\\..\\\\素材库\\\\7_2.jpg\");\n\tloadimage(&scole1[8],\"..\\\\..\\\\素材库\\\\8_1.jpg\");\n\tloadimage(&scole2[8],\"..\\\\..\\\\素材库\\\\8_2.jpg\");\n\tloadimage(&scole1[9],\"..\\\\..\\\\素材库\\\\9_1.jpg\");\n\tloadimage(&scole2[9],\"..\\\\..\\\\素材库\\\\9_2.jpg\");\n\tsrand(time(0));//初始化种子\n\tprint();\n\t//第一根柱子,初始化\n\tstone_y1=rand()%310-555;\n\tstone_x1=350;\n\tstone_x2=stone_y2=-9999;\n}\nvoid bird()\n{\n\\n\t\n\tif(kbhit())//读取空格\n\t{\n\t\tspace=getch();\n\t\tif(space==' ')\n\t\t{\n\t\t\tbird_y-=80;\t\n\t\t}\n\t\telse if(space==27)\n\t\t\tgetch();\t\t\n\t}\n\telse\n\t{\n\t\tbird_y+=3;\n\t}\n\twhile(MouseHit())\n\t{\n\t\t// 获取一条鼠标消息\n\t\tm = GetMouseMsg();\n\t\tswitch(m.uMsg)\n\t\t{\n\t\tcase WM_LBUTTONDOWN:\n\t\t\tbird_y-=80;\n\t\t\\n\t\tcase WM_RBUTTONDOWN:\n\t\t\tgetch();\n\t\t\\n\t\t}\n\t}\n\t\n}\nvoid judgement()\n{\n\tif((stone_x1&10 && stone_x1&20)||(stone_x1&174&&stone_x1&184))\n\t{\n\t\tif((bird_y&(stone_y1+576)&&bird_y&(stone_y1+600))||((bird_y&(stone_y1+726))&&bird_y&(stone_y1+750)))\n\t\t\tendorretry();//结束游戏\n\t}\n\telse if(stone_x1&=20 && stone_x1&=174)\n\t{\n\t\tif(!(bird_y&(stone_y1+600)&&bird_y&(stone_y1+726)))\n\t\t\tendorretry();\t//结束游戏\n\t}\n\tif(bird_y&576)\n\t\tendorretry();//结束游戏\n\tif(stone_x1==150)\n\t\tscole++;\n}\nvoid endorretry()\n{\n\tif(bird_y&550 && stone_x1&160)\n\t{\t\n\t\twhile(bird_y&550)\n\t\t{\n\t\t\tputimage(0, 0, &backgrand);//背景图像\n\t\t\tputimage(stone_x1, stone_y1, &stone_up2,NOTSRCERASE);\n\t\t\tputimage(stone_x1, stone_y1, &stone_up1,SRCINVERT);\n\t\t\tputimage(stone_x1, stone_y1+750, &stone_down2,NOTSRCERASE);\n\t\t\tputimage(stone_x1, stone_y1+750, &stone_down1,SRCINVERT);\n\t\t\tputimage(stone_x2, stone_y2, &stone_up4,NOTSRCERASE);\n\t\t\tputimage(stone_x2, stone_y2, &stone_up3,SRCINVERT);\n\t\t\tputimage(stone_x2, stone_y2+750, &stone_down4,NOTSRCERASE);\n\t\t\tputimage(stone_x2, stone_y2+750, &stone_down3,SRCINVERT);\n\t\t\tputimage(bird_x, bird_y,&bird1[3],NOTSRCERASE);\n\t\t\tputimage(bird_x, bird_y,&bird2[3],SRCINVERT);\n\t\t\tFlushBatchDraw();\n\t\t\tbird_y++;\n\t\t}\n\t}\n\tIMAGE gameover1,gameover2,\n\tloadimage(&gameover1, \"..\\\\..\\\\素材库\\\\gameover1.gif\");\n\tloadimage(&gameover2, \"..\\\\..\\\\素材库\\\\gameover2.gif\");\n\tputimage(80, 200, &gameover1,NOTSRCERASE);\n\tputimage(80, 200, &gameover2,SRCINVERT);\n\tFlushBatchDraw();\n\tSleep(1000);\n\tloadimage(&atlast, \"..\\\\..\\\\素材库\\\\atlast.jpg\");\n\tputimage(0,0,&atlast);\n\tscoleprint();\n\tFlushBatchDraw();\n\tgetch();\t\n\t//第一根柱子\n\tstone_y1=rand()%310-555;\n\tstone_x1=350;\n\tstone_x2=stone_y2=-9999;\n\tbird_y=300;\n\tscole=0;\n\tmain();\t\n\t\n}\n\nvoid scoleprint()\n{\n\tIMAGE *fen1[6],*fen2[6];\n\tint he,weishu=1,i=0,sdsf=\n\tif(sdsf==0)\n\t{\n\t\tputimage(250,50,&scole1[0],NOTSRCERASE);\n\t\tputimage(250,50,&scole2[0],SRCINVERT);\n\t\t\n\t}\n\twhile(sdsf&0)\n\t{\n\t\the=sdsf%10;\n\t\tfen1[i]=&scole1[he];\n\t\tfen2[i]=&scole2[he]; \n\t\tputimage(300-50*weishu,50,fen1[i],NOTSRCERASE);\n\t\tputimage(300-50*weishu,50,fen2[i],SRCINVERT);\n\t\tsdsf/=10;\n\t\ti++;\n\t\tweishu++;\n\t}\n\t\n}\n做出flappy bird,也可以按照我们之前教程的思路,step by step地实现,遇到问题再参考上面的代码。自己从无到有实现一遍,就能学会类似游戏的开发了。大概步骤可以为:1. 背景图片的显示2. 加入小鸟图片3. 小鸟自由下落,按键后上升4. 加入静态的障碍物5. 障碍物向左移动6. 判断小鸟和障碍物的碰撞7. 障碍物移动出左边界后,在右边重新出现8. 加入记分模块9. 加入音效效果10. 加入开始界面、结束界面11. 继续完善细节、整理代码flappy bird相对比较简单,大家可以先从这个案例开始学习。学会理解别人的代码,也是一个非常重要的能力,大家可以通过这种逐步重现的方法来学习。后面我们再一起学习更复杂的EasyX游戏代码,EasyX官网上也有很多游戏案例可以借鉴参考:下一个教程:英雄联盟连连看 ","updated":"T00:42:48.000Z","canComment":false,"commentPermission":"anyone","commentCount":26,"likeCount":216,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T08:42:48+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-196f5efb913d430c63eb_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":26,"likesCount":216},"":{"title":"做游戏,学编程(C语言) 8 英雄联盟连连看","author":"tongjingHHU","content":"这次教程,学习15级同学大一时编写的C语言游戏开发大作业:英雄联盟连连看。最终代码2250行,gif动图效果如下(在电脑上点击图片观看):使用了很多商业游戏的图片音乐素材,仅用于编程教学,侵删。为了便于大家的学习,提供了多个版本的代码,大家可以分步尝试实现、对照学习。由于代码较长,这里只列出了主要开发步骤的介绍。各个版本的代码、图片音乐素材、可执行文件可从百度云盘下载: 。安装完EasyX后,可以运行 \\英雄联盟连连看\\EXE_final\\连连看.exe,玩上几局看看。最终代码要正确编译运行,需要修改相应的文件目录字符串。1
纯C语言编算法2
鼠标,图片3
显示选中边框4
实现多个关卡5
加入连线和初始界面6
加入音乐等功能这个游戏有点复杂,上面每一个步骤都需要分成很多个小步骤实现。大家可以按照上面的提示,先自己尝试实现,有困难再对照我们提供的参考代码。参考代码有很多不规范的地方,大家可以按照自己的理解和习惯,写出更好的版本;也可以参考之前教程中的游戏框架,对目前版本的代码进行改进。编程能力的提高,就像打怪练级一样,大家啃下这个一两千行代码的游戏,编程水平就会提升到相应的层次。另外不要太心急,首先学习完前面的教程,打好基础再做这个连连看。初学者花上两三个星期时间实现这个游戏,是很正常的。","updated":"T00:03:01.000Z","canComment":false,"commentPermission":"anyone","commentCount":16,"likeCount":147,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T08:03:01+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-bf1db9c0fc1a028920ceed6f181b4776_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":16,"likesCount":147},"":{"title":"做游戏,学编程(C语言) 9 贪吃蛇","author":"tongjingHHU","content":"这个案例给出了14级同学大一时实现的贪吃蛇小游戏,分步骤代码、游戏素材可以从百度云盘下载:首先可以打开Exe_final目录下的Exe_final.dsw工程文件,编译运行,以下为对应的游戏动图效果:主要实现内容包括:贪吃蛇移动 、道具判定、加速减速、生命条处理、分数处理、暂停处理、键盘或鼠标操控。代码中Loop函数主要控制贪吃蛇的移动及每一帧的必须要完成的指令,其中小蛇的移动和转弯是贪吃蛇游戏实现的难点。假设小蛇初始状态为:上图左侧是对应游戏数据的二维数组存储状态,右侧为小蛇显示效果,蛇头为1,蛇身依次加1。要让小蛇移动,首先遍历二维数组所有元素,元素为正 则加1:对全局变量dir进行判断,比如dir==1 表示方向向右,则在元素2的右方设置为1,并且把最大元素归零:以上就实现了小蛇向右的移动,向其他方向的移动实现类似。双人游戏比较简单,在二维数组中实现即可:Loop函数中除了贪吃蛇的移动,还实现了:减速包的随机出现、加速包的随机出现、血包的随机出现、障碍物的随机出现、苹果的随机出现、小爬虫的移动、无敌,加速,减速的判定。Game函数是核心判定单元。根据贪吃蛇的移动方向dir的1 2 3 4, 分别对蛇头的右左上下方的元素进行判定:
是-1则吃了苹果,蛇身增长 并加分;
是-2则撞墙了,归零g1 游戏结束;
是-3则吃了葡萄, 蛇身增长 如果(wudi==0)也就是 并非无敌状态
是-4则吃了爱心, g2增加
wudi赋值为wuditime\n,使贪吃蛇进入无敌状态 。
吃果子后贪吃蛇的增长,和贪吃蛇的移动差不多,唯一的区别是增长不需要把最大元素归零。Show函数:Start函数:
各个参数的初始化、二维数组a的元素初始化、对图片树的输出、分数显示、生命值显示的初始化、生命条的显示、倒计时画面Interact函数:有两种操作模式 但本质一样都是对方向dir的修改第一种 键盘 :根据wasd 把dir修改为1(d右)2(a左)3(w上)4(s下)、按p键暂停第二种 鼠标\n:在Loop函数中会计算出蛇头元素的下标it,jt、根据鼠标点击的横坐标m.x 纵坐标m.y修改dirhello函数\n:显示封面及游戏操作 道具使用说明bye函数\n:显示封底及最终分数fs函数(记分记血系统):对贪吃蛇生命状态的判定和死亡提示ryj函数\n:获取包括鼠标左键在内的任意键同学实现的代码不是很规范,大家可以先自己尝试实现,再参考网盘上的分步骤代码。","updated":"T06:17:54.000Z","canComment":false,"commentPermission":"anyone","commentCount":18,"likeCount":201,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T14:17:54+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-190df910da7a76ee579025_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":18,"likesCount":201},"":{"title":"做游戏,学编程(C语言) 10 僵尸危机","author":"tongjingHHU","content":"这个案例,分享14级同学大一时实现的打僵尸小游戏,电脑点击下图可以看到动图效果:这个案例的代码不复杂,但是结合了游戏角色的动画效果、射击声音特效,实现后还是挺酷的。对应的游戏素材、分步骤代码,可从百度网盘下载:网盘上5个分步骤代码的主要内容如下,大家可以自己先尝试实现,有问题再参考对应的分步骤代码。Code1:游戏框架主要内容:
\n游戏背景图片与僵尸图片的初始化、背景音乐的插入、僵尸的单向移动。主要技术方法:1、图片插入用IMAGE先定义,后loadimage载入图片,Resize设置图片的大小,最后用putimage插入图片;2、背景音乐用mciSendString函数导入,然后要用“open\"来开始播放。要注意的是音乐文件要放在.CPP文件同一目录下,否则不能运行。3、该步骤的僵尸只是单纯的单向移动,用的是for循环语句
\nCode2:角色的移动主要内容:
\n角色的上下左右移动与输出子弹的按键,僵尸的随机出现与僵尸的单向移动,闪屏问题的解决。主要技术方法:1、角色的移动使用的是switch,case选择语句来实现2、僵尸设定为6只随机出现在左边和右边,设定了3种不同的速度,随机函数用的是rand3、每一帧用的是背景图片覆盖4、闪屏问题运用到三个函数:BeginBatchDraw();FlushBatchDraw();EndBatchDraw();分别放在插入图片前,插入图片后且背景覆盖前与结束程序前。Code3:子弹输出主要内容:
\n子弹的输出与移动。主要技术方法:
\n用数组定义子弹坐标,定义子弹方向,用for语句来实现\nCode4:相撞判定主要内容:
\n修复子弹打不出的问题,加入了开始时的背景与游戏的logo,加入了子弹与僵尸、角色与僵尸的相撞判定函数主要技术方法:
\n碰撞判定函数主要是计算两张图片的距离的绝对值Code5:bug修复主要内容:
\n修复了子弹可能打不到僵尸的bug,加入了音效,胜负判定,结束画面主要技术方法:
\n将Game函数内判定两图片距离的公式改为计算两图片中点距离,而不是之前的右上角坐标距离,增加了判定的精确性\n补充:百度云盘上的工程代码,需要先调整图片音乐素材所在的文件目录。这块代码写死了,大家可以进一步改进。","updated":"T00:57:18.000Z","canComment":false,"commentPermission":"anyone","commentCount":20,"likeCount":162,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T08:57:18+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-fada6f7d3d1_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":20,"likesCount":162},"":{"title":"做游戏,学编程(C语言) 11 2048","author":"tongjingHHU","content":"这个案例,介绍14级同学大一时写的2048游戏,分步骤代码可从百度云盘下载:大家可先运行2048\\Exe_final\\Debug\\Exe_final.exe,也可点击下面图片,看看游戏效果:游戏简介:2048是比较流行的一款数字游戏。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli。\n?这是20岁的Gabriele\nCirulli开发的一款数字游戏。初衷就是觉得好玩,将开源版本放到Github后意外走红。这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。每次可以选择上下左右其中一个方向去滑动,每滑动一次,\n所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。以下是分步骤代码的主要实现内容:Code_1Code_2Code_3Code_4Code_5Exe_Final大家可以参考以上实现思路,先自己尝试开发,遇到问题再参考相应步骤的代码。","updated":"T02:51:33.000Z","canComment":false,"commentPermission":"anyone","commentCount":23,"likeCount":187,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T10:51:33+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-7fd89ea9c_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":23,"likesCount":187},"":{"title":"做游戏,学编程(C语言) 12 炸弹人","author":"tongjingHHU","content":"这个案例,介绍15级同学大一时写的炸弹人游戏,分步骤代码可从百度云盘下载:主要效果可点击下图观看:整个游戏的开发主要包括8个步骤:1.做出画布,并输出石头2.玩家的移动3.用二维数组输出砖块和添加开始界面4.玩家放炸弹5.做出一个可以自由移动的敌人6.多个可以自由移动的敌人7.玩家的死亡并添加音乐8.敌人的死亡以下为更详细的分步骤实现思路:网盘上的代码还很不完善,大家主要参考下实现思路,利用提供的游戏素材,相信读者可以自己开发出更好的版本。","updated":"T08:46:47.000Z","canComment":false,"commentPermission":"anyone","commentCount":30,"likeCount":309,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:46:47+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-06639ac7aec1dcde887212b_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":30,"likesCount":309},"":{"title":"做游戏,学编程(C语言) 13 消灭星星","author":"tongjingHHU","content":"消灭星星游戏的规则非常简单:1、一次消除同色的方块越多,剩余方块越少,得分越高2、相同颜色连在一起的方块,鼠标双击其中的一个方块就可以消除如下为14级同学大一时实现的游戏效果,也可以直接运行云盘Debug目录下的exe程序。对应的分步骤代码可从百度云盘下载:以下为对应各步骤的主要实现思路:","updated":"T08:02:46.000Z","canComment":false,"commentPermission":"anyone","commentCount":27,"likeCount":254,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:02:46+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-7cd0e832b9a8ec_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":27,"likesCount":254},"":{"title":"做游戏,学编程(C语言) 14 口袋妖怪","author":"tongjingHHU","content":"应同学的要求,分享16级同学实现的口袋妖怪游戏demo。实现了经典游戏口袋妖怪的简化版,包括简单的剧情和对战系统,可以存档、自由刷怪升级。以下为大概的实现过程:1. 实现人物在地图上的自由移动。通过input变量改变地图的截取位置实现地图的移动;2 加入了战斗函数和界面切换函数,这时只作为一个单独的函数,并没有衔接起来;3 定义了初始的精灵结构体和属性,在头文件里增加了技能函数,通过结构体将一个精灵的所有属性联系起来;4 给地图设置障碍判断以及精灵相遇判断,通过给数组赋值来判断是否为障碍,当人物的坐标与精灵坐标小于一定距离时进入战斗函数;5 给精灵设定时间属性,一定时间后才能再次相遇;6 完善了战斗画面,能根据精灵编号显示出不同的图片和释放不同技能;7 整合全部函数,加入剧情,使函数良好衔接。首先整合所有函数,然后再向地图对应位置加入进入剧情函数的判断;8 加入存档读档功能;9 加入操作界面和音乐函数。实现效果:分步骤代码下载地址:","updated":"T01:39:57.000Z","canComment":false,"commentPermission":"anyone","commentCount":36,"likeCount":294,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T09:39:57+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-de663b0de_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":36,"likesCount":294},"":{"title":"做游戏,学编程(C语言) 15 太鼓达人","author":"tongjingHHU","content":"这次分享16级同学实现的一个音乐游戏---太鼓达人。分步骤代码、可执行程序、录屏效果可以从百度网盘下载:
。游戏效果可以点击下面的gif图片查看:首界面上点任意键进入选择界面,在选择界面下:play -& 进入游玩、write -& 自制谱面、options -& 键位说明、exit -& 退出游戏,在游玩界面下点Q键返回选择界面。以下为大概的实现步骤:1. 实现两个开始界面鼠标移动到相应图标变红,弹出字符串相关:2. 实现游戏主界面,中间的洞是不停的运动3. 利用粒子,实现击中节拍时的爆炸特效。具体实现时绘制了很多小球,有位置、速度等属性,会受鼠标的击打力影响而运动。4. 实现鼓面外圈特效其中外圈波形的实现:5. 实现了节拍文件的写入与读取6. 最终效果","updated":"T05:45:03.000Z","canComment":false,"commentPermission":"anyone","commentCount":20,"likeCount":147,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T13:45:03+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-ef99cfd1d5dcea6f57785b09_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":20,"likesCount":147},"":{"title":"做游戏,学编程(C语言) 16 神奇小妖怪","author":"tongjingHHU","content":"分享15级同学大一上学期实现的神奇小妖怪。分步骤代码、可执行程序、录屏效果可以从百度网盘下载: 。游戏主要通过方向键控制移动,空格键吃东西、吃石头吐石头,石头击晕怪物后可以吃掉怪物,回车键闪现。以下为大概的实现步骤:1. 整理所有的图片素材,定义并加载。2. 实现Start()和Show()函数:初始化怪物以及玩家的位置并且定义二维数组;利用不同数值表示不同显示物品,完成游戏初始显示。3. 改进Update()函数。\n\n游戏框架:设置一个大循环保证游戏一直运行,通过kbhit判断用户输入以控制人物移动,同时怪物自己移动。降低怪物移动速度的方法:设置全局变量speed,循环一次speed加一,当speed达到4时怪物进行一次移动。4. int\nInteract_GetCommand()函数:判断用户键盘输入信息。主函数中利用if语句根据用户输入,当输入上下左右时改变怪物显示位置(即if(c==1/2/3/4))5. 当用户摁下空格键(即if(c==5)),如果此时用户没有吃砖块,先判断用户的方向,根据方向判断用户面对的物品并吃进,进行相应的数据改变;如果此时用户已经吃进砖块,吐出砖块直到碰到障碍物。6. MONSTERMOVE()函数:分别判断四个怪物移动方向,利用变量step使得怪物能够多方向移动,利用for循环控制怪物移动的显示。7. Judge(int\nx,int y)函数:砖块运动过程中用于判断是否撞到怪物,利用switch case语句判断怪物被撞时的方向,使得怪物被撞后在原方向上后退一格呈现眩晕状态。\n\n\n\ndeath(int\nf)函数:怪物在运动时调用本函数,怪物碰到用户后用户生命减一,生命为零游戏结束。8. kaishijiemian()函数、victory()函数、lose()函数:显示开始、胜利、失败界面。","updated":"T23:57:11.000Z","canComment":false,"commentPermission":"anyone","commentCount":16,"likeCount":122,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T07:57:11+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-64df1b826edf109c009a6_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":16,"likesCount":122},"":{"title":"做游戏,学编程(C语言) 18 瑞克快跑","author":"tongjingHHU","content":"分享16级同学大一上学期实现的瑞克快跑,它是一款跑酷游戏,目标是躲避障碍物、取得高分。分步骤代码、可执行程序、录屏效果可以从百度网盘下载: 。代码的主题功能描述:void startMenu(); //开始游戏时的界面void rules(); //游戏规则界面void showScore(); //显示得分情况void startup(); //数据初始化void delay(); //延迟函数void restartup(); //人物死亡后,游戏数据初始化void runImg(); //加载跑动图片void jumpImg(); //加载跳跃图片void slideImg(); //加载滑动图片void barrierImg(); //加载障碍物图片void trapDeathImg(); //加载遇到地刺死亡后图片void plantDeathImg(); //加载遇到藤蔓后死亡图片void run(); //跑动void jump(); //跳跃void slide(); //滑动void isBarrier(); //障碍物void trapDeath(); //碰到地刺后死亡void plantDeath(); //碰到藤蔓后死亡void showdeathbk(); //死亡后显示游戏界面void die(); //死亡函数void show(); //显示函数void updateWithoutInput(); //与用户无关的输入void updateWithInput(); //与用户有关的输入void gameover(); //游戏结束以下为主要实现步骤:","updated":"T08:18:37.000Z","canComment":false,"commentPermission":"anyone","commentCount":25,"likeCount":135,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:18:37+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-a7e355c6dd1e7fb683c2c_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":25,"likesCount":135},"":{"title":"做游戏,学编程(C语言) 17 猪小弟","author":"tongjingHHU","content":"应同学的要求,分享16级同学大一上实现的猪小弟游戏demo。猪小弟(pooyan)讲的是一只狼劫走了一只粉色小猪,猪妈妈去救粉色小猪的故事。游戏的玩法是玩家通过ws键控制猪妈妈的上下移动,按j箭发射箭,箭只有射中狼头顶的气球,才会使狼掉到地面死亡。猪妈妈的头顶会随机刷出肉棒,肉棒可以砸死很多只狼,狼也会发射子弹攻击猪妈妈。只有杀死一定数量的狼才可以过关。猪小弟程序主要分为开场动画、第一关、第二关共三部分。开场动画:第一关:第二关:实现代码、图片音乐素材、视频介绍资料参看:,以下以第一关的制作为例。主体功能描述:struct level1_pooyan
// 射手--猪妈W向上移动、S向下移动、J发射骨箭或子弹struct level1_arrow
// 普通箭1、一次只能射两支箭2、一支箭在扎破气球后刷新cd3、箭射中狼,无效,下坠4、下坠的箭可以继续发生作用,射中下面的气球struct level1_bone
// 肉骨棒1、一段固定时间后在固定位置生成2、通过拾取获得,拾取后,切换武器3、可以消灭击中的所有狼,击中气球无效4、被击中的狼下坠,气球继续上升5、上升的气球可以继续被击破struct level1_rope
// 绳子struct level1_wolf
// 敌人--狼1、随机狼的下落位置2、三种状态:(1)存活(2)被击中的挣扎动画(3)快速下坠3、漏掉一只狼,游戏失败struct level1_ball
// 狼的气球三种状态:(1)随狼下落(2)狼被肉骨棒击中后上升(3)被击中后破碎struct level1_bullet
// 狼的子弹1、随机发射子弹的狼2、随机狼发射子弹的位置3、子弹射中猪妈后,游戏失败4、猪妈可以通过用吊篮的顶部和底部挡掉子弹void\nstartup_1()
// 初始化void\nshow_1()
// 画面显示void\nupdate_without_input_1() // 与输入无关的更新void\nupdate_with_input_1()
// 与输入有关的更新void\ngameover()
游戏结束前的后处理void main()
// 主函数主要实现步骤:1.
\n开始运用做黑框游戏canvas写法、制作了开场动画,但是跳转到第一关的界面后,程序无法正常显示图片;2.
\n换写法,实现猪妈的上下移动;3.
\n实现一次只能射两只箭;4.
\n实现狼的随机下落和结构体写法;5.
\n实现建设中气球,狼快速下坠;6.
\n实现狼发射子弹,猪妈中弹死亡;7.
\n实现一些细节动画,狼出场向右奔跑,狼落地后继续向右奔跑,狼被击中挣扎,狼下坠时头向下挣扎,气球的破碎效果;8.
\n实现肉骨棒的版块;9.
\n添加分数判断,添加背景音乐,添加发箭的音效,添加发射肉骨棒时的音效;10.
\n第一关基本完成。","updated":"T09:26:36.000Z","canComment":false,"commentPermission":"anyone","commentCount":17,"likeCount":88,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T17:26:36+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-48a39c8a00d7032049aafc_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":17,"likesCount":88},"":{"title":"做游戏,学编程(C语言) 19 Rings","author":"tongjingHHU","content":"分享16级同学大一上学期实现的Rings,它是一款消除游戏。游戏通过颜色的相同消除来展开,3个一排、一竖、或者斜着的都可以消除,三个圆环都放在点上后系统会随机出现三个新的圆环。圆环可以堆叠,消除的圆圈有大中小之分,每一种都可以作为一种颜色消除,同一种颜色的大中小圈放一起,也会直接消除。分步骤代码、可执行程序、录屏效果可以从百度网盘下载:/s/1jIzcknk以下为主要实现步骤:","updated":"T06:14:18.000Z","canComment":false,"commentPermission":"anyone","commentCount":26,"likeCount":182,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T14:14:18+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-ee0b0cbdcc68f9_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":26,"likesCount":182},"":{"title":"做游戏,学编程(C语言) 20 扫雷","author":"tongjingHHU","content":"应
同学的要求,分享16级同学大一上学期实现的扫雷游戏。分步骤代码、可执行程序、录屏效果可以从百度网盘下载:/s/1gf6AHKv开局画面:胜利画面:失败画面:主要功能描述:1.全局变量:时间基点,地图,图片资源,关键状态;2.绘图初始化函数drawinit:载入图片资源;3.设置器函数Setup:放置地雷;4.主要显示函数Show:依照层次结构显示雷区;5.队列处理函数duires:(核心算法)对无雷的输入进行扩展搜索,调用位置搜索函数辅助,调用响应函数输出;6.位置搜索函数poi_sum:队列处理函数的辅助函数,将输入点的坐标周围八个格子的雷数返回给他;7.响应函数do_null,not_null:随时处理队列处理函数的结果;8.主控函数Control:接受鼠标的输入,处理简单的逻辑,复杂的交由队列处理函数执行;9.计时器函数Time:计算累计时间,并显示;10.胜利判定Judge:判断是否用户胜利;11.主函数main:控制中心。主要实现步骤:1.明确游戏流程:包括重要的游戏规则和逻辑,如被旗帜标记的方块无法被点击等。2.搭建游戏框架:采用老师的框架和重要模块分开编写,并定期整合的方式进行。a.图片显示:一开始采用网上(贴吧)的资源,后来大部分利用办公软件制作。b.核心算法:尝试了链表和结构体数组,都出错(溢出),多次调试后发现是由于标志原因,无法区别已经处理和未处理的模块;再次调试发现效率极低,检查后发现是一个位置的变量名使用了上一级循环的变量名。c.程序调度。3.添加额外模块:将一些不太重要的功能写成函数,加入调度。a.计时器:利用了钟表程序的一部分代码,做了很多修改。b.加亮显示:提醒用户鼠标指向的位置。c.开局提示及重新开始。4.代码优化。","updated":"T02:53:53.000Z","canComment":false,"commentPermission":"anyone","commentCount":11,"likeCount":107,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T10:53:53+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-c01ac3d621f9_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":11,"likesCount":107},"":{"title":"做游戏,学编程(C语言)教材《C语言课程设计与游戏开发实践教程》出版了","author":"tongjingHHU","content":"经过半年多的写作、修改、校样、印制,我们的实践教材《C语言课程设计与游戏开发实践教程》终于出版了。这本书可以看成是“做游戏,学编程(C语言)专栏”的详细版本,以下为书中部分案例的运行效果,本书所有案例均提供源代码下载。图书前言:C语言是一门重要的基础课程,应用广泛,也是不少后续课程的基础。然而,由于C语言语法规则较多,在实际编程时又相对灵活,很多初学者接触这门课程会觉得有难度,普遍有畏惧心理。目前配套教材一般偏向于语法规则的介绍,实例偏数学算法,过于抽象、趣味性不强,学生不愿写程序,进而觉得入门困难。针对这些问题,本书把游戏开发实践应用于C语言课程设计教学,培养学生对编程的兴趣。为了达到这一目的,本书应用C语言的语法知识带领同学从无到有地开发游戏,通过游戏案例逐步将已学的语法知识用起来,在实际编程中加深体会。在设计的过程中尽量站在初学者的角度,降低编写游戏的难度,不超出所学知识范围,逐步提高读者对编程的兴趣和能力。美国著名教育家杜威曾经说过:“大多数的人,只知道对五官接触的、能够实用的东西才有趣味,书本上的趣味是没有的”。同样对于C语言这门课程,让学生看到用C语言可以编出很好玩的程序,学生感到有趣、有成就感,就会自己花时间钻研,师生积极互动,教学效果也因此得到改进。各章节主要内容如下:第1章,学习printf、scanf、if-else、while、for语句后,进行弹跳小球、飞机游戏的开发,并介绍程序调试的方法与技巧。第2章,学习函数后,利用函数封装及标准的游戏框架,进行飞机游戏、反弹球消方块、flappy bird的开发。第3章,学习数组后,利用数组改进数据结构,实现生命游戏、反弹球消砖块、空战游戏、贪吃蛇的开发,并介绍SVN代码管理工具。第4章,学习简单绘图工具,并进行多球反弹、实时钟表、反弹球消方块、鼠标交互的学习开发。第5章,学习图片音乐素材的导入和使用,并进行flappy bird、飞机大战、行走小人、双人反弹球的开发学习。第6章,利用后续语法知识进一步改进游戏程序,如指针创建动态数组、字符串控制得分显示、结构体改进数据结构、文件用于游戏存档等。实现了黑客帝国字符雨动画、互动粒子仿真、具有多界面和存档功能的飞机大战游戏。第7章,利用游戏化学习的思路,学习C语言的两个知识难点:递归与链表。第8章,介绍多个游戏开发实践案例:挖地小子、台球、太鼓达人、扫雷、蓝色药水、Rings、猪小弟、俄罗斯方块、通天魔塔、1010、炸弹人、口袋妖怪、大鱼吃小鱼。每个案例讲解了主体功能、实现思路。图书的详细目录:本书的使用方法:本书通过一个一个的游戏案例进行讲解,并按照C语言的学习进度,逐步使用更多的语法知识,难度逐渐加深。在每章内容开始前,会介绍学习该章所需的语法知识,大家在掌握对应语法后可以进入相应游戏案例的开发。每个案例会分成很多步骤,从零开始step by step地来实现,书中列出了每个步骤的实现目标、实现思路、相应的参考代码。读者可以先在前一个步骤代码的基础上,尝试实现下一个步骤,碰到困难再参考书中给出的例子代码。在每个案例讲解后列出了一些思考题,读者可以尝试进一步改进。本书不讲解C语言的基础语法知识,读者可以通过相应入门教材、在线慕课进行学习,并配合Online Judge进行练习。书中游戏案例开发使用操作系统为Windows,缺省开发环境为Visual C++ 6,也可以使用高版本的Microsoft Visual Studio进行开发。-----------------------图书的其他信息可以参考清华大学出版社上的介绍:样章“第3章 应用数组的游戏开发”可在线阅读与下载:
图书附带的源代码可从百度网盘下载: 希望这本图书能对C语言初学者有所帮助,也欢迎大家多提宝贵意见,谢谢!","updated":"T07:59:40.000Z","canComment":false,"commentPermission":"anyone","commentCount":97,"likeCount":408,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","titleImage":"/v2-4ab41a6fc1e_r.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"C(编程语言)"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","sourceUrl":"","pageCommentsCount":97,"snapshotUrl":"","publishedTime":"T15:59:40+08:00","url":"/p/","summary":"","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentsCount":97,"likesCount":408},"":{"title":"做游戏,学编程(C语言) 交流群 ","author":"tongjingHHU","content":"应同学们的要求建了一个qq群:做游戏学编程
,感兴趣的同学可以加入交流。后面我会邀请开发专栏游戏例子的同学加入,和大家进一步交流,谢谢!","updated":"T23:52:32.000Z","canComment":false,"commentPermission":"anyone","commentCount":7,"likeCount":53,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T07:52:32+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-9a94cdd6e6b_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":7,"likesCount":53},"":{"title":"做游戏,学编程(C语言) 21 台球","author":"tongjingHHU","content":"分享16级同学大一上学期实现的台球游戏,选择了花式九球并简化规则,侧重台球碰撞、进洞的实现与模拟,加入了双人游戏机制。分步骤代码、可执行程序、录屏效果可以从百度网盘下载:主体功能描述:程序运行首先显示开始页面,点击Message显示游戏说明,点击Play进入游戏。杆随着鼠标而围着母球旋转,点击鼠标杆停止不动确定出杆方向,此时力度条开始滑动,点击空格母球发出、杆消失。待所有球停下杆重新出现,由之前的黄色变成蓝色,即由玩家一转换到玩家二。相应玩家打球进洞会有得分,如果母球进洞减10分。按ESC键进入暂停界面,按1继续之前的游戏,按2显示结束页面。如果所有球都进洞显示结束页面。startup()函数将全局变量进行初始化,该函数只运行一次。show()函数负责显示,clean()函数负责将前一帧画面擦掉,两者交替进行可实现物体移动效果。updatewithinput()接受用户输入,比如点击鼠标、按空格键。updatewithoutinput()函数中无需输入各个变量自行更新,如小球无需控制会滑行。boom()函数在updatewithoutinput()中调用,实现了球之间的碰撞。为了简化处理,每一时刻只处理距离最近的一对球的碰撞,循环运行会产生多球同时碰撞的效果。startMenu()、pauseMenu()和gameOver()函数显示不同的画面,gameStatus变量的值确定程序显示哪个界面。球的碰撞是实现难点。球与壁之间是镜面反射,球与球之间存在对心碰撞与非对心碰撞两种情况。碰撞后速度的变化需尽可能真实,否则将影响可玩性。具体实现时每次找到距离最小的一对小球进行碰撞,多次循环以模拟多对球同时发生碰撞的效果。对于非对心碰撞引入向量的概念,速度在垂直于球心连线的方向不变,而在球心连线方向重新分配。引入一个变量,初始值为零,每一杆进洞该变量加一。根据其是奇数还是偶数,设为不同的玩家操作。主要实现步骤:1. 搭建基本框架2. 实现杆绕球旋转、杆的方向控制球的方向3. 实现多球碰撞、球壁碰撞4. 加入阻尼力模拟物理世界5. 初始化球的位置6. 导入图片7. 加入力度条8. 加入规则与得分机制9. 加入图片、制定游戏结束机制","updated":"T06:09:06.000Z","canComment":false,"commentPermission":"anyone","commentCount":5,"likeCount":71,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T14:09:06+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-b8f24e3a9f163ed12f3dd0_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":5,"likesCount":71},"":{"title":"做游戏,学编程(C语言) 22 贪吃蛇(printf输出版本)","author":"tongjingHHU","content":"这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储、如何实现转弯的效果、吃到食物后如何增加长度。更多内容可参看《C语言课程设计与游戏开发实践教程》\\第3章\\ 3.4 贪吃蛇。1 构造小蛇首先,在画面中显示一条静止的小蛇。二维数组canvas[High][Width]的对应元素,值为0输出空格,-1输出边框#,1输出蛇头@,大于1的正数输出蛇身*。startup()函数中初始化蛇头在画布中间位置(canvas[High/2][Width/2] = 1;),蛇头向左依次生成4个蛇身(for (i=1;i&=4;i++) canvas[High/2][Width/2-i] = i+1;),元素值分别为2、3、4、5。#include &stdio.h&\n#include &stdlib.h&\n#include &conio.h&\n#include &windows.h&\n\n#define High 20
// 游戏画面尺寸\n#define Width 30\n\n// 全局变量\nint canvas[High][Width] = {0}; // 二维数组存储游戏画布中对应的元素\n// 0为空格,-1为边框#,1为蛇头@,大于1的正数为蛇身*\n\nvoid gotoxy(int x,int y)
//光标移动到(x,y)位置\n{\n
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n
SetConsoleCursorPosition(handle,pos);\n}\n\nvoid startup() // 数据初始化\n{\n\tint i,j;\n\t\n\t// 初始化边框\n\tfor (i=0;i&Hi++)\n\t{\n\t\tcanvas[i][0] = -1;\n\t\tcanvas[i][Width-1] = -1;\n\t}\n\tfor (j=0;j&Wj++)\n\t{\n\t\tcanvas[0][j] = -1;\n\t\tcanvas[High-1][j] = -1;\n\t}\n\t\n\t// 初始化蛇头位置\n\tcanvas[High/2][Width/2] = 1;\n\t// 初始化蛇身,画布中元素值分别为2,3,4,5....\n\tfor (i=1;i&=4;i++)\n\t\tcanvas[High/2][Width/2-i] = i+1;\n}\n\nvoid show()
// 显示画面\n{\n\tgotoxy(0,0);
// 光标移动到原点位置,以下重画清屏\n\tint i,j;\n\tfor (i=0;i&Hi++)\n\t{\n\t\tfor (j=0;j&Wj++)\n\t\t{\n\t\t\tif (canvas[i][j]==0)\n\t\t\t\tprintf(\" \");
输出空格\n\t\t\telse if (canvas[i][j]==-1)\n\t\t\t\tprintf(\"#\");
输出边框#\n\t\t\telse if (canvas[i][j]==1)\n\t\t\t\tprintf(\"@\");
输出蛇头@\n\t\t\telse if (canvas[i][j]&1)\n\t\t\t\tprintf(\"*\");
输出蛇身*\n\t\t}\n\t\tprintf(\"\\n\");\n\t}\n}\t\n\nvoid updateWithoutInput()
// 与用户输入无关的更新\n{\n}\n\nvoid updateWithInput()
// 与用户输入有关的更新\n{\n}\n\nint main()\n{\n\tstartup();
// 数据初始化\t\n\twhile (1) //
游戏循环执行\n\t{\n\t\tshow();
// 显示画面\n\t\tupdateWithoutInput();
// 与用户输入无关的更新\n\t\tupdateWithInput();
// 与用户输入有关的更新\n\t}\n\treturn 0;\n}2 小蛇自动移动实现小蛇的移动是贪吃蛇游戏的难点,下图列出了小蛇分别向右、向上运动后,对应二维数组元素值的变化,从中我们可以得出实现思路。假设小蛇元素为54321,其中1为蛇头、5432为蛇身、最大值5为蛇尾。首先将所有大于0的元素加1,得到65432;将最大值6变为0,即去除了原来的蛇尾;再根据对应的移动方向,将2对应方向的元素由0变成1;如此即实现了小蛇的移动。小蛇向上移动的对应流程如图所示。定义变量int moveDirection表示小蛇的移动方向,值1、2、3、4分别表示小蛇向上、下、左、右方向移动,小蛇移动实现在moveSnakeByDirection()函数中。#include &stdio.h&\n#include &stdlib.h&\n#include &conio.h&\n#include &windows.h&\n\n#define High 20
// 游戏画面尺寸\n#define Width 30\n\n// 全局变量\nint moveD // 小蛇移动方向,上下左右分别用1,2,3,4表示\nint canvas[High][Width] = {0}; // 二维数组存储游戏画布中对应的元素\n\t\t\t// 0为空格0,-1为边框#,1为蛇头@,大于1的正数为蛇身*\n\nvoid gotoxy(int x,int y)
//光标移动到(x,y)位置\n{\n
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n
SetConsoleCursorPosition(handle,pos);\n}\n\n// 移动小蛇\n// 第一步扫描数组canvas所有元素,找到正数元素都+1\

我要回帖

更多关于 编程小游戏 的文章

 

随机推荐