用C语言写坦克大战

        今天,我们来用C语言写一个坦克大战小游戏。

        首先,上代码。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>
 
HANDLE hout;
char zt;
int yz,xz,ht,wz,fen,jb;
int hp=10;
void gotoxy(int x,int y)  			
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(handle,pos);
}
char getInput()
{
    int ch; 
     
    COORD coord; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
 
    coord.X=10;
    coord.Y=10;
    if(3-fen==0)
	{
		system("cls");
		gotoxy(26,12);
		printf("你赢了!"); 
   		gotoxy(26,14);
   		printf("最终得分:%d分",fen);
   		while(1)
   		{
   			Sleep(32767);
		}
	}
   	if(hp==0)
   	{
   		Sleep(20);
   		system("cls");
   		gotoxy(26,12);
   		printf("你输了!");
   		gotoxy(26,14);
  		printf("最终得分:%d分",fen);
   		while(1)
   		{
   			Sleep(32767);
		}
	}
	if(coord.X>40&&coord.Y<10)
    {
    	hp=hp-1;
     	gotoxy(72,1);
      	printf("%d滴",hp);
       	gotoxy(76,3);
       	printf("%d辆",3-fen);
       	gotoxy(67,5);
   		printf("%d分",fen);
		}
	if(coord.X>40&&coord.Y>20)
	{
       	hp=hp-1;
       	gotoxy(72,1);
       	printf("%d滴",hp);
       	gotoxy(76,3);
       	printf("%d辆",3-fen);
       	gotoxy(67,5);
   		printf("%d分",fen);
	}
	if(coord.Y>20&&coord.X<18)
	{
       	hp=hp-1;
       	gotoxy(72,1);
       	printf("%d滴",hp);
       	gotoxy(76,3);
       	printf("%d辆",3-fen);
       	gotoxy(67,5);
   		printf("%d分",fen);
	}
	if(coord.X<10&&coord.Y<10)
	{
		hp=hp+2;
		gotoxy(72,1);
       	printf("%d滴",hp);
	}
 
    ch=getch();
 
    while(ch==0xE0||ch==0x0d)
    {
        GetConsoleScreenBufferInfo(hout,&csbi);
        coord.X=csbi.dwCursorPosition.X; 
        coord.Y=csbi.dwCursorPosition.Y; 
     	gotoxy(72,1);
       	printf("%d滴",hp);
       	gotoxy(76,3);
       	printf("%d辆",3-fen);
       	gotoxy(67,5);
       	printf("%d分",fen);
       	wz=coord.X*coord.Y;
       	if(3-fen==0)
       	{
       		system("cls");
       		gotoxy(26,12);
       		printf("你赢了!"); 
       		gotoxy(26,14);
       		printf("最终得分:%d分",fen);
       		while(1)
       		{
       			Sleep(32767);
			}
		}
       	if(hp==0)
       	{
       		Sleep(20);
       		system("cls");
       		gotoxy(26,12);
       		printf("你输了!");
       		gotoxy(26,14);
       		printf("最终得分:%d分",fen);
       		while(1)
       		{
       			Sleep(32767);
			}
		}
        if(coord.X>40&&coord.Y<10)
        {
        	hp=hp-1;
        	gotoxy(72,1);
        	printf("%d滴",hp);
	       	gotoxy(76,3);
	       	printf("%d辆",3-fen);
	       	gotoxy(67,5);
       		printf("%d分",fen);
		}
		if(coord.X>40&&coord.Y>20)
		{
        	hp=hp-1;
        	gotoxy(72,1);
        	printf("%d滴",hp);
        	gotoxy(76,3);
	       	printf("%d辆",3-fen);
	       	gotoxy(67,5);
       		printf("%d分",fen);
		}
		if(coord.Y>20&&coord.X<18)
		{
        	hp=hp-1;
        	gotoxy(72,1);
        	printf("%d滴",hp);
        	gotoxy(76,3);
	       	printf("%d辆",3-fen);
	       	gotoxy(67,5);
       		printf("%d分",fen);
		}
		if(coord.X<10&&coord.Y<10)
		{
			hp=hp+2;
			gotoxy(72,1);
        	printf("%d滴",hp);
		}
        //如果是回车
        if(ch==0x0d)
        {
            coord.X=0;
            coord.Y++;
            SetConsoleCursorPosition(hout,coord);
            break;
        }
        ch=getch();
        //上
        if(ch==0x48)
        {
            if(coord.Y!=0)
            {
            	if (zt==1)
            	{
            		yz=coord.Y;
            		yz=yz-1;
            		xz=coord.X;
            		system("cls");
            		system("type map.map");
            		gotoxy(xz,yz);
            		coord.Y--;
					printf(" =[0]");
				}else{
					yz=coord.Y;
            		yz=yz-1;
            		xz=coord.X;
            		system("cls");
            		system("type map.map");
            		gotoxy(xz,yz);
            		coord.Y--;
					printf("[0]= ");
				}
			}
        }
 
        //下
        else if(ch==0x50)
        {
            if (zt==1)
            	{
            		yz=coord.Y;
            		yz=yz+1;
            		xz=coord.X;
            		system("cls");
            		system("type map.map");
            		gotoxy(xz,yz);
            		coord.Y++;
					printf(" =[0]");
				}else{
					yz=coord.Y;
            		yz=yz+1;
            		xz=coord.X;
            		system("cls");
            		system("type map.map");
            		gotoxy(xz,yz);
            		coord.Y++;
					printf("[0]= ");
				}
        }
 
        //左
        else if(ch==0x4b)
        {
            if(coord.X!=0){xz=coord.X--;yz=coord.Y;gotoxy(0,0);system("type map.map");gotoxy(xz,yz);printf("=[0]  \b");zt=1;}
        }
 
        //右
        else if(ch==0x4d)
        {
            if(coord.X!=79){xz=coord.X++;yz=coord.Y;gotoxy(0,0);system("type map.map");gotoxy(xz,yz);printf("\b  [0]=");zt=2;}
            else
            {
                coord.X=0;
                coord.Y++;
            }
        }
 
        SetConsoleCursorPosition(hout,coord);
        ch=getch();
 
 
    }
    return ch;
    }
 
 
