井字棋游戏

首先声明,本人是一个菜鸟,特别菜的那种
我们要实现三子棋首先要有一个良好的思维,本人比较愚昧,所以写出来的代码可能也比较平淡,请各位大佬指教。
让我们先来理清我们应该怎样体现出这个游戏,当我们进入游戏时,肯定需要一个界面来让玩家来选择是玩游戏还是退出,这里我想法比较少,所以只给用户提供两种选择,当然也可以给玩家其他的选择,这里就不多说了。然后就是进入具体的游戏了 我们知道井字棋的游戏规则是如果连着三个是同一个就能判定输赢。具体代码如下:

#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.h>
#include<time.h>
#include<windows.h>
#pragma warning(disable:4996)

#define ROW 3
#define COL 3
#define INT ' '//用空格来表示什么都没有
#define P_ICON 'X'//玩家我们用x来表示
#define C_ICON 'O'//电脑用o来表示
void InitialTable(char table[][COL], int row, int col);
void ShowTable(char table[][COL], int row, int col);
char Judge(char table[][COL], int row, int col);
void Computer(char table[][COL], int row, int col);
int Guess();

void Game();
#endif 

#include"game.h"

void menu()
{
	printf("****************************\n");
	printf("*****欢迎来到三子棋游戏*****\n");
	printf("****************************\n");
	printf("****************************\n");
	printf("*****1.开始      2.退出*****\n");
	printf("****************************\n");
}
int main()
{
	int select = 0;
	int flag = 0;
	while (!flag)//让玩家来选择是否继续游戏
	{
		menu();//显示出最开始玩家选择界面
		printf("请选择你要进行的操作:\n");
		scanf("%d", &select);
		switch (select)
		{
		case 1://如果玩家选择开始游戏,那么游戏开始
			Game();
			break;
		case 2://如果玩家选择退出,则结束游戏
			flag = 1;
			printf("bye bye!\n");
			break;
		default:
			printf("enter error!please enter again:\n");
				break;
		}
	}
	system("pause");
	return 0;
}

#include "game.h"

void InitialTable(char table[][COL], int row, int col)//初始化棋盘
{
	int i = 0;
	for (; i < row; i++)
	{
		int j = 0;
		for (; j < col; j++)
		{
			table[i][j] = INT;
		}
	}
}
void ShowTable(char table[][COL], int row, int col)//显示棋盘的构局
{
	printf("    | 1  | 2  | 3  | \n");
	printf("---------------------\n");
		int i =1 ;
	for (i; i <=row; i++)
	{
		printf("%d   |",i);
		int j = 0;
		for (j; j < col; j++){
			printf(" %c  |", table[i-1][j]);
		}
		printf("\n");
		printf("----------------------\n");
	}
}
char Judge(char table[][COL], int row, int col)//判定是否已经产生游戏结果
{
	int i = 0;
	for (; i < row; i++)
	{
		if (table[i][0] != INT&&table[i][0] == table[i][1] && table[i][1] == table[i][2])
		{
			return table[i][0];//如果有连续横着的三个,则返回字符
		}
	}
	for (i=0; i < col; i++)
	{
		if (table[0][i] != INT&&table[0][i] == table[1][i] && table[1][i] == table[2][i])
		{
			return table[0][i];//如果有连续竖着的三个,则返回字符
		}
	}
	if (table[1][1] != INT&&table[0][0] == table[1][1] && table[1][1] == table[2][2])
	{
		return table[1][1];//判断斜着的3个是否连续
	}
	if (table[1][1] != INT&&table[0][2] == table[1][1] && table[1][1] == table[2][0])
	{
		return table[1][1];//判断斜着的三个是否连续
	}
	for (i=0; i < row; i++)
	{
		int j = 0;
		for (; j < col; j++)
		{
			if (table[i][j] == INT)
			{
				return 'N';//如果棋盘还有空位则返回N
			}
		}
	}
	return 'F';//都不满足说明已满,返回F
}
void Computer(char table[][COL], int row, int col)//确定电脑要落子的位置
{
	while (1)
	{
		Sleep(1000);
		int x = rand()%row;
		int y = rand()%col;//随机生成一个数
		if (table[x][y] == INT)
		{
			table[x][y] = C_ICON;
			break;
		}
	}
}
int Guess()//用随机的方法来确定是玩家先下还是电脑先下
{
	int num = 0;
	printf("请猜数字!\n");
	printf("0代表硬币的正面,1代表硬币的反面!\n");
	printf("请猜测硬币的正反面:\n");
	scanf("%d", &num);
	int guess = rand() % 2;//随机生成0或1
	if (guess == num)
		{
			printf("你猜对了,你先走!\n");
			Sleep(1000);
			return 0;
		}
		else
		{
			printf("你猜错了,电脑先走!\n");
			Sleep(1000);
			return 1;
		}
}
void Game()
{
	srand((unsigned long)time(NULL));
	char result=0;
	char table[ROW][COL];
	InitialTable(table,ROW,COL);
	ShowTable(table, ROW, COL);
	int x = 0;
	int y = 0;
	int who = Guess();
	do
	{
		system("cls");//刷新界面
		ShowTable(table, ROW, COL);
		switch (who){
		case 0:
			printf("请输入你想下的位置:\n");
			scanf("%d %d", &x, &y);
			if (x <= 0 || x > 3 || y <= 0 || y > 3)
			{
				printf("你的输入有误,请重新输入\n");//将落子的范围确定
				continue;
			}
			if (table[x - 1][y - 1] != INT)
			{
				printf("此位置已经有棋子了,请重新输入:\n");//将落子的范围确定
				continue;
			}
			table[x - 1][y - 1] = P_ICON;
			printf("你已经走完,电脑正在思考中........\n");
			Sleep(1000);
			who = 1;
			break;
		case 1:
			Computer(table, ROW, COL);
			who = 0;
			break;
		default:
			break;
		}
		result = Judge(table, ROW, COL);//通过返回的字符来确定下一步的操作
		ShowTable(table, ROW, COL);
		if (result != 'N')
		{
			break;
		}
	} while (1);
	if (result == P_ICON)//如果返回玩家字符,则玩家赢
	{
		printf("你赢了!\n");
	}
	else if (result == C_ICON)//如果返回电脑字符,则电脑赢
	{
		printf("你输了!\n");
	}
	else
	{
		printf("平局!\n");//如果棋盘已满说明没有赢家,为平局
	}
	printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值