想自己做一个手机游戏试试,流程是什么,都需要学些什么?

JavaScript024

想自己做一个手机游戏试试,流程是什么,都需要学些什么?,第1张

你好 做手机游戏 我分开说好了

首先做手机应用(手机游戏其实也是应用的一种) 首选 肯定是 安卓 或者 ios 二选一

安卓 肯定就是java了 (我比较了解 干这个的) 后一种我就不熟了

那么 这个方向的技能 需要 javaLogic 也就是java的基本逻辑 然后是 web应用 也就是服务器技术 jsp 、servlet 前端的话 页面 要学习 js jquery html也就是div+css

再从游戏来说 游戏那么多精美的图片 想要绚丽的效果 肯定少不了的 那么就是 flash 图片处理之类的技术了

如果你只是想练手 做个小游戏 例如 贪食蛇 俄罗斯方块 扫雷 坦克大战之类的 那么入手的方向是

先搞懂游戏的算法 简单来说 如何判断蛇吃到了食物 如何让蛇前进后退 俄罗斯方块 : 如何这一层满了就消除 如何变幻方块模型 扫雷: 如何查找周围有几颗雷 这些都是游戏的算法 搞懂了这些逻辑算法 就好做了

希望能帮到你 谢谢

"扫雷"小游戏C代码

#include<stdio.h>

#include<math.h>

#include<time.h>

#include<stdlib.h>

main( )

{char a[102][102],b[102][102],c[102][102],w

int i,j /*循环变量*/

int x,y,z[999] /*雷的位置*/

int t,s /*标记*/

int m,n,lei /*计数*/

int u,v /*输入*/

int hang,lie,ge,mo /*自定义变量*/

srand((int)time(NULL)) /*启动随机数发生器*/

leb1:  /*选择模式*/

printf("\n   请选择模式:\n   1.标准  2.自定义\n")

scanf("%d",&mo)

if(mo==2)  /*若选择自定义模式,要输入三个参数*/

{do

{t=0printf("请输入\n行数 列数 雷的个数\n")

scanf("%d%d%d",&hang,&lie,&ge)

if(hang<2){printf("行数太少\n")t=1}

if(hang>100){printf("行数太多\n")t=1}

if(lie<2){printf("列数太少\n")t=1}

if(lie>100){printf("列数太多\n")t=1}

if(ge<1){printf("至少要有一个雷\n")t=1}

if(ge>=(hang*lie)){printf("雷太多了\n")t=1}

}while(t==1)

}

else{hang=10,lie=10,ge=10}  /*否则就是选择了标准模式(默认参数)*/

for(i=1i<=gei=i+1)  /*确定雷的位置*/

{do

{t=0z[i]=rand( )%(hang*lie)

for(j=1j<ij=j+1){if(z[i]==z[j]) t=1}

}while(t==1)

}

for(i=0i<=hang+1i=i+1)  /*初始化a,b,c*/

{for(j=0j<=lie+1j=j+1) {a[i][j]='1'b[i][j]='1'c[i][j]='0'} }

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1) {a[i][j]='+'} }

for(i=1i<=gei=i+1)  /*把雷放入c*/

{x=z[i]/lie+1y=z[i]%lie+1c[x][y]='#'}

for(i=1i<=hangi=i+1)  /*计算b中数字*/

{for(j=1j<=liej=j+1)

{m=48

if(c[i-1][j-1]=='#')m=m+1if(c[i][j-1]=='#')m=m+1

if(c[i-1][j]=='#')m=m+1 if(c[i+1][j+1]=='#')m=m+1

if(c[i][j+1]=='#')m=m+1 if(c[i+1][j]=='#')m=m+1

if(c[i+1][j-1]=='#')m=m+1if(c[i-1][j+1]=='#')m=m+1

b[i][j]=m

}

}

for(i=1i<=gei=i+1)  /*把雷放入b中*/

{x=z[i]/lie+1y=z[i]%lie+1b[x][y]='#'}

lei=ge /*以下是游戏设计*/

do

{leb2:  /*输出*/

system("cls")printf("\n\n\n\n")

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf("   |")

else printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)

printf("\n   |")

for(j=1j<=liej=j+1){printf("---|")}

printf("\n")

}

scanf("%d%c%d",&u,&w,&v) /*输入*/

u=u+1,v=v+1

if(w!='#'&&a[u][v]=='@')

goto leb2

if(w=='#')

