C语言小游戏设计——三子棋

       学了c语言这么长时间也没有个让我自己满意的成果,此次编写三子棋小游戏也算是人生中第一个项目了,接下来直接进入项目:

首先是任务的要求:

          1、三子棋首先得有个棋盘,随后得有棋子。

          2、棋子棋盘都有了当然还得让电脑会下棋子和人进行对弈。

          3、最后就是判断输赢啦

直接进入代码的编辑:

         先捋一下整个下棋的过程, 首先棋盘需要初始化为空格,以放置棋子,玩游戏之前需要把棋盘打印你一下吧,打印完成那么下来就是电脑下棋这个函数了,电脑下完肯定得先判断输赢平,赢了则结束此轮游戏,没赢就继续,平局就是退出并返回平局信号,继续则是玩家下,下完在判断是否输赢平,如果赢了,则结束此轮游戏,没赢继续电脑下,平局退出并返回平局信号.......

         首先编写头文件,为了以后的方便,先将stdio.h和stdlib.h两个头文件放在新建的头文件中。既然是三子棋那就只有三行和三列,所直接定义标识符ROW和COL都为3,接着就是声明所有要用的函数了,首先得个游戏菜单,控制游戏的开始和退出,其次,从上面总结的下棋的整个过程中可以得出,头文件里面的函数需要有初始化棋盘,打印棋盘、棋子,电脑走,玩家走,判断输赢平。

        得出头文件如下:

         文件名:sanziqi.h

#ifndef __SANZIQI_H__ //防止被多次利用
#define __SANZIQI_H__
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>

//初始化棋盘
void init_board(char arr[ROW][COL], int row, int col);

//打印棋盘
void show_board(char arr[ROW][COL], int row, int col);

//电脑走
void computer_move(char arr[ROW][COL], int row, int col);

//玩家走
void player_move(char arr[ROW][COL], int row, int col);

//判断输赢
char is_win(char arr[ROW][COL], int row, int col);

#endif // !__SANZIQI_H__

写完头文件我们就可直接来完成游戏的主函数了:

    进入游戏主函数说明已经进入了游戏,那么,进入游戏第一件事肯定是先初始化一下棋盘喽,先初始化为全是空格字符的数组,然后如果棋盘有空位就调用电脑走的函数(此程序默认都是电脑先走),然后判断输赢,然后如果有空位就玩家走,然后判断输赢,然后判断是否有空位,如果有空位就电脑走,一直循环,中途如果有赢的,直接跳出循环打印通知,结束游戏主函数,如果棋盘下满,则打印平局,结束游戏主函数,流程图如下:



                 代码如下:

            文件名:main.c

void game(char arr[ROW][COL], int row, int col)
{
	init_board(arr, row, col);
	int ct;
	do
	{	
		printf("电脑走动:\n");
		computer_move(arr, row, col);
		show_board(arr, row, col);
		ct = is_win(arr, row, col);
		if (ct == 'X')
		{
			printf("电脑赢!\n");
			return;
		}
		else if(ct == 'O')
		{
			printf("玩家赢!\n");
			return;
		}
		else if (ct == ' ')
		{
			printf("平局!\n");
			return;
		}
		player_move(arr, row, col);
		show_board(arr, row, col);
		ct = is_win(arr, row, col); 
		if (ct == 'X')
		{
			printf("电脑赢!\n");
			return;
		}
		else if (ct == 'O')
		{
			printf("玩家赢!\n");
			return;
		}
		else if (ct == ' ')
		{
			printf("平局!\n");
			return;
		}
	} while (1);
}

      整个项目到现在框架基本就完成了,下面我们将进行各个功能的实现,即函数的实现:

            文件名:sanziqi.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"sanziqi.h"

//打印菜单
int menu()
{
	int m_choose = 0;
	printf("*******************************\n");
	printf("**********1、开始游戏**********\n");
	printf("**********0、退出**************\n");
	printf("*******************************\n");
	printf("请选择序号:");
	scanf("%d", &m_choose);
	return m_choose;
}
//初始化棋盘
void init_board(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;
	for (i = 0; i<row; i++)
	{
		for (j=0; j<col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

//打印棋盘
void show_board(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;
	printf("  -1---2---3-\n");
	printf(" -------------\n");
	for (i=0; i<row; i++)
	{
		printf("%d|",i+1);
		for (j = 0; j < col; j++)
		{
			printf("%2c |", arr[i][j]);
		}
		printf("\n -------------\n");
	}
}

//电脑走动
void computer_move(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;
	do
	{
		i = rand() % 3;
		j = rand() % 3;
		if (arr[i][j] == ' ')
		{
			arr[i][j] = 'X';
			break;
		}
	} while (1);
}

//玩家走动
void player_move(char arr[ROW][COL], int row, int col)
{
	int i;
	int j;

	do
	{
		printf("请输入你要下的坐标(x y):");
		scanf("%d%d", &i, &j);
		i--;
		j--;
		if (arr[i][j] == ' ')
		{
			arr[i][j] = 'O';
			break;
		}
		else
		{
			printf("此位置已有棋子!\n");
		}
	} while (1);
}

//判断输赢:电脑赢则返回X,玩家赢返回O,平局返回空格。
char is_win(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j;
	for (i=0; i<row; i++)
	{
		//行一样
		if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]))
		{
			if (arr[i][0] == 'O')
			{
				return 'O';
			}
			else if (arr[i][0] == 'X')
			{
				return 'X';
			}
		}
		//列一样
		if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) )
		{
			if (arr[0][i] == 'O')
			{
				return 'O';
			}
			else if (arr[0][i] == 'X')
			{
				return 'X';
			}
		}
		//左上到右下
		if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
		{
			if (arr[0][0] == 'X')
			{
				return 'X';
			}
			if (arr[0][0] == 'O')
			{
				return 'O';
			}
		}
		//右上到左下
		if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
		{
			if (arr[0][2] == 'O')
			{
				return 'O';
			}
			if (arr[0][2] == 'X')
			{
				return 'X';
			}
		}
	}
	for (i=0; i<row; i++)
	{
		for (j=0; j<col; j++)
		{
			if (arr[i][j] == ' ')
				return 'C';
		}
	}
	return ' ';
}

         对以上代码进行一些必要的解释:

                1、电脑下棋的方式因为技术的限制,我暂时只能让它随机下,即生成随机数,因为电脑下的函数频繁调用,所以我将其随机数的种子在了main函数里,只需种一次即可。

                2、判断输赢时,先判断有没有赢的,如果赢了直接跳出并退出,如果没赢然后再判断棋盘是否满,如果没满就继续下,满了就退出并返回平局信号。

                3、在下棋的时候必须判断不能下在已有棋子的位子上面。

        最后完成函数的最主要部分:主函数

            文件名:main.c

#include"sanziqi.h"
#include<time.h>

int main()
{
	char arr[ROW][COL];
	int choose = 0;
	srand((unsigned int)time(NULL));
	do
	{
		choose=menu();
		switch (choose)
		{
		case 1:
		{
			game(arr, ROW, COL);
			break;
		}
		case 0:
		{
			printf("游戏已退出!!\n");
			break;
		}
		default:
		{
			printf("你输错了!\n");
			break;
		}
		}
	} while (choose);
	return 0;
}

        main()函数控制整个游戏的开始与结束

注意:

        game()函数是在main.c文件里面的为了分开讲,我将其和main()函数分开写。









猜你喜欢

转载自blog.csdn.net/qq_38590948/article/details/79901264