求经典游戏(五子棋蛇俄罗斯方块等。)c++源代码。最好有软件设计流程。我想学习想法。
这些游戏一般分为控制算法、显示算法、决策算法等。
供参考:
# include & ltstdio.h & gt
# include & ltwindows.h & gt
# include & ltstdlib.h & gt
# include & ltstring.h & gt
# include & ltconio.h & gt
# include & lttime.h & gt//使用当前时间作为种子;
枚举目录{上、下、左、右};//枚举类型枚举目录;
//栅栏;
void init fence();
void OutputF();
char游戏[20][20];
//绘制一个框架;
void InitFence(){
int i,j;
for(I = 0;我& lt20;i++)
for(j = 0;j & lt20;j++){
if(I = = 0 | | I = = 19 | | j = = 0 | | j = = 19)
game[I][j]= ' * ';
else game[I][j]=“”;
}
}
//显示框架;
void OutputF(){
int i,j;
for(I = 0;我& lt20;i++){
for(j = 0;j & lt20;j++)
printf("%c ",game[I][j]);
printf(" \ n ");
}
}
//snake节点;
结构SnakeNode{
int x,y;
struct SnakeNode *prior,* next
}*head=NULL,* tail = NULL
void add_head(int x,int y);
int get _ x(struct snake node * p);
int get _ y(struct snake node * p);
void delete _ tail();
//插入头节点;
void add_head(int x,int y){
struct snake node * q =(struct snake node *)malloc(sizeof(struct snake node));
q->;x = xq->;y = y
q->;下一个=头;
q->;先验=空;
if(head)head-& gt;先验= q;
head = q;
如果(!tail)尾巴=头;
game[x][y]= ' * ';//f对象可以在定义Fence类的时候定义;并且Fence类在SnakeNode类之前定义;
}
int get_x(struct SnakeNode *p){
返回p-& gt;x;
}
int get_y(struct SnakeNode *p){
返回p-& gt;y;
}
//删除尾节点;
void delete_tail(){
struct SnakeNode * p = tail
游戏[get _ x(tail)][get _ y(tail)]=“”;//将尾节点坐标表示的' * '设置为空格;
if(tail==head)
tail = head = NULL
否则{
tail = tail-& gt;先验;
尾巴-& gt;next = NULL
}
免费(p);
}
//move移动;
结构移动{
枚举方向点;//枚举变量point:控制方向;
int food _ x;
int food _ y;
};
void移动(struct move * m);
void change_point(char,struct move * m);//改变方向;
void get _ food(struct move * m);
void get_food(struct move *m){
srand((无符号int)time(NULL));//seed(程序运行时间);
m-& gt;food _ x = rand()% 18+1;
m-& gt;food _ y = rand()% 18+1;
游戏[m-& gt;food _ x][m-& gt;food _ y]= ' * ';
}
空移动(结构移动*m){
int a,b;
a = get _ x(head);//获取头节点的横坐标
b = get _ y(head);//头节点的纵坐标
开关(m->;点){
case up:-a;打破;
case down:++ a;打破;
案例左:-b;打破;
case right:++ b;打破;
}
if(a = = 19 | | b = = 19 | | a = = 0 | | b = = 0){//判断是否碰壁;
printf("游戏结束!!!\ n ");
退出(0);
}
if(a = = m-& gt;食物x & amp& ampb = = m-& gt;Food_y){ //吃货;
add_head(a,b);
get _ food(m);
}
否则{
add_head(a,b);//插入头节点;
delete _ tail();//删除尾节点;
}
}
void change_point(char keydown,struct move *m){
开关(按键){
//大小写“w”:m-& gt;点=上;打破;
//大小写':m-& gt;点=下;打破;
//大小写“a”:m-& gt;点=左;打破;
//大小写“d”:m-& gt;点=右;打破;
案例72:m-& gt;点=上;打破;
案例80:m-& gt;点=下;打破;
案例75:m-& gt;点=左;打破;
案例77:m-& gt;点=右;打破;
}
}
//main();
int main(){
结构移动m;
printf("用‘w,s,a,d’控制方向!!!\ n \ n \ n ");
init fence();
add_head(4,3);
add_head(4,4);
add_head(4,5);
获取_食物(& ampm);
OutputF();
while (1){
char keydown = getch();//getch()返回在键盘上读取的字符;包括头文件
change _ point(keydown & amp;m);
而(!khit()){//判断是否有掉键;
系统(“cls”);//清屏功能;
移动(& ampm);
OutputF();
睡眠(200);
}
}
返回0;
}