三子棋游戏---C语言

要求:如图
***也就是这个东西***

步骤

1、绘制棋盘(坐标实现)
2、用户落子
3、判断(赢了没)- - ->赢了就结束,平局就继续
4、电脑落子
5、判断(赢了没)- - ->赢了就结束,平局就继续
6、循环以上

实现

//main.c

#include "game.h"//头文件另起

int main(){
	int quit = 0;
	while (!quit){
		Menu();//菜单选择
		int select = 0;
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Game();//输入1,则玩游戏
			break;
		case 2:
			printf("quit!\n");//输入2,退出游戏
			quit = 1;
			break;
		default:
			printf("Enter Error! Try Again!\n");//错误,提示重新输入
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");
	return 0;
}

//game.h

#ifndef _GAME_H_
#define _GAME_H_

#include <stdio.h>
#include <time.h>
#include <windows.h>

#pragma warning(disable:4996)
void Menu();
void Game();

#define ROW 3 //行列宏定义
#define COL 3 

#define P_COLOR 'X' //用户执子用X
#define C_COLOR '0'//电脑执子用O

#endif

//game.c

#include "game.h"

//菜单选择
void Menu(){

	printf("###########################\n");
	printf("#### 1.Play       2.Exit ####\n");
	printf("###########################\n");
	printf("###请输入你的选择:");
}

//画棋盘
void DrawBoard(char board[][COL], int row, int col)
{
	printf("   1 | 2 | 3 |\n");
	printf("-----------------\n");
	for (int i = 0; i <row; i++){
		printf("%d|", i + 1);//显示是第几行
		for (int j = 0; j < col; j++){
			printf(" %c|", board[i][j]);
		}
		printf("\n-----------------\n");
	}
}

//用户落子
void PlayMove(char board[][COL], int row, int col)//落子
{
	int x = 0;
	int y = 0;
	while (1){
		printf("请输入你的位置#");
		scanf("%d %d", &x, &y);//如果是往数组里写入,直接arr,不带&,因为此时arr代表首元素地址。
		
		if (x<1 || x>3 || y<1 || y>3){
			printf("输入位置有误,请重新输入\n");//因为棋盘大小是3*3,不能越界
			continue;//回到while
		}
		//这里减一是因为数组下标从0开始
		if (board[x - 1][y - 1] != ' ')//选择的位置已经有棋子了
		{
			printf("该位置已经存在棋子!\n");
			continue;//回到while
		}
		board[x - 1][y - 1] = P_COLOR;
		return;//结束
	}
}

//判断输/赢/平局/Next
char Judge(char board[][COL], int row, int col)//用户赢返回‘X’,电脑赢了返回‘O’,‘N’表示继续往下走,‘P’平局。
{
	for (int i = 0; i < row; i++)//扫描行,是否有一行相同
	{
		if (board[i][0] == board[i][1] &&\
			board[i][1] == board[i][2] && \
			board[i][0] != ' ')//整行相同且不为0
		{
			return board[i][0];//返回后两个元素也可以
		}
	}
	for (int j = 0; j < col; j++)//扫描列,是否有一列相同
	{
		if (board[0][j] == board[1][j] && \
			board[1][j] == board[2][j] && \
			board[0][j] != ' ')//整列相同且不为0
		{
			return board[0][j];
		}
	}
	if (board[0][0] == board[1][1] && \
		board[1][1] == board[2][2] && \
		board[0][0] != ' ')//扫描正对角线是否相同
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[1][1] != ' ')//扫描反对角线是否相同
	{
		return board[1][1];
	}
	//代码走到这里说明没有输赢,所以是平局或Next的情况.
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			if (board[i][j] == ' '){
				return 'N'; //Next
			}
		}
	}
	return 'P'; //平局
}

//电脑落子
void ComputerMove(char board[][COL], int row, int col)
{
	//生成随机数0 1 2
	while (1){
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' '){
			board[x][y] = C_COLOR;
			break;
		}
	}
}

//游戏中
void Game(){
	srand((unsigned long)time(NULL));//随机数种子
	char board[ROW][COL];
	//字符数组存放下过的位置,X或O,没下过的初始为*
	//void .* memset(void *ptr,int value,size_t num)
	//对一块内存进行特定内容的设计,参数1指的是内存块的起始地址,最后一个参数是要设计的内存的字节的个数,中间的参数表示想把这块内存设计成什么
	memset(board, ' ', sizeof(board));
	char win = '\0';
	do{
		DrawBoard(board,ROW,COL);//首先要绘制棋盘
		PlayMove(board, ROW, COL); //用户走
		win=Judge(board, ROW, COL); //判断
		if (win != 'N'){
			break;
		}
		ComputerMove(board, ROW, COL); //电脑走
		win=Judge(board, ROW, COL); //再判断
		if (win != 'N'){
			break;
		}
	}while (1); 
	switch (win)
	{
	case P_COLOR:
		printf("you win!\n");
		break;
	case C_COLOR:
		printf("you lose!\n");
		break;
	case 'P':
		printf("平局\n");
		break;
	default:
		break;
	}
	DrawBoard(board, ROW, COL);//这里是把输赢后的棋盘再显示
}

结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值