以下讨论的是三行三列的三子棋,如果想看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;
}