您的位置:广东在线游戏网 > 游戏解答 > 我想编一个小游戏,比如说俄罗斯方块,贪吃蛇,天天酷跑单机版,...-超高分!说几个你喜欢的经典好玩的小游戏 例如 俄罗斯

我想编一个小游戏,比如说俄罗斯方块,贪吃蛇,天天酷跑单机版,...-超高分!说几个你喜欢的经典好玩的小游戏 例如 俄罗斯

作者:广东在线游戏网日期:

返回目录:游戏解答


单纯学C你是写不出图形程序的,你可以看到,C标准库支持的是dos程序,就是那个黑不溜秋的东西。

如果想知道你离小游戏还多远,咱们可以这么算一下,下面给出几个假设e69da5e887aae799bee5baa6e997aee7ad94362条件:

  1. 提供给你图形绘制函数,你只需要传相应的参数,就能画出图形,点,线,圆,颜色填充之类。

  2. 给出线程函数,让你可以创建系统线程,或者使用定时器等控制贪吃蛇身体的移动。具体的方式可以变,你需要一个按照固定时间间隔来移动蛇身的函数。

那你觉着,你该怎样写一个贪吃蛇?

思路是:

  1. 使用链表等结构,存储蛇的身体,好处就是,可以任意长度。你要想好链表中存储什么属性可以更好地描述蛇的状态,它超哪个方向走,它的身体各个节点处于哪个位置。

  2. 划分屏幕坐标系,将贪吃蛇映射为坐标系中的点。

  3. 写出碰撞检测函数,贪吃蛇碰到了一个食物,就在链表头部添加一个节点并将头结点更新为这个结点。

  4. 使用碰撞检测函数检测贪吃蛇是否撞到了自己。

  5. 检测蛇是否撞到了屏幕边界。

  6. 使用线程或定时器沿着一个方向移动你的贪吃蛇,移动规律是朝着当前链表头部冲的方向匀速移动,你可以设定0.5s对表头的x/y坐标进行加,减。时间间隔影响了蛇的速度,如果允许长度超过一个程度升级加速,你就要设置下这里的参数。

  7. 根据表头的移动,设计算法计算蛇的身体各个点的移动轨迹。这个是关键,这个算法想错了,你的蛇就会乱跑。一个比较直接的做法是,将蛇身体的每个节点依次前移,不是坐标的移动,是填充,让后面节点填充它前面节点移动前的位置。

大致是这样,我只是给出个思路,如果我有写错的地方,欢迎指正,又或者是你可以按照你的思路来进行,学习,思路是很重要的,代码是死的,人是活的。


分析问题,你要将实际的问题抽象出编程用的模型。抽象的过程就是,先假设你已经有了你想要的函数,你可以先给出函数的声明,比如碰撞检测函数,线程函数等等。这些函数你不会写,先空着,想象它们已经完成了。

然后你要做的就是,用这些已经被假设存在的构造快,来实现你的逻辑。这个逻辑是什么,就要看你怎么抽象一个具体的问题。就像贪吃蛇,通用的思路是把它抽象为坐标和链表结构。如果你用了另外一种思路,整个过程可能截然不同。

整个过程写完了,你需要知道,那些被你假设了的函数,到底怎么实现。

给个思路:

界面显示用MFC来做,线程,定时器什么的,有相应的windowsAPI,这些图形和线程功能,都需要操作系统做支持,所以你要用到一些windows的API。这些资料都是有的,你可以去找。


以上。再次声明,如有疏漏,请见谅。



策略单机小游戏!比如攻城之类的、你可以参考一下4399小游戏里的英雄大作战

我给你2个贪吃蛇c++代码

(1):

#include <stdio.h>

#include <windows.h>

#include <time.h>

#include <conio.h>

#include <stdlib.h>

//方向键的ASCLL值:上72,左75,右77,下80

//背景颜色的代码: 0=黑色  1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色 

//**改变当前光标方块的背景颜色和字体颜色**//

void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台的句柄

SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色

}

//**改变光标的位置**//

void gotoxy(int x, int y) {8

HANDLE handle;

COORD coord;   //获取坐标轴结构体

coord.X = x;

coord.Y = y;

handle = GetStdHandle(STD_OUTPUT_HANDLE);  //获取控制台句柄,值为-11

SetConsoleCursorPosition(handle, coord);   //移动光标到x,y处

}

//**初始化地图数据**//