{if(a[u][v]=='+'){a[u][v]='@'lei=lei-1}

else if(a[u][v]=='@'){a[u][v]='?'lei=lei+1}

else if(a[u][v]=='?'){a[u][v]='+'}

goto leb2

}

a[u][v]=b[u][v]

leb3:  /*打开0区*/

t=0

if(a[u][v]=='0')

{for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1   if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=1j<=liej=j+1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1 if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=hangi>=1i=i-1)

{for(j=liej>=1j=j-1)

{s=0

if(a[i-1][j-1]=='0')s=1if(a[i-1][j+1]=='0')s=1

if(a[i-1][j]=='0')s=1 if(a[i+1][j-1]=='0')s=1

if(a[i+1][j+1]=='0')s=1if(a[i+1][j]=='0')s=1

if(a[i][j-1]=='0')s=1  if(a[i][j+1]=='0')s=1

if(s==1)a[i][j]=b[i][j]

}

}

for(i=1i<=hangi=i+1)  /*检测0区*/

{for(j=1j<=liej=j+1)

{if(a[i][j]=='0')

{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1

if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1

if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1

if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1

if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1

if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1

if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1

if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1

}

}

}

if(t==1)goto leb3

}

n=0 /*检查结束*/

for(i=1i<=hangi=i+1)

{for(j=1j<=liej=j+1)

{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1}

}

}

while(a[u][v]!='#'&&n!=(hang*lie-ge))

for(i=1i<=gei=i+1)  /*游戏结束*/

{x=z[i]/lie+1y=z[i]%lie+1a[x][y]='#'}

printf("    ")

for(i=1i<=liei=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c  ",w)

}

printf("\n   |")

for(i=1i<=liei=i+1){printf("---|")}

printf("\n")

for(i=1i<=hangi=i+1)

{w=(i-1)/10+48printf("%c",w)

w=(i-1)%10+48printf("%c |",w)

for(j=1j<=liej=j+1)

{if(a[i][j]=='0')printf(" |")

else  printf(" %c |",a[i][j])

}

if(i==2)printf(" 剩余雷个数")

if(i==3)printf(" %d",lei)printf("\n   |")

for(j=1j<=liej=j+1) {printf("---|")}

printf("\n")

}

if(n==(hang*lie-ge)) printf("你成功了!\n")

else printf("    游戏结束!\n")

printf("    重玩请输入1\n")

t=0

scanf("%d",&t)

if(t==1)goto leb1

}

/*注:在DEV c++上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/

扫雷游戏(c语言版)

已经编译运行确认了:

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFTPRESS 0xff01

#define LEFTCLICK 0xff10

#define LEFTDRAG 0xff19

#define MOUSEMOVE 0xff08

struct

{

int num/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/

int roundnum/*统计格子周围有多少雷*/

int flag/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/

}Mine[10][10]

int gameAGAIN=0/*是否重来的变量*/

int gamePLAY=0/*是否是第一次玩游戏的标志*/

int mineNUM/*统计处理过的格子数*/

char randmineNUM[3]/*显示数字的字符串*/

int Keystate

int MouseExist

int MouseButton

int MouseX

int MouseY

void Init(void)/*图形驱动*/

void MouseOn(void)/*鼠标光标显示*/

void MouseOff(void)/*鼠标光标隐藏*/

void MouseSetXY(int,int)/*设置当前位置*/

int LeftPress(void)/*左键按下*/

int RightPress(void)/*鼠标右键按下*/

void MouseGetXY(void)/*得到当前位置*/

void Control(void)/*游戏开始,重新,关闭*/

void GameBegain(void)/*游戏开始画面*/

void DrawSmile(void)/*画笑脸*/

void DrawRedflag(int,int)/*显示红旗*/

void DrawEmpty(int,int,int,int)/*两种空格子的显示*/

void GameOver(void)/*游戏结束*/

void GameWin(void)/*显示胜利*/

int MineStatistics(int,int)/*统计每个格子周围的雷数*/

int ShowWhite(int,int)/*显示无雷区的空白部分*/

void GamePlay(void)/*游戏过程*/

void Close(void)/*图形关闭*/

void main(void)

{

Init()

Control()

Close()

}

void Init(void)/*图形开始*/

{

int gd=DETECT,gm

initgraph(&gd,&gm,"c:\\tc")

}

void Close(void)/*图形关闭*/

{

closegraph()

}

