小游戏:三子棋的代码实现

文章目录:

        一:定义函数,打印游戏菜单。

        二:宏定义打印棋盘,以及创建新文件以及头文件,例:game.c和game.h

                1:定义函数初始化棋盘

                2:定义函数打印棋盘以及分割线(重难点)

       三:玩家下棋

        四:电脑下棋

        五:判断输赢(重难点)

        六:代码全析总结

一、打印菜单

  • 相信大家在打单机游戏的时候,肯定会看到一个菜单(目录),也就是在刚刚进入游戏的时候看到的选项,需要玩家输入数字进行选择

  • 选择1(进入游戏)

  • 选择0(退出游戏)

  • void venu()
    {
    	printf("---------------------------\n");
    	printf("---1:开始游戏    2:结束游戏\n");
    	printf("---------------------------\n");
    }

在主函数内进行游戏规划以及实现代码框架

在函数中会叫用rand()和srand()函数以及time()函数,注意记得调用其头文件:

#include<stdlib.h>以及#include<time.h>头文件,同时注意格式和运行的逻辑顺序

int main()
{
	//打印游戏菜单
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		venu();
		printf("请输入数字\n");
		scanf("%d", &input);
		switch (input)
		{//实现game游戏函数
		case 1:game(); break;
		case 0:printf("结束游戏\n"); break;
		default:printf("输入错误,请重新输入\n"); break;
		}
	} while (input);	
	return 0;
}

二、棋盘打印

因为棋盘类似于一个二维数组,所以用一个二维数组来接收下的棋子的“字符”;

   1:定义函数初始化棋盘

void Initboard(char board[Row][Col], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

2:定义函数打印棋盘以及分割线(重难点)

为了格式美观,会将最后一列的格式线进行删除。

当for在行循环中进行到最后一行和一列时,注意:此时的行格式线和列格式线都要进行删除

void playboard(char board[Row][Col], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0; 
		for(j=0;j<col;j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
			printf("|");

		}
		printf("\n");
		//控制行变化,不打印row最后一行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				//控制不打印col最后一列
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}

 三:玩家下棋

那就是玩家(也就是你自己)下一步,然后电脑在下一步,直到谁赢,输,平局,所以无论在你下完一步后还是在电脑下完一步后,都要判断这局游戏的输赢,但是判断三字棋局的输赢,除了三字连成线,也就是横三条,竖三条,斜两条,可表示输赢,还有如果棋子下完了棋盘还没有分出胜负,那就是平局,其他情况就继续下棋。

用函数 Playgame();表示玩家下一步棋子,用字符‘*’表示,使用玩家输入的值,然后判断该坐标是否被占用,如果被占用则再次输入值进行填充表格

void playgame(char board[Row][Col], int row, int col)
{	
	int x = 0, y = 0;		
	while (1)
	{	printf("请玩家输入下棋坐标->");
		scanf("%d%d", &x, &y);
	//确保玩家输入坐标在棋盘之内
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("该坐标以被占用,请重新输入\n");				
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}

四:电脑下棋

  使用Computergame()函数; 表示电脑下一步棋,用字符‘#’表示,在使用rand()函数,使电脑生成随机值,然后判断该坐标是否被占用,如果被占用则再次随机生成值进行填充表格。
 

void computergame(char board[Row][Col], int row, int  col)
{
	int x = 0, y = 0;	
	printf("电脑下棋\n");
	while (1)
	{	x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x ][y ] = '#';
			break;
		}
	}
}

五:判断输赢(重难点)

再完成一个函数 Iswin();判断棋局输赢,需要一个返回值,如果玩家赢返回‘’;如果输返回‘#’,平局返回‘Q’,继续则返回‘C’

char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
	
	//判断行是否相同
for (i = 0; i < row; i++)
{  
	if (board[i][0] == ' ')
		continue;
	count = 0;
		for (j = 0; j < col-1; j++)
		{
			if (board[i][j] == board[i][j + 1])
				count++;
		}
		if(count==row-1)
		return board[i][0];
	}
	//判断列是否相同
for (i = 0; i < col; i++)
{
	if (board[0][i] == ' ')
		continue;
	count = 0;
	for (j = 0; j < row - 1; j++)
	{
		if (board[j][i] == board[j + 1][i])
			count++;
	}
	if(count==col-1)
	return board[0][j];
}
	//判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
	if (board[0][0] == ' ')
		break;	
	if (board[i][i] == board[i + 1][i + 1])
		count++;
	if (count == row-1)
		return board[i][i];
}
	//判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
	if (board[0][col-1] == ' ')
		break;
	
	if (board[i][j] == board[i+1][j-1])
		count++;
	if (count == row - 1)
		return board[i][j];
}
	//判断是否和棋
count = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 'c';
			else
				count++;
		}
	}
	if (count == (row * col))
		return 'Q';
}

    六:代码全析总结

第一部分:主函数  例:源.c

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//打印菜单
void venu()
{
	printf("---------------------------\n");
	printf("---1:开始游戏    2:结束游戏\n");
	printf("---------------------------\n");
}
void game()
{
	char board[Row][Col] = { 0 };
	//1:给board字符数组覆空格初始值
	Initboard(board, Row,Col);
	//2:打印表格
	playboard(board, Row, Col);
	char ret = 0;
	while (1)
	{//玩家下棋
		playgame(board, Row, Col);
		playboard(board, Row, Col);
		//判断谁赢
		ret=iswin(board, Row, Col);
		if (ret != 'c')
			break;
		//电脑下棋
		computergame(board, Row, Col);
		playboard(board, Row, Col);
		ret=iswin(board, Row, Col);
		if (ret != 'c')
			break;
	}
	if (ret == '*')
		printf("玩家赢了\n");
	else if (ret == '#')
		printf("电脑赢了\n");
	else 
		printf("和棋了\n");
}
int main()
{
	//打印游戏菜单
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		venu();
		printf("请输入数字\n");
		scanf("%d", &input);
		switch (input)
		{//实现game游戏函数
		case 1:game(); break;
		case 0:printf("结束游戏\n"); break;
		default:printf("输入错误,请重新输入\n"); break;
		}
	} while (input);	
	return 0;
}

第二部分:实现三子棋的游戏头文件

#pragma once
#define Row 3
#define Col 3
//覆初始值
void Initboard(char board[Row][Col], int row, int col);
//打印表格
void playboard(char board[Row][Col], int row, int col);
//玩家下棋
void playgame(char board[Row][Col], int row, int col);
void computergame(char board[Row][Col], int row,int  col);
char iswin(char board[Row][Col], int row, int  col);

第三部分:(核心)游戏代码的实现

#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include"game.h"
#include<stdio.h>
#include<stdlib.h>
void Initboard(char board[Row][Col], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void playboard(char board[Row][Col], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0; 
		for(j=0;j<col;j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
			printf("|");

		}
		printf("\n");
		//控制行变化,不打印row最后一行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				//控制不打印col最后一列
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}
void playgame(char board[Row][Col], int row, int col)
{	
	int x = 0, y = 0;		
	while (1)
	{	printf("请玩家输入下棋坐标->");
		scanf("%d%d", &x, &y);
	//确保玩家输入坐标在棋盘之内
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
			{
				printf("该坐标以被占用,请重新输入\n");				
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
}
void computergame(char board[Row][Col], int row, int  col)
{
	int x = 0, y = 0;	
	printf("电脑下棋\n");
	while (1)
	{	x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x ][y ] = '#';
			break;
		}
	}
}
char iswin(char board[Row][Col], int row, int  col)
{int i = 0, j = 0,count=0,flag=1;
	
	//判断行是否相同
for (i = 0; i < row; i++)
{  
	if (board[i][0] == ' ')
		continue;
	count = 0;
		for (j = 0; j < col-1; j++)
		{
			if (board[i][j] == board[i][j + 1])
				count++;
		}
		if(count==row-1)
		return board[i][0];
	}
	//判断列是否相同
for (i = 0; i < col; i++)
{
	if (board[0][i] == ' ')
		continue;
	count = 0;
	for (j = 0; j < row - 1; j++)
	{
		if (board[j][i] == board[j + 1][i])
			count++;
	}
	if(count==col-1)
	return board[0][j];
}
	//判断主对角线是否相同
count = 0;
for (i = 0; i < row-1; i++)
{
	if (board[0][0] == ' ')
		break;	
	if (board[i][i] == board[i + 1][i + 1])
		count++;
	if (count == row-1)
		return board[i][i];
}
	//判断次对角线是否相同
count = 0;
for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--)
{
	if (board[0][col-1] == ' ')
		break;
	
	if (board[i][j] == board[i+1][j-1])
		count++;
	if (count == row - 1)
		return board[i][j];
}
	//判断是否和棋
count = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 'c';
			else
				count++;
		}
	}
	if (count == (row * col))
		return 'Q';
}

最后真诚的祝愿每一位代码人都能够实现~~~~

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给一个一键三连,感谢。

猜你喜欢

转载自blog.csdn.net/smile_sundays/article/details/130586488