小游戏(三子棋)


想写一个三子棋小游戏,首先我们得想到实现它都需要哪些步骤:
  • 首先需要一个 3*3 的棋盘,那么这个棋盘第一次需要是空的;

  • 第一步就是要初始化棋盘,使棋盘为空;

  • 第二步当然就是打印出这个空棋盘;

  • 第三步就是要开始玩游戏下棋子了,玩家走一步,电脑走一步,直到无路可走;但是再分析,玩家走一步,我们可以把棋盘打印一次,可以看到玩家走了哪一步;那电脑走一步,我们也可以让棋盘再打印一次,棋盘每次的排布一目了然。

  • 在电脑和玩家下棋子的过程中,我们需要注意几个小点:

    a. 玩家和电脑走的位置不能重复
    b. 当三个相同的棋子连在一起的时候则胜出,所以有横竖和斜三种情况
    c. 当棋子没有分出胜负则为平局

  • 整个代码我们可以分为三个部分: 头文件game.h
    测试部分test.c , 游戏核心部分 game.c

初始化 3*3 棋盘
void Init(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	
		for(j=0;j<col;j++)
		{
			arr[i][j]=' ';//初始化为空格
		}
}


打印出整个棋盘
void Display(char arr[ROW][COL],int row,int col)
{
	int i=0;
	
	for(i=0;i<row;i++)
	{
		if(i<=row-1)
		{
			printf("|____|____|____|\n");
		}
		printf("| %c  |%c   |%c   |\n",arr[i][0],arr[i][1],arr[i][2]);
	}
	printf("|____|____|____|\n");
}
玩家下棋子

void Player(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("玩家走:\n");
	while(1)
	{
		
		printf("请输入坐标:\n");
		scanf("%d %d",&x,&y);
		if((x>=1&&x<=3)&&(y>=1&&y<=3))
		{
			if(arr[x-1][y-1]==' ')//玩家在棋盘空的地方下棋子
			{
				arr[x-1][y-1]='X';
				break;
			}
			else
				printf("坐标被占用\n");
		}
		    else
				printf("坐标非法\n");
			
		}

}

电脑下棋子

void Computer(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
		printf("电脑走\n");
	while(1)
	{

		int x=rand()%row;//随机数
		int y=rand()%col;
		if(arr[x][y]==' ')
		{
			arr[x][y]='0';
			break;
		}
	}
}
  • 在这个中间,我们还需要一个判断棋盘是否满盘,如果没有则继续走棋子
int Isfull(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			if(arr[i][j]==' ')
				return 0;
		}
	}
	return 1;
}
判断胜出: 横 竖 斜三种情况

char Iswin(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)//横
	{
		if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][0]!=' ')
			return arr[i][0];
	}
	for(j=0;j<col;j++)//竖
	{
		if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j]&&arr[0][j]!=' ')
			return arr[1][j];
	}
	if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[0][0]!=' ')//斜
		{
			return arr[1][1];
	}
	if(arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[0][2]!=' ')//斜
		
		{
			return arr[1][1];
	}
	if(Isfull(arr,row,col)==1)//平局
		{
			return 'Q';
	}
	return ' ';
}
  • 这些就是游戏的一些流程规则

  • 那么在游戏代码的开始,我们需要一个界面来开始玩游戏
int main()
{
	
	int input=0;
     srand((unsigned int)time(NULL));//随机数的函数
	 
	do
	{
		menu();
		printf("请选择>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	}
	while(input);
	
	//game();
	system("pause");
	return 0;
}
  • 那么整个游戏的代码:
game.h

#ifndef _ GAME _ H __
#define _ GAME _ H __
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>

#define ROW 3
#define COL 3
void Init(char arr[ROW][COL],int row,int col);
void Display(char arr[ROW][COL],int row,int col);
void Player(char arr[ROW][COL],int row,int col);
void Computer(char arr[ROW][COL],int row,int col); 
char Iswin(char arr[ROW][COL],int row,int col);
int Isfull(char arr[ROW][COL],int row,int col);


#endif

test.c

#include"game.h"
void menu()
{
	printf("**************************\n");
	printf("****   1 : piay       ****\n");
	printf("****   0 : exit       ****\n");
	printf("**************************\n");
}


void game()
{
	char arr[ROW][COL]={0};
	char ret=' ';
	Init(arr,ROW,COL);
	Display(arr,ROW,COL);
	while(1)
	{

	    Player(arr,ROW,COL);
	    Display(arr,ROW,COL);
	    ret=Iswin(arr,ROW,COL);
	   if(ret!=' ')
		  break;
	     Computer(arr,ROW,COL);
	       Display(arr,ROW,COL);
	       ret=Iswin(arr,ROW,COL);
		if(ret!=' ')
			break;
	}
	if(ret=='X')
	{
		printf("恭喜你,你赢了!\n");
	}
	else if(ret=='0')
	
	{
	    printf("很遗憾,电脑赢了\n");
	}
	
	else if(ret=='Q')
	{
		printf("平局呦");
	}
	Display(arr,ROW,COL);
	
}
int main()
{
	
	int input=0;
     srand((unsigned int)time(NULL));
	 
	do
	{
		menu();
		printf("请选择>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
}
	while(input);
	
	//game();
	system("pause");
	return 0;
}
game.c

#include"game.h"
void Init(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	
		for(j=0;j<col;j++)
		{
			arr[i][j]=' ';
		}
}


void Display(char arr[ROW][COL],int row,int col)
{
	int i=0;
	
	for(i=0;i<row;i++)
	{
		if(i<=row-1)
		{
			printf("|____|____|____|\n");
		}
		printf("| %c  |%c   |%c   |\n",arr[i][0],arr[i][1],arr[i][2]);
	}
	printf("|____|____|____|\n");
}
void Player(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("玩家走:\n");
	while(1)
	{
		
		printf("请输入坐标:\n");
		scanf("%d %d",&x,&y);
		if((x>=1&&x<=3)&&(y>=1&&y<=3))
		{
			if(arr[x-1][y-1]==' ')
			{
				arr[x-1][y-1]='X';
				break;
			}
			else
				printf("坐标被占用\n");
		}
		    else
				printf("坐标非法\n");
			
		}

}

void Computer(char arr[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
		printf("电脑走\n");
	while(1)
	{

		int x=rand()%row;
		int y=rand()%col;
		if(arr[x][y]==' ')
		{
			arr[x][y]='0';
			break;
		}
	}
}
int Isfull(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			if(arr[i][j]==' ')
				return 0;
		}
	}
	return 1;
}
char Iswin(char arr[ROW][COL],int row,int col)
{
	int i=0;
	int j=0;
	for(i=0;i<row;i++)
	{
		if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][0]!=' ')
			return arr[i][0];
	}
	for(j=0;j<col;j++)
	{
		if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j]&&arr[0][j]!=' ')
			return arr[1][j];
	}
	if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[0][0]!=' ')
		{
			return arr[1][1];
	}
	if(arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[0][2]!=' ')
		
		{
			return arr[1][1];
	}
	if(Isfull(arr,row,col)==1)
		{
			return 'Q';
	}
	return ' ';
}

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/79842004