void main()
{
	system("mode con cols=80 lines=42");
	CONSOLE_CURSOR_INFO cursor_info = {1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
	system("title 坦克大战"); 
	system("color 27");
	system("type map.map");
	gotoxy(4,2);
	printf("[0]=\b\b\b");
    char ch;
   	gotoxy(72,1);
  	printf("%d滴",hp);
  	gotoxy(76,3);
	printf("%d辆",3-fen);
	gotoxy(67,5);
   	printf("%d分",fen);
    hout=GetStdHandle(STD_OUTPUT_HANDLE);
    gotoxy(4,2);
	MessageBox(NULL, TEXT("恭喜你获得上线大奖——穿墙外挂!按确定键领取大奖。"), TEXT("坦克大战"), MB_OK);
    while(1)
    {
        ch=getInput();
        if (ch=='g')
        {
			CONSOLE_CURSOR_INFO cursor_info = {1,1};
			SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
		}
		if (ch=='h')
		{
			CONSOLE_CURSOR_INFO cursor_info = {1,0};
			SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
		}
		if (ch==' ')
		{
			if (zt==1)
			{
				fen=fen+1;
				ht=36;
				while(ht-1)
				{
					ht=ht-1;
					printf("*");
					Sleep(20);
					printf("\b \b\b");
				}
				printf("                                     \b=[0]\b\b\b\b\b");
			}
			if (zt==2)
			{
				fen=fen+1;
				printf("[0]=");
				ht=24;
				while(ht-1)
				{
					ht=ht-1;
					printf("*");
					Sleep(20);
					printf("\b ");
				}
				printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
			}
		}
    }
 
 
    getchar();
     
}

 这个程序全部是printf()函数打印出来的,利用了控制台光标,让控制台光标随意移动,而坦克随着控制台光标走。而开炮系统使用了while循环,让炮弹向前走。当你走进敌方坦克的攻击范围内,你就会不断掉血,你要打败3个敌人,当然,回到你的出生点会让你无上限的加血。当然,因为作者技术有限,坦克有一个穿墙的BUG,作者也没办法,就在开局给了玩家一个穿墙外挂,这样也好解释这个BUG。至于炮弹穿墙的话,作者本来意愿就是这样的。就算有这两个外挂(BUG),要是没有掌握游戏机制的话,也会死的很惨,但你要是摸清了游戏机制,那就会很容易。

操作方法:方向键移动,空格键开炮,就这几个操作,不多。

PS:这个Win7以上显示效果不好,要把字体调成点阵,再开启旧版控制台就可以了

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值