void restart(int bk[20][20], int look[4], int move[20][20]) {

//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇

//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数

//move记录蛇走过的路程,用来打印蛇时判断用

int pp, qq;  //用来记录获取的随机坐标

//接下来要初始化整个地图//

for(int i=0;i<=16;i++)

for (int j = 0; j <= 16; j++) {

if (i == 0 || i == 16 || j == 0 || j == 16)  bk[i][j] = 1;//1表示墙体

else bk[i][j] = 0; //0表示什么都没有

move[i][j] = 0;    //该数组用来记录蛇移动的轨迹

}

//将蛇初始化在8,8坐标上

bk[8][8] = 3;

move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1

move[0][0] = 1;//用此来记录步数

pp = rand() % 15 + 1;//范围是1-15

qq = rand() % 15 + 1;

bk[pp][qq] = 2;//表示这个位置有果实了

look[0] = 1;//表示朝向,向上

look[1] = 1;//表示长度

look[2] = 0;//当为1是表示失败

look[3] = 0;//记录得分

//接下来要绘制地图//

for(int i=0;i<=16;i++)

for (int j = 0; j <= 16; j++) {

gotoxy(i * 2, j);//光标移动,每个光标都是矩形

switch (bk[i][j]) {

case 0:

BackGround(0, 0);

break;//如果没有东西打印黑色

case 1:

BackGround(0, 1);

break;//墙打印蓝色

case 2:

BackGround(0, 2);

break;//果实打印绿色

case 3:

BackGround(0, 3);

break;//蛇打印湖蓝色

default:

break;

}

printf("  ");//地图中直接就是涂空格符

}

//接下来要显示积分//

gotoxy(35, 0);

BackGround(7, 0);//用白字黑底打印

printf("现在得分是:%d,请再接再7a686964616fe4b893e5b19e337厉!^_^", look[2]);

}

//**运动主体**//

void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {

//bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹

int b[10], qq=0, pp=0;//b用来吸收输入,qq和pp用来随机初始化果实坐标

if (kbhit()) {//记录按下的是哪个方向键

b[0] = getch();//用b来记录

if (b[0] == 224)  b[0] = getch();//如果为224表示为方向键,但是要再一次获取才行

if (b[0] == 72 && look[0] != 2)

//如果输入的为上并且朝向不为下

look[0] = 1;

if (b[0] == 80 && look[0] != 1)

look[0] = 2;

if (b[0] == 75 && look[0] != 4)

look[0] = 3;

if (b[0] == 77 && look[0] != 3)

look[0] = 4;

}

switch (look[0]) {

case 1:

//往上走

xy[1]--;

break;

case 2:

//往下走

xy[1]++;

break;

case 3:

//往左走

xy[0]--;

break;

case 4:

//往右走

xy[0]++;

break;

}

//接下来蛇就开始走动了//

move[0][0]++;//蛇的步数加一

move[xy[0]][xy[1]] = move[0][0];//记录当前格子中蛇的轨迹

gotoxy(35, 2);

BackGround(7, 0);

printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);

gotoxy(xy[0] * 2, xy[1]);//这里蛇头就往前移动了

BackGround(0, 3);//与蛇体一个颜色

printf("  ");

//如果吃了果实//

if (bk[xy[0]][xy[1]] == 2) {

look[2]++;//分数加一

look[1]++;//长度加一

//更新分数

gotoxy(35, 0);

BackGround(7, 0);

printf("现在得分是:%d,请再接再厉!^_^", look[2]);

while (bk[pp][qq] != 0) {

pp = rand() % 15 + 1;

qq = rand() % 15 + 1;

}

bk[pp][qq] = 2;//将这个地方变为果实

gotoxy(pp * 2, qq);

BackGround(0, 2);

printf("  ");

}

//如果撞了墙或者自己//

if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {

look[3] = 1;//表示已经输了

gotoxy(6, 6);

BackGround(7, 0);

printf("你输了,最后得分:%d", look[2]);

}

bk[xy[0]][xy[1]] = 3;//使这个位置变成蛇

//接下来要检测蛇然后刷新蛇的位置//

for(int i=0;i<=16;i++)

for (int j = 0; j <= 16; j++) {

if (move[i][j] == move[xy[0]][xy[1]] - look[1]){

//如果符合这个条件,则表示蛇已经移动出这个位置了

//要删除这个位置的蛇尾巴

//一次只有一个方块会符合要求吧?

bk[i][j] = 0;

gotoxy(i * 2, j);

BackGround(0, 0);

printf("  ");

break;//一次只找一个

}

}

end:;

}

int main() {

int bk[20][20], xy[2], move[20][20], look[4];

xy[1] = xy[0] = 8;

srand((unsigned) time(NULL));//初始化随机种子

system("pause");

restart(bk, look, move);

while (look[3] == 0) {

Sleep(200);//休眠400ms一次

map(bk, look, xy, move);

}

system("pause");

printf("游戏结束,谢谢游玩!^_^");

return 0;

}

