C语言实现小游戏——模拟微信小游戏《最强飞刀手》
讯享网
曾经玩过的微信小游戏,想着用C语言实现,只可惜,下图是我的上限。
这个下游戏界面简陋,把旋转的西瓜做成了平的接盘;实现的功能有:接盘的移动、飞刀的移动与发射、飞刀与接盘的结合、游戏计分、游戏闯关(每过一关,难度上升——通过加快接盘的移动速度以及增加飞刀的数量)等
附上代码:
测试程序main.c:
#include "game.h" int main(int argc,char argv) { system("mode con cols=120 lines=50"); menu(); choose(); return 0; }
讯享网
函数定义game.c:
讯享网#include "game.h" #define RIGHT 1 #define LEFT 2 int state; int score,add_score,sleeptime,level,knife_num,left_num; content *c_head,*c_tail,*c_p; knife *k_head,*k_tail,*k_p; /* 光标位置 */ void gotoxy(int x,int y) //x坐标,2为一个汉字宽度;y坐标,1为一个汉字高度 { COORD c; c.X=x; c.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); } /* 字体颜色 */ int color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色 return 0; } /* 界面首页 */ void menu() { gotoxy(50,10); color(10); printf(" 最 强 飞 刀 \n"); gotoxy(42,18); color(3); printf("1、开始游戏 2、退出游戏\n"); } /* 游戏开始/退出 */ void choose() { int mode; gotoxy(52,24); color(6); printf("请输入1或者2: "); color(2); scanf("%d",&mode); switch(mode) { case 1: system("cls"); state=RIGHT; score=0; add_score=5; sleeptime=160; level=1; knife_num=5; left_num=knife_num; game_begin(); break; case 2: system("cls"); exit(0); break; default: system("cls"); menu(); gotoxy(50,26); color(4); printf("输入有误,请重新输入! "); choose(); } } /* 游戏开始 */ void game_begin() { print_boundary(); print_background(); print_word(); content_init(); knife_init(); while(1) { Sleep(sleeptime); knife_move(); print_content(); Sleep(20); knife_init(); content_direction(); content_move(); print_content(); print_word(); if(left_num==0) { Sleep(200); level_change(); } } } /* 接盘初始化 */ void content_init() { int i,x=10,y=4; c_head=(content *)malloc(sizeof(content)); c_head->next=NULL; c_tail=c_head; for(i=0;i<14;i++) { c_p=(content *)malloc(sizeof(content)); c_p->next=NULL; c_tail->next=c_p; c_tail=c_p; } c_p=c_head; while(c_p) { c_p->x=x; c_p->y=4; color(4); gotoxy(c_p->x,c_p->y); printf("■"); c_p->flag=0; x+=2; c_p=c_p->next; } } /* 飞刀初始化 */ void knife_init() { int i,x=38,y=30; k_head=(knife *)malloc(sizeof(knife)); k_head->next=NULL; k_tail=k_head; for(i=0;i<4;i++) { k_p=(knife *)malloc(sizeof(knife)); k_p->next=NULL; k_tail->next=k_p; k_tail=k_p; } k_p=k_head; while(k_p) { k_p->x=x; k_p->y=y; color(5); gotoxy(k_p->x,k_p->y); printf("■"); y-=1 ; k_p=k_p->next; } gotoxy(k_tail->x,k_tail->y); printf("▲"); } /* 游戏边界 */ void print_boundary() { int x,y; color(10); for(x=8;x<70;x+=2) { gotoxy(x,2); printf("■"); gotoxy(x,40); printf("■"); } for(y=3;y<40;y+=1) { gotoxy(8,y); printf("■"); gotoxy(68,y); printf("■"); } } /* 游戏背景+飞刀底座 */ void print_background() { int x,y; color(0); for(x=10;x<68;x+=2) { for(y=3;y<40;y+=1) { gotoxy(x,y); printf("■"); } } color(4); for(y=31,x=34;x<44;x+=2) { gotoxy(x,y); printf("■"); } for(y=32,x=32;x<46;x+=2) { gotoxy(x,y); printf("■"); } } /* 打印接盘+已发射飞刀 */ void print_content() { int x,y; c_p=c_head; while(c_p) { color(4); gotoxy(c_p->x,c_p->y); printf("■"); if(c_p->flag) { color(5); gotoxy(c_p->x,c_p->y+1); printf("▲"); gotoxy(c_p->x,c_p->y+2); printf("■"); gotoxy(c_p->x,c_p->y+3); printf("■"); gotoxy(c_p->x,c_p->y+4); printf("■"); gotoxy(c_p->x,c_p->y+5); printf("■"); } else { for(y=5;y<10;y++) { color(0); gotoxy(c_p->x,y); printf("■"); } } c_p=c_p->next; } for(x=10;x<c_head->x;x+=2) { for(y=5;y<10;y++) { color(0); gotoxy(x,y); printf("■"); } } for(x=c_tail->x+2;x<68;x+=2) { for(y=5;y<10;y++) { color(0); gotoxy(x,y); printf("■"); } } } /* 文字说明 */ void print_word() { color(10); gotoxy(80,6); printf("第 %d 关",level); color(10); gotoxy(80,8); printf("本关剩余 %d 把刀",left_num); color(10); gotoxy(80,16); printf("你的得分是: %d 分",score); gotoxy(80,18); printf("下一个飞刀分值: %d 分",add_score); color(12); gotoxy(80,22); printf("用↑发射飞刀"); gotoxy(80,24); printf("space : 暂停游戏"); gotoxy(80,26); printf("ESC : 结束游戏"); } /* 接盘方向控制 */ void content_direction() { if((c_head->x==10) && (state==LEFT)) state=RIGHT; if(c_tail->x==66 && state==RIGHT) state=LEFT; if(GetAsyncKeyState(VK_ESCAPE)) { system("cls"); game_end(); } if(GetAsyncKeyState(VK_SPACE)) { while(GetAsyncKeyState(VK_SPACE)); while(1) { if(GetAsyncKeyState(VK_SPACE)) { while(GetAsyncKeyState(VK_SPACE)); break; } } } } /* 接盘运动函数 */ void content_move() { switch(state) { case RIGHT: move_right(); break; case LEFT: move_left(); break; } } /* 向左运动 */ void move_right() { color(0); gotoxy(c_head->x,c_head->y); printf("■"); c_p=c_head; while(c_p) { c_p->x+=2; c_p=c_p->next; } } /* 向右运动 */ void move_left() { color(0); gotoxy(c_tail->x,c_tail->y); printf("■"); c_p=c_head; while(c_p) { c_p->x-=2; c_p=c_p->next; } } /* 发射飞刀 */ void knife_move() { c_p=c_head; if(GetAsyncKeyState(VK_UP)) { while(c_p) { if(c_p->x==38) { if(c_p->flag==0) { knife_up(5); c_p->flag=1; score+=add_score; if(left_num>0) left_num--; } else { knife_up(10); Sleep(500); system("cls"); game_end(); } } c_p=c_p->next; } } } /* 飞刀向上移动 */ int knife_up(int y_min) { while(k_tail->y > y_min) { k_p=k_head; color(0); gotoxy(k_p->x,k_p->y); printf("■"); while(k_p) { k_p->y-=1; color(5); gotoxy(k_p->x,k_p->y); printf("■"); k_p=k_p->next; } gotoxy(k_tail->x,k_tail->y); printf("▲"); } return 0; } /* 关卡切换 */ void level_change() { level+=1; if(knife_num<12) knife_num+=1; else { system("cls"); game_win(); } left_num=knife_num; if(sleeptime>60) sleeptime-=20; system("cls"); color(4); gotoxy(54,14); printf(" 第 %d 关\n",level); Sleep(1000); system("cls"); game_begin(); } /* 游戏结束 */ void game_end() { int i; color(4); gotoxy(54,10); printf("游 戏 结 束\n"); gotoxy(54,14); printf(" 第 %d 关\n",level); gotoxy(54,16); printf(" 总分: %d 分\n",score); gotoxy(42,22); color(3); printf("1、返回首页 2、退出游戏\n"); gotoxy(52,26); color(6); printf("请输入1或者2:"); color(2); scanf("%d",&i); switch(i) { case 1: system("cls"); menu(); choose(); break; case 2: system("cls"); exit(0); break; default: system("cls"); gotoxy(50,28); color(4); printf("输入有误, 请重新输入! "); game_end(); } } /* 游戏胜利 */ void game_win() { int i; color(2); gotoxy(52,10); printf("恭 喜 你 通 过 全 关 !\n"); gotoxy(54,16); printf(" 总分: %d 分\n",score); gotoxy(42,22); color(3); printf("1、返回首页 2、退出游戏\n"); gotoxy(52,26); color(6); printf("请输入1或者2:"); color(2); scanf("%d",&i); switch(i) { case 1: system("cls"); menu(); choose(); break; case 2: system("cls"); exit(0); break; default: system("cls"); gotoxy(50,28); color(4); printf("输入有误, 请重新输入! "); game_win(); } }
头文件game.h:
#ifndef _GAME_ #define _GAME_ #include <stdio.h> #include <time.h> #include <windows.h> #include <stdlib.h> #include <conio.h> typedef struct content { int x; int y; int flag; struct content *next; }content; typedef struct knife { int x; int y; struct knife *next; }knife; void menu(); void choose(); void game_begin(); void game_end(); void game_win(); void content_init(); void knife_init(); void print_boundary(); void print_background(); void print_content(); void print_word(); void content_direction(); void content_move(); void move_right(); void move_left(); void knife_move(); int knife_up(int y_min); void level_change(); #endif
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/71985.html