今天用vs2022写了三子棋,编写和调试花了很长时间,终于完成了。
源文件test.cpp
#include<stdio.h>
#include"game.h"
int main()
{
int input;
do
{
menu();
scanf_s("%d", &input);
srand((unsigned)time(NULL));
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出三子棋世界\n");
break;
default:
printf("请输入“1”玩游戏\n或者“2”退出游戏\n不要输其他字符");
}
} while (input - 2);
}
源文件game.cpp
#include<stdio.h>
#include"game.h"
void menu()
{
printf("***********************************\n");
printf("******少年,欢迎来到三子棋世界 ****\n");
printf("************* 1.play **************\n");
printf("************* 2.exit **************\n");
printf("***********************************\n");
}
void game()
{
printf("少年,你将对抗这世间最强的力量\n你,准备好了吗?\n");
char board[ROW][COL];
Initboard(board, ROW, COL);
Displayboard(board, ROW, COL);
while (1)
{
Playermove(board, ROW, COL);
Displayboard(board, ROW, COL);
if (IsWin(board, ROW, COL) == 0)
break;
Computerermove(board, ROW, COL);
Displayboard(board, ROW, COL);
if (IsWin(board, ROW, COL) == 0)
break;
}
printf("\n\n\n");
}
void Initboard(char board[ROW][COL],int row,int col)
{
int i, j;
for (i = 0;i < row;i++)
for (j = 0;j < col;j++)
board[i][j] = ' ';
}
void Displayboard(char board[ROW][COL], int row, int col)
{
int i, j,m;
for(i=0;i<row;i++)
{
for (j = 0;j < col;j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
if (j == col - 1)
printf("\n");
}
printf("\n");
if (i < row - 1)
{
for (m = 0;m < col - 1;m++)
printf("---|");
printf("---\n");;
}
}
}
void Playermove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("阁下,该你落子了\n");
while (1)
{
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[--x][--y] != ' ')
printf("抱歉,阁下,此地已被占据了,请重新落子\n");
else
{
board[x][y] = '*';
break;
}
}
else
printf("抱歉,阁下,只可落子于%d行%d列方格中\n请重新落子\n", ROW, COL);
}
}
void Computerermove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x, y;
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '@';
break;
}
}
}
int IsWin(char board[ROW][COL], int row, int col )
{
int i, j;
for (i = 0;i < row;i++)
if (board[i][0] == board[i][1] && board[i][2] == board[i][1] && board[i][1] != ' ')
{
if (board[i][1] == '*')
printf("谋士以身入局,举棋胜天半子!\n阁下运筹帷幄之中,决胜千里之外\n智勇双全,国士无双!\n");
else
printf("君不见长沟卧壑困风霜,时来屹立扶明堂\n阁下虽然惜败,但展现出的实力威震天下!\n");
return 0;
}
for (i = 0;i < col;i++)
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
if (board[0][i] == '*')
printf("谋士以身入局,举棋胜天半子!\n阁下运筹帷幄之中,决胜千里之外\n智勇双全,国士无双!\n");
else
printf("君不见长沟卧壑困风霜,时来屹立扶明堂\n阁下虽然惜败,但展现出的实力威震天下!\n");
return 0;
}
if (board[0][0] == board[1][1] && board[2][2] == board[0][0] && board[0][0] != ' ')
{
if (board[0][0] == '*')
printf("谋士以身入局,举棋胜天半子!\n阁下运筹帷幄之中,决胜千里之外\n智勇双全,国士无双!\n");
else
printf("君不见长沟卧壑困风霜,时来屹立扶明堂\n阁下虽然惜败,但展现出的实力威震天下!\n");
return 0;
}
if (board[2][0] == board[1][1] && board[2][0] == board[0][2] && board[2][0] != ' ')
{
if (board[1][1] == '*')
printf("谋士以身入局,举棋胜天半子!\n阁下运筹帷幄之中,决胜千里之外\n智勇双全,国士无双!\n");
else
printf("君不见长沟卧壑困风霜,时来屹立扶明堂\n阁下虽然惜败,但展现出的实力威震天下!\n");
return 0;
}
for (i = 0;i < row;i++)
for (j = 0;j < col;j++)
if (board[i][j] == ' ')
return 1;
printf("这局棋妙不可言!\n阁下虽然战平,但展现出的实力威震天下!\n");
return 0;
}
头文件game.h
#pragma once
#include<stdlib.h>
#include<time.h>
void menu();
#define ROW 3
#define COL 3
void game();
void Initboard(char board[ROW][COL],int,int);
void Displayboard(char board[ROW][COL], int, int);
void Playermove(char board[ROW][COL], int, int);
void Computerermove(char board[ROW][COL], int, int);
int IsWin(char board[ROW][COL], int, int);
中途调试了几个错误
- do{}while后面要加;
- rand()%2得到的是0或1,不是0,1,2,rand()%3得到的才是0,1,2