c语言实现简单三子棋游戏

整个结构分为三个部分

test.c 测试游戏逻辑

  1. Do while逻辑
  2. menu菜单函数
  3. 选择变量input
  4. Switch结构
  5. game函数实现
    1. 棋盘数组
    2. 初始化棋盘
    3. 打印棋盘
    4. 玩家下棋
    5. 电脑下棋
    6. 判断输赢

game.c 游戏函数体

  1. InitBoard函数进行初始化,参数为棋盘数组,行,列的实现
    1. 可以用双层循环,也可以用memset进行初始化
  2. displayboard函数打印棋盘,参数为棋盘,行,列
  3. playermove玩家下棋,参数为棋盘,行列,
    1. 指示下棋坐标
    2. 两个变量存储坐标
    3. 我们要判断坐标的有效性(坐标是否符合范围,下棋坐标处是否被占用)
    4. 以上三个部分为循环,直到下棋成功在跳出
  4. Computermove电脑下棋,参数为棋盘,行和列
    1. 需要两个坐标,随机下
    2. x=rand()%row;
    3. y=rand ()%col;
    4. 要使用rand我们就要调用srand函数,使用时间戳去生成随机数 stand((unsigned int)time(null));要注意包含头文件
    5. bcd三步采用循环
  5. IsWin参数为棋盘,行列
    1. 玩家赢 返回"*"
    2. 电脑赢返回"#"
    3. 平局"Q",Isfull遍历棋盘是否还有空格
    4. 继续"C"
    5. 分别判断三行元素是否相等,三列元素是否相等对角线是否相等,并且不是空格则有人胜利,直接返回元素符号类型

game.h 游戏函数声明

  1. #define 定义行和列,方便到时候改
  2. 对函数进行声明
  3. 头文件的包含
代码详情
test.c文件
#include "game.h"
void menu()
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****0.exit*****\n");
	printf("****************\n");
}
void game()
{
	char ret;
	char board[ROW][COL] = { 0 };
	srand(time(NULL));
	IntBoard(board, ROW, COL);//初始化棋盘
	DisplayBoard(board, ROW, COL);//打印棋盘
	while (1)
	{
		//玩家下棋
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		判断输赢
		ret=IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(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()
{
	int input;
	do{
		
		menu();
		printf("请选择>:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("game over!\n");
			break;
		default:
			printf("选择错误,请重新选择>:\n");
			break;
		}
	
	} while (input);
	return 0;
}
 game.h文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3

//初始化棋盘
 void IntBoard(char board[ROW][COL],int row, int col);
 //打印棋盘
 void  DisplayBoard(char board[ROW][COL],int row, int col);
 //玩家操作
 void PlayMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL],int row, int col);
//电脑操作
void ComputerMove(char board[ROW][COL], int row, int col);



game.c文件
#include"game.h"

//初始化棋盘
void IntBoard(char board[ROW][COL], int row, int col)
{
	int i = 0,j=0;
	for (i = 0; i <row; i++)
	{
		for (j = 0; j <col; j++)
			board[i][j] =' ';
	}
	printf("初始化结束\n");
}
//显示棋盘
void  DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		/*printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
		if (i < row - 1)
		{
			printf("---|---|---");
		}
		printf("\n");*/
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//玩家操作
void PlayMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋\n");
	printf("请输入坐标>:");
	while (1)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("棋盘已被占用,请重新输入>");
			}
		}
		else
		{
			printf("坐标非法,请重新输入>");
		}
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x, y;
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}





//判断输赢

char  IsFull(char board[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 (board[i][j] == ' ')
				return 'C';
		}
	}
	return 'Q';
}

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]&& board[i][1]== board[i][2]&&board[i][0]!=' ')
			return board[i][0];
	}
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j]== board[2][j]&& board[0][j] != ' ')
			return board[0][j];
	}
	if (board[0][0] == board[1][1] && board[1][1]== board[2][2]&& board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1]== board[2][0]&& board[1][1]!=' ')
		return board[1][1];

	return IsFull(board, row, col);
		
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值