(2):

#include <stdio.h>

#include <windows.h>

#include<conio.h>

#include <stdlib.h>

#include<time.h>

#define X 23//地图的x轴

#define Y 75//地图的y轴

#define UP 0

#define DOWN 1

#define LEFT 2

#define RIGHT 3

#define WAIT_TIME 200//等待蛇刷新的时间,可以说是速度  修改可变速

int map_0[X][Y];//地图

int Snake[X*Y][2]; // 蛇

int Slength; //蛇的长度

int direction; 

int score=0;

bool pdEatFood=false;

void csh();

void huaMap();

void huaSnake();

void gotoxy(int x,int y);

void move();

void intokey();

int check(int x,int y);

void putfood();

bool gameover();

void dy_fs();

int main()

{

csh();

huaMap();

putfood();

while(1)

{

huaSnake();               

Sleep(WAIT_TIME);  

intokey();

move();

dy_fs();

if(gameover())

{

system("cls");          //清除屏幕内容

printf("Game Over\n");  

system("pause");

getchar();

break;

}

if(map_0[Snake[0][0]][Snake[0][1]]==-1)

{

map_0[Snake[0][0]][Snake[0][1]]=0;

pdEatFood=true;

putfood();

score+=10;

}

}

return 0;

}

void csh()//初始化 

{

srand((unsigned)time(NULL)); //设置种子为现在的时间

Slength=4;

gotoxy(0,0);

CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //清除光标 

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

int x,y;

Snake[0][0]=X/2;

Snake[0][1]=Y/2;

for(x=0;x<X;x++){

map_0[x][0]=1;

map_0[x][Y-1]=1;

}

for(y=1;y<Y-1;y++){

map_0[0][y]=1;

map_0[X-1][y]=1;

for(x=1;x<4;x++){ //初始化蛇的坐标 

Snake[x][0]=Snake[0][0]+x;

Snake[x][1]=Snake[0][1];

}

direction=UP;

}

void huaMap()//画地图 

{

int x,y;

for(x=0;x<X*1.01;x++){

for(y=0;y<Y*1.01;y++){

if(map_0[x][y]==1){

printf("#");

}

if(map_0[x][y]==0){

printf(" ");

}

}

printf("\n");

}

}

void huaSnake()//画蛇 

{

int x;

for(x=0;x<Slength;x++)

{

gotoxy(Snake[x][0],Snake[x][1]);

printf("@");

}

}

void gotoxy(int i,int j)//移动光标 

{

COORD position={j,i};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);

}

void move()

{

int i;

gotoxy(Snake[Slength-1][0],Snake[Slength-1][1]);//擦除尾巴

printf(" ");                            

for(i=Slength-1;i>0;i--)    //从尾巴开始,每一个点的位置等于它前面一个点的位置

{

Snake[i][0]=Snake[i-1][0];

Snake[i][1]=Snake[i-1][1];

}

switch(direction)

{

case UP:

Snake[0][0]--;

break;

case DOWN:

Snake[0][0]++;

break;

case LEFT:

Snake[0][1]--;

break;

case RIGHT:

Snake[0][1]++;

break;

}

if(pdEatFood){

Slength++;

pdEatFood=false;

}

}

void intokey()

{

if(kbhit()!=0)          //kbhit()函数 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0

{

char in;

while(!kbhit()==0)  //如果玩家输入了多个按键,以最后一个按键为准

in=getch();

switch(in)

{

case 'w':

case 'W':

if(direction!=DOWN)         //防止缩头

direction=UP;

break;

case 's':

case 'S':

if(direction!=UP)

direction=DOWN;

break;

case 'a':

case 'A':

if(direction!=RIGHT)

direction=LEFT;

break;

case 'd':

case 'D':

if(direction!=LEFT)

direction=RIGHT;

break;

case 'p':

case 'P':

gotoxy(X,0);        

system("pause");

gotoxy(X,0);

printf("                   ");  // 消去下面的按任意键继续

break;

}

}

}

int check(int ii,int jj){// 检查是否能投放食物

if(map_0[ii][jj]==1) 

return 0;

if(ii==0 || jj==0 || ii==X-1 || jj==Y-1)

return 0;

int i;

for(i=0;i<Slength;i++){

if(ii==Snake[i][0] && jj==Snake[i][1])

return 0;

}

return 1;

}

void putfood()

{

int i,j;

do{

i=rand()%X;

j=rand()%Y;

}while(check(i,j)==0);

map_0[i][j]=-1;

gotoxy(i,j);

printf("$");

}

bool gameover()

