三子棋(简易版)

以下讨论的是三行三列的三子棋,如果想看n行m列的N子棋,敬请期待。

三子棋,在棋盘上连续三个都是你的棋就算赢              文件名红色字体

         二维数组board来表示棋盘                                   函数名蓝色字体

         数组中的元素空格代表未放棋子的地方

         元素* 表示  玩家1  下子的地方

         元素#表示电脑下子或  玩家2  下子的地方

我将这个游戏项目分成三个文件,分别为 

game.h 放了游戏函数的声明,因为主函数不需要直接调用游戏里的各个小函数,所以只放了test()的声明

game.c 定义了

test()  根据玩家的输入判断进不进入游戏,人机模式,还是玩家对玩家,或者退出游戏

game(int a) 当a==1,人机模式

                   当a==2,玩家对战玩家

正式进入游戏,选择玩家1要下棋落子的位置,然后轮到电脑(玩家2)下棋,一直下到和棋,或者一方胜利结束游戏,然后又执行test()选择玩不玩

init() 该函数用于初始化棋盘,将棋盘所有元素都赋值为空格

print() 打印整个棋盘,将棋盘格式以及以经下的棋子打印出来。

menu1()    

 menu2()   

 player(int a) 当a==1时是玩家1下棋

                     当a==2时是玩家2下棋

 computer()   电脑下棋,电脑下的位置随机,如果想让电脑聪明一点,得加算法

iswin() 判断此时是谁赢了,或者和棋,还是继续,每次任何一方有落子都判断一次

test.c 在main函数里调用游戏主程序test()

这是game.c文件

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#define ROW 3
#define COL 3
int board[ROW][COL];

char iswin() {
	int i, j;
	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][0] && board[0][j] != ' ')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][COL - 1] == board[1][COL - 2] && board[1][COL - 2] == board[2][COL - 3] && board[0][COL - 1] != ' ')return board[0][COL - 1];
	int count = 0;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++)if (board[i][j] == ' ')count = 1;
	}
	if (count == 0)return 0;
}

void init() {
	int i, j;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++)board[i][j] = ' ';
	}
}

void print(void) {
	int i, j;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < COL; j++) {
			if (j < COL - 1)printf(" %c |", board[i][j]);
			else printf(" %c\n", board[i][j]);
		}
		if (i < ROW - 1)for (j = 0; j < COL; j++) {
			if (j < COL - 1)printf("---|");
			else printf("---\n");
		}
	}
}

void player(int a) {
	int i, j;
	printf("轮到玩家 %d :>",a);
	while (1) {
		printf("请输入坐标\n");
		scanf_s("%d %d", &i, &j);
		if (i > 3 || j > 3) {
			printf("坐标非法\n");
			continue;
		}
		if (board[i - 1][j - 1] != ' ') {
			printf("该位置已经被占有\n");
			continue;
		}
		if (a == 1) { board[i - 1][j - 1] = '*'; break; }
		else if (a == 2) { board[i - 1][j - 1] = '#'; break; }
	}
}

void computer() {
	
	int i = rand() % 3, j = rand() % 3;
	while (board[i][j] != ' ') {
		i = rand() % 3;
		j = rand() % 3;
	}
	board[i][j] = '#';
}

void menu2() {
	printf("**********   模式选择         *********\n");
	printf("**********   1.人机对战       *********\n");
	printf("**********   2.玩家对战玩家   *********\n");
	printf("**********   3.回到上一步     *********\n");
	printf("             请输入您的选择>          \n");
}

void menu1(){
	printf("********** 三子棋游戏 ************\n");
	printf("**********   1.play   ************\n");
	printf("**********   0.exit   ************\n");
	printf("**********************************\n");
	printf("         请输入您的选择>          \n");
}
void game(int a) {
	srand(time(NULL));
	init();
	while (1) {
		print();
		player(1);
		if (iswin() == '*') { print(); printf("玩家1赢了\n"); break;}
		if (iswin() == 0) { print(); printf("和棋\n"); break; }

		if (a == 1)computer();
		else if (a == 2) { print(); player(2); }
		if (iswin() == '#') { if(a==1)printf("你输了\n"); if(a==2)printf("玩家2赢了\n"); break;}
		if (iswin() == 0) { printf("和棋\n"); break; }
	}
	
}
void test(void) {
	int input;
	while(1){
		menu1();
		scanf_s("%d", &input);
		if (input == 0) {
			printf("退出游戏\n");
			break;
		}
		else if (input != 0 && input != 1) {
			printf("输入错误\n");
			continue;
		}
		menu2();
		while (1) {
			int a;
			scanf_s("%d", &a);
			if (a == 3)break;
			if (a != 1 && a != 2)printf("输入错误,请重新输入\n");
			else game(a); break;
		}
	}
	

}

​

这是game.h文件

#pragma once
void test(void);

这是test.c文件

#include"game.h"
int main() {
	test();
	return 0;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值