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