C語言實作井字棋
詳解在注釋上,直接貼代碼
這是頭檔案game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//為了方便修改棋盤大小以及玩法,可以修改為5玩五子棋
//初始化棋盤
void InitBoard(char board[ROW][COL],int row,int col);
//列印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//電腦下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//判斷游戲輸贏
//回傳四種的不同的狀態
//回傳*則玩家贏,回傳#則電腦贏,回傳C則繼續,回傳其他值則平局
char IsWin(char board[ROW][COL], int row, int col);
.c檔案
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)//對棋盤中的位置(二維陣列)進行初始化,置為空格
{
for (int i = 0; i < row; ++i)
{
for (int j = 0; j < col; ++j)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)//設定棋盤
{
for (int i = 0; i < row; ++i)
{
//列印資料
for (int j = 0; j < col; ++j){
printf(" %c ", board[i][j]);
if (j<row - 1)
printf("|");
}
printf("\n");
//列印分割行
if (i < row - 1){
for (int j = 0; j < col; ++j){
printf("---");
if (j<col-1)
printf("|");
}
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{
printf("玩家走\n");
int x, y;
while (1)
{
printf("請輸入坐標:>");
scanf("%d %d", &x, &y);
//判斷該坐標是否在棋盤內
if (x >= 1 && x <= row&&y >= 1 && y <= col)//不以0起始點為棋盤坐標,以1為起始點
{
if (board[x - 1][y - 1] == ' ')//如果該位置沒有下過棋子,則可以下棋
{
board[x - 1][y - 1] = '*';
break;//下完棋了,跳出回圈
}
else//如果下過了,則重新輸入坐標
{
printf("坐標被占用,請重新輸入\n");
}
}
else//不在棋盤內,重新輸入坐標
{
printf("坐標非法,超出范圍,請重新輸入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)//電腦下棋
{
printf("電腦走\n");
int x, y;
while (1){
x = rand() % row;//利用時間戳,產生隨機位置
y = rand() % col;
if (board[x][y] == ' ')//驗證該位置是否為空
{
board[x][y] = '#';
break;
}
}
}
char IsWin(char board[ROW][COL], int row, int col)//判斷輸贏
{
if (board[0][0] == board[0][1] && board[0][2] == board[0][1] && board[0][1]!=' ')
return board[0][0];
if(board[1][0] == board[1][1] && board[1][2] == board[1][1] && board[1][1] != ' ')
return board[1][0];
if (board[2][0] == board[2][1] && board[2][2] == board[2][1] && board[2][1] != ' ')
return board[2][0];
if (board[0][0] == board[1][0] && board[2][0] == board[1][0] && board[0][0] != ' ')
return board[0][0];
if (board[0][1] == board[1][1] && board[2][1] == board[1][1] && board[0][1] != ' ')
return board[0][1];
if (board[0][2] == board[1][2] && board[2][2] == board[1][2] && board[0][2] != ' ')
return board[0][2];
if(board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[1][1] != ' ')
return board[0][0];
if(board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[1][1] != ' ')
return board[0][2];
)//因為是三子棋,所以這里直接暴力核查
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
if (board[i][j] == ' ')
return 'c';//既沒有人獲勝,也沒有平局,則繼續下棋
return 0;//平局
}
主函式
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
char board[ROW][COL];//創建棋盤
//初始化棋盤
InitBoard(board,ROW,COL);
//列印棋盤
DisplayBoard(board, ROW, COL);
char ret;//用于判斷是否結束
//下棋
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
DisplayBoard(board, ROW, COL);//列印棋盤
ret = IsWin(board, ROW, COL);//判斷是否有人獲勝或者平局
if (ret != 'c')
{
break;
}
ComputerMove(board, ROW, COL);//電腦下棋
DisplayBoard(board, ROW, COL);//列印棋盤
ret = IsWin(board, ROW, COL);//判斷是否有人獲勝或者平局
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("你贏了\n");
}
else if (ret == '#')
{
printf("電腦贏了,你輸了\n");
}
else
{
printf("平局\n");
}
}
void menu()
{
printf("**********************************\n");
printf("************ 1. van游戲 ********\n");
printf("************ 0. 不van了 ********\n");
printf("**********************************\n");
}
int main()
{
srand((unsigned int)time(NULL));//時間戳
do//選用do while回圈
{
menu();//選單
printf("請選擇");
int input = 0;
scanf("%d",&input);
switch (input)//對于輸入值進行判斷,可見menu()
{
case 1:
printf("三字棋\n");
game();
break;
case 0:
printf("那就不van了\n");
break;
default://選擇錯誤
printf("給爺重選\n");
}
} while (1);
return 0;
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290704.html
標籤:其他
上一篇:【大廠求職必看】太強了!Tomcat執行緒模型全網最清晰講解!
下一篇:博客評論新規則,望周知