{

bool isgameover=false;

int sX,sY;

sX=Snake[0][0],sY=Snake[0][1];

if(sX==0 || sX==X-1 || sY==0 || sY==Y-1)

isgameover=true;

int i;

for(i=1;i<Slength;i++){

if(sX==Snake[i][0] && sY==Snake[i][1])

isgameover=true;

}

return isgameover;

}

void dy_fs()

{

gotoxy(X,0);

printf("(c)Geek------2018.1.22");

gotoxy(X+1,0);

printf("最终得分: %d",score);

}

管庆帆c/c++大师😄


摩尔庄园、斗地主、奥比岛、大家来找茬、麻将、QQ飞车、推箱子、五子棋、泡泡龙、跑的快、零用钱大作战、拱猪、够级、对对碰、阿Sue整理厨 ·绿叶妹夹豆 ·疯狂农zd场 ·萱萱美容院 ·经营派对招待客 ·照顾斑点狗 ·贝贝家的大扫除 ·探宝奇兵之迷窑 ·经营快乐鲜花店 ·疯狂农场之披萨 ·黄金矿工之索马 ·经营开心汉堡店 ·经营花艺小店 ·快乐宠物店 ·无敌球球 ·狗狗养成大作战 ·帅哥争夺大作战 ·晴天出游 ·牛奶宝宝 ·养小猫 ·宠物料理店 ·神迹圣女 ·冰心公主 ·霜冻天使 ·乔伊的世界 ·鲜花七日养成 ·经营美容化妆品 ·情人巧克力 ·甜甜圈饼干店 ·经营小农场2 ·小猪打狐狸 ·MM汉堡店2 ·完美发型屋 ·加油站 ·许愿藤 ·更多的..

相关阅读

关键词不能为空

标签导航

恶魔城暗影之王2百度云盘下载地址,要全部DLC的,求! 求一个xbox360恶魔城暗影之王2含启示录DLC的中文go... 恶魔城暗影之王2DLC启示录在哪里进入游戏 恶魔城暗影之王2启示录进不去 LOL和DOTA2属于什么类型的游戏. LOL,DOTA算什么类型游戏? dota2和lol是同一类型的游戏吗 知乎 同样是MOBA游戏,英雄联盟和DOTA2有哪些共同点和不同点... 天龙八部单机版 秘籍?? 《天龙八部》单机版所有详细攻略有哪些? 天龙八部单机版秘籍? 只要秘籍 详细! 求天龙八部单机版秘籍 csol2国服没有躲猫猫模式吗 想玩下 该怎么操作 为毛css与csgo与csol2都有躲猫猫模式,但唯独cso... csol2和csgo都有躲猫猫模式,哪个更好玩 有没有跟csol2躲猫猫模式差不多的手机游戏 我想编一个小游戏,比如说俄罗斯方块,贪吃蛇,天天酷跑单机版,... 哪一位能帮帮忙写几个小游戏的代码,比如贪吃蛇,俄罗斯方块 有哪些让你至今都年年不忘的经典单机小游戏? 学C语言已经半年多了却对俄罗斯方块,贪吃蛇之类的小游戏的编... 上古卷轴5有什么奇葩好玩的职业 上古卷轴:传奇好玩吗 上古卷轴五随从用什么装备 天龙八部 40级到80级怎么升级快(带着点技能的经验) 天龙八部50-80级升级全攻略 天龙八部3卡等级及升级技巧,40到80的,包括哪里升级快,求... 新天龙八部70-80升级攻略!!!!!!!!! 《美妙世界》最新txt全集下载 《《(综漫)美妙世界》酱油酱油酱》txt全集下载 量心决电子书txt全集下载 魔兽世界厄运之槌钥匙在哪里得 进厄运之槌需要钥匙么 wow厄运之槌在哪 WOW厄运之槌图书馆怎么进去,我去买月布长袍的图样 Adobe_After_Effects_CS6序列号急用,谢... Adobe Fireworks CS6有效的序列号 求adobe after effects cs6的序列号 谁有 AE CS6?或者AE CC 但是要有序号的,就是可以... 天龙八部单机版所有详细 攻略 天龙八部单机版全攻略 天龙八部单机版 完美全攻略 wwe美国职业摔角人员名单 wwe美国职业摔角手人名 WWE美国职业摔角手人物名字 wwe美国职业摔角 里面的选手都叫什么名字 好久没看忘记完了 魔兽世界中60的双手武器厄运之刃在哪里爆? wow厄运之刃怎么来的 wow暮光之刃在哪里获得 昨晚我玩魔兽出来了一个武器,叫厄运之刃,这个武器到底暴率多少... dota2还收费吗? steam上得Dota2要钱吗 DOTA2要钱吗 求问dota2要钱不 是不是只有正版的才能玩 天龙八部3龙纹怎么获得