⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game2.c

📁 一个C实现的模拟机 框架 已经有存档 和读挡的功能
💻 C
字号:
#include<io.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<bios.h>
#include<mem.h>
#include<fcntl.h>
#include<stdlib.h>
#include<conio.h>

#define VGA256 0x13
#define TEXT_MODE 0x03
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
#define CHAR_HEIGHT 8
#define CHAR_WIDTH 8

unsigned char far *video_buffer=(char far *)0xA0000000L;
unsigned char far *rom_char_set=(char far *)0xF000FA6EL;
int xa=0,ya=0,l=0;

void Set_Video_Mode(int mode)
{
	union REGS inregs,outregs;
	inregs.h.ah=0;
	inregs.h.al=(unsigned char)mode;
	int86(0x10,&inregs,&outregs);
}

void Plot_Pixel_Fast(int x,int y,char color)
{
	video_buffer[((y<<8)+(y<<6))+x]=color;
}

void H_Line(int x1,int x2,int y,unsigned int color)
{
	memset( (char far *) (video_buffer + ( (y<<8) + (y<<6) ) + x1) , color , x2-x1+1 );
}

void V_Line(int y1,int y2,int x,unsigned int color)
{
	int i;
	for(i=y1;i<y2;i++)
		video_buffer[ (i<<8) + (i<<6) + x]=color;
}


void Rectangle(int x1,int y1,int x2,int y2,int color)
{
	H_Line(x1,x2,y1,color);
	H_Line(x1,x2,y2,color);
	V_Line(y1,y2,x1,color);
	V_Line(y1,y2,x2,color);

}


void Fill_Rectangle(int x1,int y1,int x2,int y2,int color)
{
	int i;
	for(i=y1;i<=y2;i++)
	{
		H_Line(x1,x2,i,color);
	}
}

void Blit_Char(int xc,int yc,char c,int color,int trans_flag)
{
int offset,x,y;
char far *work_char;
unsigned char bit_mask=0x80;
work_char=rom_char_set+c*CHAR_HEIGHT;
offset=(yc<<8)+(yc<<6)+xc;
for(y=0;y<CHAR_HEIGHT;y++)
{
bit_mask=0x80;
for(x=0;x<CHAR_WIDTH;x++)
{
if((*work_char&bit_mask))
video_buffer[offset+x]=color;
else if(!trans_flag)
video_buffer[offset+x]=0;
bit_mask=(bit_mask>>1);
}
offset+=SCREEN_WIDTH;
work_char++;
}
}


void Blit_String(int x,int y,int color,char *string,int trans_flag)
{
int index;
for(index=0;string[index]!=0;index++)
{
Blit_Char(x+(index<<3),y,string[index],color,trans_flag);
}
}

void Fill_Screen(int value)
{
_fmemset(video_buffer,(char)value,SCREEN_WIDTH*SCREEN_HEIGHT+1);
}

int menu(void)
{
	int key,flag=1;
	char *a[3]={"","",""};
	char *menu[4]={"new game","load game","save game","quit game"};
	if(l==0)
	{
		Blit_String(100,85,WHITE,menu[0],1);
		Blit_String(100,105,WHITE,menu[1],1);
		Blit_String(100,125,8,menu[2],1);
		Blit_String(100,145,WHITE,menu[3],1);
	}
	else
	{
		Blit_String(100,85,WHITE,menu[0],1);
		Blit_String(100,105,8,menu[1],1);
		Blit_String(100,125,WHITE,menu[2],1);
		Blit_String(100,145,WHITE,menu[3],1);
	}
	Blit_String(0,180,BLUE,"(press up and down arrow key to choice)",1);
	Fill_Rectangle(95,80,180,95,WHITE);
	Blit_String(100,85,BLACK,"new game",1);
	while(key!=13)
	{
		switch(key=getch())
		{
			case 80:
				if(flag<4)
				{
					Fill_Rectangle(95,60+20*flag,180,75+20*flag,BLACK);
					Blit_String(100,65+20*flag,WHITE,menu[flag-1],1);
					if((l==0&&flag==2)||(l!=0&&flag==1))
						flag=flag+2;
					else
						flag=flag+1;
					Fill_Rectangle(95,60+20*flag,180,75+20*flag,WHITE);
					Blit_String(100,65+20*flag,BLACK,menu[flag-1],1);
				}
			break;
			case 72:
				if(flag>1)
				{
					Fill_Rectangle(95,60+20*flag,180,75+20*flag,BLACK);
					Blit_String(100,65+20*flag,WHITE,menu[flag-1],1);
					if((l!=0&&flag==3)||(l==0&&flag==4))
						flag=flag-2;
					else
						flag=flag-1;
					Fill_Rectangle(95,60+20*flag,180,75+20*flag,WHITE);
					Blit_String(100,65+20*flag,BLACK,menu[flag-1],1);
				}
			break;
		}
	}
	Fill_Screen(0);
	return flag;
}


void Write_To_File(char flag,char *file,int *word)
{
	const char *xy;
	int i=0;
	FILE *stream;
	if ((stream = fopen(file, "w+b")) == NULL)
	{
		fprintf(stderr, "Cannot open output file.\n");
		return 1;
	}
	while(word[i]!=-1)
	{
	itoa(word[i],xy,10);
	fwrite(xy,strlen(xy), 1, stream);
	fputc(flag,stream);
	i++;
	}
	fclose(stream);
}

void game()
{
	int color=YELLOW,key;
	while(key!='q')
	{
		Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,color);
		switch(key=getch())
		{
			case 75:
			if(xa>0)
			{
				Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
				xa=xa-1;
			}
			break;
			case 77:
			if(xa<19)
			{
				Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
				xa=xa+1;
			}
			break;
			case 72:
			if(ya>0)
			{
				Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
				ya=ya-1;
			}
			break;
			case 80:
			if(ya<19)
			{
				Fill_Rectangle(xa*16,ya*10,xa*16+15,ya*10+9,BLACK);
				ya=ya+1;
			}
			break;
		}

	}
}


void Read_From_File(char flag,char *file,int *word)
{
	int i,j=0,k=0;
	char *buf;
	FILE *stream;
	if ((stream = fopen(file, "r+b")) == NULL)
	{
		fprintf(stderr, "Cannot open output file.\n");
		return 1;
	}
	for(i=0;!feof(stream);i++)
	{
		fread(buf,1, 1, stream);
		if(buf[0]==flag)
		{
			fseek(stream,k, SEEK_SET);
			fread(buf,i-k+1,1,stream);
			buf[i-k]='\x0';
			word[j]=atoi(buf);
			j++;
			k=i+1;
		}
	}
	fclose(stream);
}



void main(void)
{
	int load=0,i;
	char flag=';';
	char *file="load.dat";
	char *buf="";
	int *word;
	Set_Video_Mode(VGA256);
	while(load!=4&&load!=3)
	{
		if(load==2)
		{
			Read_From_File(flag,file,word);
			xa=word[0];
			ya=word[1];
			game();
		}
		else if(load==1)
		{
			xa=0;
			ya=0;
			game();
		}
		load=menu();
		if(load==3)
		{
			word[0]=xa;
			word[1]=ya;
			word[2]=-1;
			Write_To_File(flag,file,word);
		}
		l++;
	}
	Set_Video_Mode(TEXT_MODE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -