C语言的小游戏——三字棋

头文件:

        (tip:可以改define定义的ROW和COL的值来改变三子棋的为多字棋)

#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3

//菜单函数
void menu();

//游戏内核
void game();

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

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

//判断下棋先后
void panduanNextOrLast(char board[ROW][COL],char* flag, int fl, char* me, char* you,char * ch,char * cch,int * dian);

//输入坐标
void inputXY(char borad[ROW][COL], int row, int col, char* ch);

//电脑下棋
void computerinputXY(char board[ROW][COL], int row, int col, char* cch);

//判断胜负
void juesheng(char board[ROW][COL], int row, int col, char* ch, char* cch,int * jue);

游戏核心源码:

#define  _CRT_SECURE_NO_WARNINGS
#include "game.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 DisplayBoard(char board[ROW][COL], int row, int col)
{
	//打印头边分隔线
	int k = 0;
	for (k = 0; k < col; ++k)
	{
		if (k != col - 1)
			printf(" ___");
		else
			printf(" ___ \n");
	}

	//打印数据和随之以下的分隔线
	int i = 0;
	for (i = 0; i < row; ++i)
	{
		//打印数据
		int j = 0;
		for (j = 0; j < col; ++j)
		{
			if (j != col - 1)
				printf("| %c ", board[i][j]);
			else
				printf("| %c |\n", board[i][j]);
		}

		//打印随之以下分隔行
		int l = 0;
		for (l = 0; l < col; ++l)
		{
			if (l != col - 1)
				printf("|___");
			else
				printf("|___|\n");

		}

	}


}

//判断下棋先后
void panduanNextOrLast(char board[ROW][COL], char flag[], int fl, char* me, char* you, char* ch, char* cch, int* dian)
{


	if ((0 != strcmp(flag, "me")) && (0 != strcmp(flag, "you")))
	{
		int inputagain = 1;
		while (inputagain == 1)
		{
			inputagain = 0;

			while (getchar() != '\n');

			printf("谁先下棋(me or you):>");
			scanf("%s", flag);

			if ((0 != strcmp(flag, "me")) && (0 != strcmp(flag, "you")))
			{
				printf("输入错误,请重新输入!\n");
				inputagain = 1;
			}

		}
	}
	else
	{
		return;
	}



	if (0 == strcmp(flag, "me"))
	{
		*ch = *me;
		*cch = *you;
		*dian = 0;
	}
	else if (0 == strcmp(flag, "you"))
	{
		*ch = *me;
		*cch = *you;
		*dian = 1;
	}

	//刷新棋盘
	DisplayBoard(board, ROW, COL);

}

//玩家输入坐标下棋
void inputXY(char board[ROW][COL], int row, int col, char* ch)
{

	//创建并初始化输入坐标
	int x = -1;
	int y = -1;

	int k = 1;
	while (1)
	{
		while (getchar() != '\n');

		k = 0;
		printf("玩家下棋——输入坐标(x,y):>");
		scanf("%d %d", &x, &y);

		//换算成数组下标的形式
		x--;
		y--;

		//坐标合法性判断之后再写入
		if (row > x && x >= 0 && col > y && y >= 0)
		{
			if (board[x][y] == ' ')
			{
				board[x][y] = *ch;
			}
			else
			{
				printf("输入错误,请重新输入\n");
				//再次初始化输入坐标
				x = -1;
				y = -1;
				k = 1;
				DisplayBoard(board, ROW, COL);
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
			//再次初始化输入坐标
			x = -1;
			y = -1;
			k = 1;
			DisplayBoard(board, ROW, COL);
		}

		if (k == 0)
			break;
	}
	//再次初始化输入坐标
	x = -1;
	y = -1;


	//刷新一下棋盘
	DisplayBoard(board, ROW, COL);

}

//电脑下棋
void computerinputXY(char board[ROW][COL], int row, int col, char* cch)
{
	printf("电脑下棋:>\n");

	//创建临时变量做电脑下棋的坐标
	int x = -1;
	int y = -1;

	while (1)
	{
		//控制电脑下棋的坐标范围
		x = rand() % row;
		y = rand() % col;

		if (board[x][y] == ' ')
		{
			board[x][y] = *cch;
			break;
		}

	}

	//初始化电脑坐标
	x = -1;
	y = -1;

	//刷新一下棋盘
	DisplayBoard(board, ROW, COL);

}

//判断胜负
void juesheng(char board[ROW][COL], int row, int col, char* ch, char* cch, int* jue)
{
	//横向
	if (*jue == 0) {
		int xsuoyin = -1;
		int shen = 0;
		int i = 0;
		for (i = 0; i < ROW; ++i)
		{
			if (board[i][0] != ' ')
			{
				int j = 0;
				for (j = 0; j < ROW - 1; ++j)
				{
					if (board[i][j] != board[i][j + 1])
					{
						shen = 1;
						break;
					}
				}
				if (shen == 0)
				{
					xsuoyin = i;
					break;
				}
			}
		}


		if (shen == 0 && xsuoyin != -1)
		{

			if (board[xsuoyin][0] == *ch)
			{
				*jue = 2;
				return;
			}

			if (board[xsuoyin][0] == *cch)
			{
				*jue = 3;
				return;
			}
		}
	}

	//纵向
	if (*jue == 0)
	{
		int ysuoyin = -1;
		int shen = 0;
		int i = 0;
		for (i = 0; i < row; ++i)
		{
			if (board[0][i] != ' ')
			{
				int j = 0;
				for (j = 0; j < ROW - 1; ++j)
				{
					if (board[j][i] != board[j + 1][i])
					{
						shen = 1;
						break;
					}
				}

				if (shen == 0)
				{
					ysuoyin = i;
					break;
				}
			}

		}

		if (shen == 0 && ysuoyin != -1)
		{

			if (board[0][ysuoyin] == *ch)
			{
				*jue = 2;
				return;
			}

			if (board[0][ysuoyin] == *cch)
			{
				*jue = 3;
				return;
			}
		}
	}

	//左斜方
	if (*jue == 0)
	{
		if (board[0][0] != ' ')
		{
			int k = 0;
			int i = 0;
			for (i = 0; i < ROW - 1; ++i)
			{
				if (board[i][i] != board[i + 1][i + 1])
				{
					k = 1;
					break;
				}
			}

			if (k != 1)
			{
				if (board[0][0] == *ch)
				{
					*jue = 2;
					return;
				}

				if (board[0][0] == *cch)
				{
					*jue = 3;
					return;
				}
			}
		}
	}

	//右斜方
	if (*jue == 0)
	{
		if (board[0][COL - 1] != ' ')
		{
			int k = 0;
			int i = 0;
			for (i = 0; i < ROW - 1; ++i)
			{
				if (board[i][ROW - i - 1] != board[i + 1][ROW - i - 2])
				{
					k = 1;
					break;
				}
			}

			if (k != 1)
			{
				if (board[0][COL - 1] == *ch)
				{
					*jue = 2;
					return;
				}

				if (board[0][COL - 1] == *cch)
				{
					*jue = 3;
					return;
				}
			}
		}
	}

	//平局
	if (*jue == 0)
	{
		int t = 0;
		for (t = 0; t < ROW; ++t)
		{
			int j = 0;
			for (j = 0; j < COL; ++j)
			{
				if (board[t][j] == ' ')
					return;
			}

		}

		*jue = 1;
	}



}

//游戏内核
void game()
{
	//图案
	char me = 'X';
	char you = '#';

	//棋盘数组
	char board[ROW][COL];

	//初始化棋盘
	InitBoard(board, ROW, COL);

	//打印棋盘
	DisplayBoard(board, ROW, COL);

	//输入的先后的数组存储
	char flag[5];
	int fllength = strlen(flag);
	char ch = 0;
	char cch = 0;
	int dian = 0;//选择先后的int数值0为玩家先,1为电脑先

	//判断胜负的变量
	int jue = 0;

	//输入坐标
	while (1)
	{
		panduanNextOrLast(board, &flag, fllength, &me, &you, &ch, &cch, &dian);

		if (dian == 0)
		{
			inputXY(board, ROW, COL, &ch);//玩家下棋
			juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
			//得出结果并输出
			if (jue != 0)
			{
				if (jue == 1)
				{
					printf("平局\n");
				}
				if (jue == 2)
				{
					printf("玩家胜!\n");

				}
				if (jue == 3)
				{
					printf("电脑胜!\n");
				}

				printf("游戏结束!\n");
				return;
			}
			computerinputXY(board, ROW, COL, &cch);//电脑下棋
			juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
			//得出结果并输出
			if (jue != 0)
			{
				if (jue == 1)
				{
					printf("平局\n");
				}
				if (jue == 2)
				{
					printf("玩家胜!\n");

				}
				if (jue == 3)
				{
					printf("电脑胜!\n");
				}

				printf("游戏结束!\n");
				return;
			}
		}

		if (dian == 1)
		{
			computerinputXY(board, ROW, COL, &cch);//电脑下棋
			juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负


			//得出结果并输出
			if (jue != 0)
			{
				if (jue == 1)
				{
					printf("平局\n");
				}
				if (jue == 2)
				{
					printf("玩家胜!\n");

				}
				if (jue == 3)
				{
					printf("电脑胜!\n");
				}

				printf("游戏结束!\n");
				return;
			}
			inputXY(board, ROW, COL, &ch);//玩家下棋
			juesheng(board, ROW, COL, &ch, &cch, &jue);//判断胜负
			//得出结果并输出
			if (jue != 0)
			{
				if (jue == 1)
				{
					printf("平局\n");
				}
				if (jue == 2)
				{
					printf("玩家胜!\n");

				}
				if (jue == 3)
				{
					printf("电脑胜!\n");
				}

				printf("游戏结束!\n");
				return;
			}
		}


	}

}

//菜单函数
void menu()
{
	printf("********************\n");
	printf("*******1.play*******\n");
	printf("*******2.exit*******\n");
	printf("********************\n");
}

游戏运行入口测试代码:

#define  _CRT_SECURE_NO_WARNINGS
/*
* 利用数组名
*/

#include "game.h"


//游戏流程
int main()
{
	srand((unsigned int)time(NULL));//设置随机数的生成起点
	int input = 0;

	do
	{
		menu();//打印菜单
		printf("请先选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("三子棋:\n");
			game();
			printf("____________________\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

	return 0;
}

(以上就是三字棋的黑色命令符窗口的游戏代码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小艺术生◎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值