void MouseOn(void)/*鼠标光标显示*/

{

_AX=0x01

geninterrupt(0x33)

}

void MouseOff(void)/*鼠标光标隐藏*/

{

_AX=0x02

geninterrupt(0x33)

}

void MouseSetXY(int x,int y)/*设置当前位置*/

{

_CX=x

_DX=y

_AX=0x04

geninterrupt(0x33)

}

int LeftPress(void)/*鼠标左键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&1)

}

int RightPress(void)/*鼠标右键按下*/

{

_AX=0x03

geninterrupt(0x33)

return(_BX&2)

}

void MouseGetXY(void)/*得到当前位置*/

{

_AX=0x03

geninterrupt(0x33)

MouseX=_CX

MouseY=_DX

}

void Control(void)/*游戏开始,重新,关闭*/

{

int gameFLAG=1/*游戏失败后判断是否重新开始的标志*/

while(1)

{

if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/

{

GameBegain()/*游戏初始画面*/

GamePlay()/*具体游戏*/

if(gameAGAIN==1)/*游戏中重新开始*/

{

gameAGAIN=0

continue

}

}

MouseOn()

gameFLAG=0

if(LeftPress())/*判断是否重新开始*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)

{

gameFLAG=1

continue

}

}

if(kbhit())/*判断是否按键退出*/

break

}

MouseOff()

}

void DrawSmile(void)/*画笑脸*/

{

setfillstyle(SOLID_FILL,YELLOW)

fillellipse(290,75,10,10)

setcolor(YELLOW)

setfillstyle(SOLID_FILL,BLACK)/*眼睛*/

fillellipse(285,75,2,2)

fillellipse(295,75,2,2)

setcolor(BLACK)/*嘴巴*/

bar(287,80,293,81)

}

void DrawRedflag(int i,int j)/*显示红旗*/

{

setcolor(7)

setfillstyle(SOLID_FILL,RED)

bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5)

setcolor(BLACK)

line(198+j*20,95+i*20,198+j*20,95+i*20+10)

}

void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/

{

setcolor(color)

setfillstyle(SOLID_FILL,color)

if(mode==0)/*没有单击过的大格子*/

bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8)

else

if(mode==1)/*单击过后显示空白的小格子*/

bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7)

}

void GameBegain(void)/*游戏开始画面*/

{

int i,j

cleardevice()

if(gamePLAY!=1)

{

MouseSetXY(290,70)/*鼠标一开始的位置,并作为它的初始坐标*/

MouseX=290

MouseY=70

}

gamePLAY=1/*下次按重新开始的话鼠标不重新初始化*/

mineNUM=0

setfillstyle(SOLID_FILL,7)

bar(190,60,390,290)

for(i=0i<10i++)/*画格子*/

for(j=0j<10j++)

DrawEmpty(i,j,0,8)

setcolor(7)

DrawSmile()/*画脸*/

randomize()__page_break__

for(i=0i<10i++)/*100个格子随机赋值有没有地雷*/

for(j=0j<10j++)

{

Mine[i][j].num=random(8)/*如果随机数的结果是1表示这个格子有地雷*/

if(Mine[i][j].num==1)

mineNUM++/*现有雷数加1*/

else

Mine[i][j].num=2

Mine[i][j].flag=0/*表示没红旗标志*/

}

sprintf(randmineNUM,"%d",mineNUM)/*显示这次总共有多少雷数*/

setcolor(1)

settextstyle(0,0,2)

outtextxy(210,70,randmineNUM)

mineNUM=100-mineNUM/*变量取空白格数量*/

MouseOn()

}

void GameOver(void)/*游戏结束画面*/

{

int i,j

setcolor(0)

for(i=0i<10i++)

for(j=0j<10j++)

if(Mine[i][j].num==1)/*显示所有的地雷*/

{

DrawEmpty(i,j,0,RED)

setfillstyle(SOLID_FILL,BLACK)

fillellipse(200+j*20,100+i*20,7,7)

}

}

void GameWin(void)/*显示胜利*/

{

setcolor(11)

settextstyle(0,0,2)

outtextxy(230,30,"YOU WIN!")

}

int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/

{

int nNUM=0

if(i==0&&j==0)/*左上角格子的统计*/

{

if(Mine[0][1].num==1)

nNUM++

if(Mine[1][0].num==1)

nNUM++

if(Mine[1][1].num==1)

nNUM++

}

else

if(i==0&&j==9)/*右上角格子的统计*/

{

if(Mine[0][8].num==1)

nNUM++

if(Mine[1][9].num==1)

nNUM++

if(Mine[1][8].num==1)

nNUM++

}

else

if(i==9&&j==0)/*左下角格子的统计*/

{

if(Mine[8][0].num==1)

nNUM++

if(Mine[9][1].num==1)

nNUM++

if(Mine[8][1].num==1)

nNUM++

}

else

if(i==9&&j==9)/*右下角格子的统计*/

{

if(Mine[9][8].num==1)

nNUM++

if(Mine[8][9].num==1)

nNUM++

if(Mine[8][8].num==1)

nNUM++

}

else if(j==0)/*左边第一列格子的统计*/

{

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(j==9)/*右边第一列格子的统计*/

{

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

}

else if(i==0)/*第一行格子的统计*/

{

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

}

else if(i==9)/*最后一行格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

}

else/*普通格子的统计*/

{

if(Mine[i-1][j].num==1)

nNUM++

if(Mine[i-1][j+1].num==1)

nNUM++

if(Mine[i][j+1].num==1)

nNUM++

if(Mine[i+1][j+1].num==1)

nNUM++

if(Mine[i+1][j].num==1)

nNUM++

if(Mine[i+1][j-1].num==1)

nNUM++

if(Mine[i][j-1].num==1)

nNUM++

if(Mine[i-1][j-1].num==1)

nNUM++

}__page_break__

return(nNUM)/*把格子周围一共有多少雷数的统计结果返回*/

}

int ShowWhite(int i,int j)/*显示无雷区的空白部分*/

{

if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/

return

mineNUM--/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/

if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/

{

DrawEmpty(i,j,1,7)

Mine[i][j].num=0

}

else

if(Mine[i][j].roundnum!=0)/*输出雷数*/

{

DrawEmpty(i,j,0,8)

sprintf(randmineNUM,"%d",Mine[i][j].roundnum)

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

Mine[i][j].num=0/*已经输出雷数的格子用0表示已经用过这个格子*/

return

}

/*8个方向递归显示所有的空白格子*/

if(i!=0&&Mine[i-1][j].num!=1)

ShowWhite(i-1,j)

if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)

ShowWhite(i-1,j+1)

if(j!=9&&Mine[i][j+1].num!=1)

ShowWhite(i,j+1)

if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)

ShowWhite(i+1,j+1)

if(i!=9&&Mine[i+1][j].num!=1)

ShowWhite(i+1,j)

if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)

ShowWhite(i+1,j-1)

if(j!=0&&Mine[i][j-1].num!=1)

ShowWhite(i,j-1)

if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)

ShowWhite(i-1,j-1)

}

void GamePlay(void)/*游戏过程*/

{

int i,j,Num/*Num用来接收统计函数返回一个格子周围有多少地雷*/

for(i=0i<10i++)

for(j=0j<10j++)

Mine[i][j].roundnum=MineStatistics(i,j)/*统计每个格子周围有多少地雷*/

while(!kbhit())

{

if(LeftPress())/*鼠标左键盘按下*/

{

MouseGetXY()

if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/

{

MouseOff()

gameAGAIN=1

break

}

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/

continue

if(Mine[i][j].num!=0)/*如果格子没有处理过*/

{

if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/

{

MouseOff()

GameOver()/*游戏失败*/

break

}

else/*鼠标按下的格子不是地雷*/

{

MouseOff()

Num=MineStatistics(i,j)

if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/

ShowWhite(i,j)

else/*按下格子周围有地雷*/

{

sprintf(randmineNUM,"%d",Num)/*输出当前格子周围的雷数*/

setcolor(RED)

outtextxy(195+j*20,95+i*20,randmineNUM)

mineNUM--

}

MouseOn()

Mine[i][j].num=0/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/

if(mineNUM<1)/*胜利了*/

{

GameWin()

break

}

}

}

}

}

if(RightPress())/*鼠标右键键盘按下*/

{

MouseGetXY()

if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/

{

j=(MouseX-190)/20/*x坐标*/

i=(MouseY-90)/20/*y坐标*/

MouseOff()

if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/

{

DrawRedflag(i,j)

Mine[i][j].flag=1

}

else

if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/

{

DrawEmpty(i,j,0,8)

Mine[i][j].flag=0

}

}

MouseOn()

sleep(1)

}

}

}